我有一個巨大的分區表存儲在PostgreSQL表。每個子表對其id具有索引和檢查約束,例如, (爲了清楚起見移除無關deatils):PostgreSQL +表分區:低效max()和min()
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維基(this page的最後部分),這是一個已知問題,將在下一個版本中解決。
是否有一個很好的黑客會使查詢規劃器利用檢查約束和子表的索引max()
和min()
查詢?
感謝,
亞當
你能展示你的執行計劃嗎? – 2010-10-06 16:57:35