PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm sắc nét dữ liệu của bạn với PostgreSQL 11

Phiên bản 10 của PostgreSQL đã thêm phân vùng bảng khai báo Tính năng. Trong phiên bản 11 (hiện đang trong giai đoạn thử nghiệm), bạn có thể kết hợp tính năng này với trình ghi dữ liệu nước ngoài , cung cấp một cơ chế để chia nhỏ các bảng của bạn trên nhiều máy chủPostgreSQL.

Phân vùng Khai báo

Hãy xem xét một bảng lưu trữ nhiệt độ tối thiểu và tối đa hàng ngày cho mỗi ngày:

CREATE TABLE temperatures (
    at      date,
    city    text,
    mintemp integer,
    maxtemp integer
);

Thông số bảng cố ý không có ràng buộc cột và khóa chính để giữ cho mọi thứ đơn giản - chúng tôi sẽ thêm chúng sau.

Rất thường thấy rằng trong nhiều ứng dụng, dữ liệu gần đây nhất được truy cập thường xuyên hơn. Hãy suy nghĩ về năm tài chính hiện tại, tháng này, tháng cuối cùng, v.v. Khi bảng “nhiệt độ” của chúng ta phát triển, việc chuyển dữ liệu cũ sang một bảng khác có cùng cấu trúc là rất hợp lý. Chúng tôi có thể lấy ví dụ, dothis:

CREATE TABLE temperatures_2017 (LIKE temperatures);
INSERT INTO temperatures_2017 SELECT * FROM temperatures WHERE
	extract(year from at) = 2017;
DELETE FROM temperatures WHERE extract(year from at) = 2017;

để chuyển tất cả các mục từ năm 2017 sang một bảng khác. Điều này làm cho bảng “nhiệt độ” của chúng nhỏ hơn và nhanh hơn để ứng dụng làm việc. Như một phần thưởng, nếu bây giờ bạn cần xóa dữ liệu cũ, bạn có thể làm như vậy mà không làm chậm quá trình chèn dữ liệu đến vào bảng chính / hiện tại vì các cơ sở dữ liệu cũ trong một bảng khác.

Nhưng có nhiều bảng riêng biệt có nghĩa là mã ứng dụng bây giờ sẽ nhanh chóng thay đổi. Nếu nó phải truy cập dữ liệu cũ hơn, chẳng hạn như lấy nhiệt độ tối thiểu và tối đa hàng năm của một thành phố, thì bây giờ nó phải tìm ra những bảng nào hiện diện trong sơ đồ, truy vấn từng bảng và kết hợp kết quả từ mỗi bảng. Có thể làm điều này mà không cần thay đổi mã ứng dụng không?

Phân vùng làm cho điều này có thể. Trong PostgreSQL 10, bạn có thể tạo bảng "nhiệt độ" như sau:

CREATE TABLE temperatures (
    at      date,
    city    text,
    mintemp integer,
    maxtemp integer
)
PARTITION BY RANGE (at);

Điều này làm cho “nhiệt độ” trở thành bảng chính phân vùng và nói với PostgreSQL rằng chúng ta sẽ tạo nhiều bảng được phân vùng lưu trữ dữ liệu không chồng chéo, mỗi bảng có một bộ giá trị “at” khác nhau. Bản thân bảng chính không chứa bất kỳ dữ liệu nào, nhưng có thể được truy vấn từ và được ứng dụng chèn vào - điều này không biết các phân vùng con đang giữ dữ liệu thực tế.

Và đây là các phân vùng của chúng tôi:

CREATE TABLE temperatures_2017
    PARTITION OF temperatures
    FOR VALUES FROM ('2017-01-01') TO ('2018-01-01');

CREATE TABLE temperatures_2018
    PARTITION OF temperatures
    FOR VALUES FROM ('2018-01-01') TO ('2019-01-01');

Bây giờ chúng tôi có hai bảng, một bảng sẽ lưu trữ dữ liệu cho năm 2017 và một bảng khác cho năm 2018. Lưu ý rằng giá trị “from” được bao gồm, nhưng giá trị “đến” thì không. Hãy dùng thử:

temp=# INSERT INTO temperatures (at, city, mintemp, maxtemp)
temp-#        VALUES ('2018-08-03', 'London', 63, 90);
INSERT 0 1
temp=# INSERT INTO temperatures (at, city, mintemp, maxtemp)
temp-#        VALUES ('2017-08-03', 'London', 59, 70);
INSERT 0 1
temp=# SELECT * FROM temperatures;
     at     |  city  | mintemp | maxtemp
------------+--------+---------+---------
 2017-08-03 | London |      59 |      70
 2018-08-03 | London |      63 |      90
(2 rows)

temp=# SELECT * FROM temperatures_2017;
     at     |  city  | mintemp | maxtemp
------------+--------+---------+---------
 2017-08-03 | London |      59 |      70
(1 row)

temp=# SELECT * FROM temperatures_2018;
     at     |  city  | mintemp | maxtemp
------------+--------+---------+---------
 2018-08-03 | London |      63 |      90
(1 row)

“Ứng dụng” có thể chèn và chọn từ bảng chính, butPostgreSQL định tuyến dữ liệu thực tế vào các bảng con thích hợp. (Ồ vàBTW, những nhiệt độ đó là thật!)

Chỉ mục và Ràng buộc

Các chỉ mục và ràng buộc bảng và cột thực sự được xác định ở cấp độ phân vùng được, vì đó là nơi chứa dữ liệu thực tế. Bạn có thể đặt tính năng trong quá trình tạo bảng phân vùng:

CREATE TABLE temperatures_2017
    PARTITION OF temperatures (
        mintemp NOT NULL,
        maxtemp NOT NULL,
        CHECK (mintemp <= maxtemp),
        PRIMARY KEY (at, city)
    )
    FOR VALUES FROM ('2017-01-01') TO ('2018-01-01');

