Rambler's Top100 Секционирование таблиц в Postgres
  Rambler's Top100
С.Зубарев
Секционирование таблиц в 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 );

   Тем не менее если мы выполним запрос
 select * from request;
то получим все данные со всех дочерних табличек. Поэтому можно работать с таблицей request как с обычной таблицей, содержащей в себе все данные. Однако можно извлекать данные непосредственно из дочерних табличек (request***), что может сильно повысить производительность системы.
Программные продукты

Открытые коды