С.Зубарев
Секционирование таблиц в Postgres
Рассмотрим таблицу request:
CREATE TABLE request
(
id serial NOT NULL,
text character varying(255),
date date NOT NULL,
CONSTRAINT request_pkey PRIMARY KEY (id)
);
Будем секционировать ее по временному признаку: каждый месяц (по полю date) должен записываться отдельно. Создадим "дочернюю" табличку request200801, наследующую все поля базовой таблицы request, куда будем записывать все данные за январь 2008:
create table request200801() inherits (request);
Осталось добавить правило (rule) согласно которому все данные, записываемые в таблицу request за январь 2008 будут автоматически записываться в request200801:
CREATE RULE request_insert_200801 AS
ON INSERT TO request WHERE
( date >= DATE '2008-01-01' AND date < DATE '2008-02-01' )
DO INSTEAD
INSERT INTO request200801 VALUES ( NEW.id,
NEW.text,
NEW.date );
После этого все данные за январь 2008 будут записываться в таблицу request200801. Для других месяцев действуем аналогично. Например для февраля 2008:
create table request200802() inherits (request);
CREATE RULE request_insert_200802 AS
ON INSERT TO request WHERE
( date >= DATE '2008-02-01' AND date < DATE '2008-03-01' )
DO INSTEAD
INSERT INTO request200802 VALUES ( NEW.id,
NEW.text,
NEW.date );
Тем не менее если мы выполним запрос
то получим все данные со всех дочерних табличек. Поэтому можно работать с таблицей request как с обычной таблицей, содержащей в себе все данные. Однако можно извлекать данные непосредственно из дочерних табличек (request***), что может сильно повысить производительность системы.