PostgreSQL 11 cho phép bạn xác định các chỉ mục trên bảng mẹ và sẽ tạo các chỉ mục trên các bảng phân vùng hiện tại và trong tương lai. Đọc thêm tại đây.

Trình gói dữ liệu nước ngoài

Chức năng bao bọc dữ liệu nước ngoài đã tồn tại trong Postgres một thời gian. PostgreSQL cho phép bạn truy cập dữ liệu được lưu trữ trong các máy chủ và hệ thống khác bằng cơ chế này. Điều chúng tôi quan tâm là “postgres_fdw”, là thứ sẽ cho phép chúng tôi truy cập một máy chủ Postgres từ một máy chủ khác.

“Postgres_fdw” là một tiện ích mở rộng có trong bản phân phối chuẩn, có thể được cài đặt bằng lệnh CREATE EXTENSION thông thường:

CREATE EXTENSION postgres_fdw;

Giả sử bạn có một máy chủ PostgreSQL khác “box2” với cơ sở dữ liệu được gọi là “box2db”. Bạn có thể tạo một “máy chủ nước ngoài” cho việc này:

CREATE SERVER box2 FOREIGN DATA WRAPPER postgres_fdw
    OPTIONS (host 'box2', dbname 'box2db');

Hãy cũng ánh xạ người dùng của chúng tôi “alice” (người dùng mà bạn đang đăng nhập) với người dùng box2 “box2alice”. Điều này cho phép “alice” là “box2alice” khi truy cập các bảng từ xa:

CREATE USER MAPPING FOR alice SERVER box2
    OPTIONS (user 'box2alice');

Bây giờ bạn có thể truy cập các bảng (cũng như các khung nhìn, matview, v.v.) trên box2. Đầu tiên, tạo bảng trên box2, sau đó là “bảng ngoài” trên máy chủ của bạn. Các tabledoes nước ngoài không chứa bất kỳ dữ liệu thực tế nào, nhưng phục vụ như một proxy để truy cập tableon box2.

-- on box2
CREATE TABLE foo (a int);

-- on your server
IMPORT FOREIGN SCHEMA public LIMIT TO (foo)
    FROM SERVER box2 INTO public;

Bảng ngoại trong máy chủ của bạn có thể tham gia giao dịch giống như các bảng bình thường. Các ứng dụng không nhất thiết phải biết rằng các bảng ngoại trừ là cục bộ hay nước ngoài - mặc dù nếu ứng dụng của bạn chạy một SELECT có khả năng kéo nhiều hàng từ một bảng ngoại thì nó có thể làm chậm mọi thứ. và tổng hợp vào máy chủ từ xa.

Kết hợp Phân vùng và FDW

Và bây giờ là phần thú vị:thiết lập phân vùng trên máy chủ từ xa.

Đầu tiên, hãy tạo bảng phân vùng vật lý trên box2:

-- on box2
CREATE TABLE temperatures_2016 (
    at      date,
    city    text,
    mintemp integer,
    maxtemp integer
);

Và sau đó tạo phân vùng trên máy chủ của bạn, dưới dạng một bảng ngoại:

CREATE FOREIGN TABLE temperatures_2016
    PARTITION OF temperatures
    FOR VALUES FROM ('2016-01-01') TO ('2017-01-01')
    SERVER box2;

Bây giờ bạn có thể chèn và truy vấn từ máy chủ của riêng mình:

temp=# INSERT INTO temperatures (at, city, mintemp, maxtemp)
temp-#     VALUES ('2016-08-03', 'London', 63, 73);
INSERT 0 1
temp=# SELECT * FROM temperatures ORDER BY at;
     at     |  city  | mintemp | maxtemp
------------+--------+---------+---------
 2016-08-03 | London |      63 |      73
 2017-08-03 | London |      59 |      70
 2018-08-03 | London |      63 |      90
(3 rows)

temp=# SELECT * FROM temperatures_2016;
     at     |  city  | mintemp | maxtemp
------------+--------+---------+---------
 2016-08-03 | London |      63 |      73
(1 row)

Đây là bạn có nó! Có thể chèn các hàng vào phân vùng từ xa là phiên bản mới 11. Với tính năng này, giờ đây bạn có thể phân chia dữ liệu của mình một cách hợp lý (phân vùng) và vật lý (FDW).

Quản lý dữ liệu

Các lệnh như VACUUM và ANALYZE hoạt động như bạn mong đợi với bảng chính phân vùng– tất cả các bảng con cục bộ đều phải tuân theo VACUUM và ANALYZE. Các phân vùng có thể được tạo nền, dữ liệu được xử lý mà không có ràng buộc về phân vùng và sau đó được xử lý. Bản thân các bảng con có thể được phân vùng.

Việc di chuyển dữ liệu xung quanh (“resharding”) có thể được thực hiện bằng các câu lệnh SQL thông thường (chèn, xóa, sao chép, v.v.). Có thể tạo các chỉ mục và trình kích hoạt phân vùng-cục bộ.

Việc thêm dự phòng vào các phân đoạn của bạn có thể dễ dàng đạt được với sự sao chép logic hoặc phân luồng.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để bạn tạo một người dùng chỉ đọc trong PostgreSQL?

  2. nhầm lẫn cổng postgresql 5433 hay 5432?

  3. Truy vấn cập nhật đơn giản chậm trên cơ sở dữ liệu PostgreSQL với 3 triệu hàng

  4. pgDash Diagnostics Alternatives - PostgreSQL Query Management with ClusterControl

  5. Chuyển đổi một kết quả sql để một cột chuyển sang nhiều cột