У меня есть огромная секционированная таблица, хранящаяся в таблице 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()
?
Спасибо,
Адам