Ответ 1
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. Их продукты очень хорошие, но я не думаю, что он будет работать на стандартном постгресле.