PostgreSQL cho phép phân vùng theo hai cách khác nhau. Một là theo phạm vi và khác là theo danh sách. Cả hai đều sử dụng kế thừa bảng để thực hiện phân vùng.
Phân vùng theo phạm vi, thường là phạm vi ngày, là phổ biến nhất, nhưng phân vùng theo danh sách có thể hữu ích nếu các biến của phân vùng là tĩnh và không bị lệch.
Việc phân vùng được thực hiện với tính năng kế thừa bảng nên việc đầu tiên cần làm là thiết lập các bảng con mới.
CREATE TABLE measurement (
x int not null,
y date not null,
z int
);
CREATE TABLE measurement_y2006 (
CHECK ( logdate >= DATE '2006-01-01' AND logdate < DATE '2007-01-01' )
) INHERITS (measurement);
CREATE TABLE measurement_y2007 (
CHECK ( logdate >= DATE '2007-01-01' AND logdate < DATE '2008-01-01' )
) INHERITS (measurement);
Sau đó, quy tắc hoặc trình kích hoạt cần được sử dụng để đưa dữ liệu vào các bảng chính xác. Quy tắc nhanh hơn khi cập nhật hàng loạt, kích hoạt trên các bản cập nhật đơn lẻ cũng như dễ bảo trì hơn. Đây là một trình kích hoạt mẫu.
CREATE TRIGGER insert_measurement_trigger
BEFORE INSERT ON measurement
FOR EACH ROW EXECUTE PROCEDURE measurement_insert_trigger();
và chức năng kích hoạt để thực hiện việc chèn
CREATE OR REPLACE FUNCTION measurement_insert_trigger()
RETURNS TRIGGER AS $$
BEGIN
IF ( NEW.logdate >= DATE '2006-01-01'
AND NEW.logdate < DATE '2007-01-01' ) THEN
INSERT INTO measurement_y2006 VALUES (NEW.*);
ELSIF ( NEW.logdate >= DATE '2007-01-01'
AND NEW.logdate < DATE '2008-01-01' ) THEN
INSERT INTO measurement_y2006m03 VALUES (NEW.*);
ELSE
RAISE EXCEPTION 'Date out of range.';
END IF;
RETURN NULL;
END;
$$
LANGUAGE plpgsql;
Những ví dụ này là phiên bản đơn giản hóa của tài liệu postgresql để dễ đọc hơn.
Tôi không quen thuộc với pgpool2, nhưng gridsql là một sản phẩm thương mại được thiết kế cho EnterpriseDB, một cơ sở dữ liệu thương mại được xây dựng trên postgresql. Sản phẩm của họ rất tốt, nhưng tôi không nghĩ rằng nó sẽ hoạt động trên postgresl tiêu chuẩn.