У меня есть огромная секционированная таблица, хранящаяся в таблице PostgreSQL. Каждая дочерняя таблица имеет индекс и проверочное ограничение для своего идентификатора, например, (несущественные детали удалены для ясности):
Master table: points
Column | Type | Modifiers
---------------+-----------------------------+------------------------
id | bigint |
creation_time | timestamp without time zone |
the_geom | geometry |
Sub-table points_01
Column | Type | Modifiers
---------------+-----------------------------+-------------------------
id | bigint |
creation_time | timestamp without time zone |
the_geom | geometry |
Indexes:
"points_01_pkey" PRIMARY KEY, btree (id)
"points_01_creation_time_idx" btree (creation_time)
"points_01_the_geom_idx" gist (the_geom) CLUSTER
Check constraints:
"enforce_srid_the_geom" CHECK (srid(the_geom) = 4326)
"id_gps_points_2010_08_22__14_47_04_check"
CHECK (id >= 1000000::bigint AND id <= 2000000::bigint)
Теперь
SELECT max(id) FROM points_01
мгновенно, но:
SELECT max(id) FROM points
, которая является основной таблицей для points_01 .. points_60
и должна занимать очень мало времени при использовании проверочных ограничений, занимает больше часа, поскольку планировщик запросов не использует проверочные ограничения.
Согласно вики PostgreSQL (последний раздел этой страницы ), это известная проблема, которая будет исправлена в следующих версиях.
Есть ли хороший хак, который заставит планировщика запросов использовать проверочные ограничения и индексы вложенных таблиц для max()
и min()
запросов?
Спасибо
Адам