PostgreSQL позволяет разделять двумя разными способами. Один по диапазону, а другой по списку. Оба используют наследование таблиц для создания разделов.
Разделение по диапазону, обычно диапазон дат, является наиболее распространенным, но разделение по списку может быть полезным, если переменные, являющиеся разделом, являются статическими и не перекошены.
Секционирование выполняется с помощью наследования таблиц, поэтому первое, что нужно сделать, это настроить новые дочерние таблицы.
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);
Тогда для удаления данных в правильных таблицах необходимо использовать правила или триггеры.
При массовых обновлениях правила работают быстрее, запускаются при отдельных обновлениях, а также проще в обслуживании. Вот пример триггера.
CREATE TRIGGER insert_measurement_trigger
BEFORE INSERT ON measurement
FOR EACH ROW EXECUTE PROCEDURE measurement_insert_trigger();
и триггерная функция для вставки
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;
Эти примеры являются упрощенными версиями документации postgresql для удобства чтения.
Я не знаком с pgpool2, но gridsql - это коммерческий продукт, разработанный для EnterpriseDB, коммерческой базы данных, построенной поверх postgresql. Их продукты очень хороши, но я не думаю, что он будет работать на стандартном postgresl.