Разделы PostgreSQL 9.3 не работают

У меня есть таблица, е, с ежедневной настройкой разделов диапазонов. Основная таблица и таблицы разделов определены таким образом.

CREATE TABLE e (
  toi TIMESTAMP WITH TIME ZONE
WITH (
 OIDS=TRUE
);

CREATE TABLE e_20150501
CONSTRAINT e_20150501_toi_chk CHECK (toi >= ‘2015-05-01’::DATE AND toi < ‘2015-  05-02’::DATE)
INHERITS (e)
WITH (
  OIDS=TRUE
);

По какой-то причине, независимо от того, как я создаю предложение WHERE в операторах SELECT, я не могу получить план, который не сканировал бы каждую отдельную таблицу разделов?

Я пробовал …

WHERE toi::DATE >= ‘2015-05-01’::DATE AND toi::DATE <= ‘2015-05-02’::DATE;

WHERE toi >= to_timestamp(‘2015-05-01 12:30:57’, ‘YYYY-MM-DD HH24:MI:SS’) AND toi <= to_timestamp(‘2015-05-02 12:30:57’, ‘YYYY-MM-DD HH24:MI:SS’);

Что мне не хватает?


person CycleGeek    schedule 10.06.2015    source источник
comment
Вы смешиваете даты и временные метки. Вы должны определить контрольное ограничение, чтобы также использовать метку времени: CHECK (toi >= timestamp '2015-05-01 00:00:00' ... А затем также использовать метки времени в своем запросе.   -  person a_horse_with_no_name    schedule 10.06.2015
comment
Значит, я должен так определить свою таблицу разделов? СОЗДАТЬ ТАБЛИЦУ e_20150501 ОГРАНИЧЕНИЕ e_20150501_toi_chk ПРОВЕРИТЬ (toi ›= '2015-05-01 00:00:00' :: TIMESTAMP С ЧАСОВЫМ ПОЯСОМ И toi‹ '2015-05-02 00:00:00' :: TIMESTAMP WITH TIME ZONE) НАСЛЕДУЕТ (e) ОТ (OIDS = TRUE);   -  person CycleGeek    schedule 10.06.2015
comment
Я протестировал это и, похоже, решил мои проблемы. Могу ли я просто отбросить существующее ограничение и добавить обновленное в таблицы разделов?   -  person CycleGeek    schedule 10.06.2015


Ответы (2)


Вам не хватает SET constraint_exclusion = on;, если он не установлен в определении вашей таблицы, все запросы будут сканировать все разделы таблицы.

см. руководство здесь, раздел 5.9.4. Разделение и исключение ограничений

person John    schedule 10.06.2015
comment
На самом деле включать его, скорее всего, плохая идея. Режим partition по умолчанию является предпочтительным (см. В конце 5.9.4). - person pozs; 10.06.2015
comment
В postgresql.conf для него установлено значение РАЗДЕЛ, поэтому я не думаю, что проблема в этом. - person CycleGeek; 10.06.2015

Первый комментарий к моему исходному посту был правильным.

Вы смешиваете даты и временные метки. Вы должны определить контрольное ограничение, чтобы также использовать метку времени: CHECK (toi >= timestamp '2015-05-01 00:00:00' ... А затем также использовать метки времени в своем запросе. - a_horse_with_no_name

person CycleGeek    schedule 10.06.2015