PostgreSQL テーブルに巨大なパーティション テーブルが格納されています。各子テーブルには、インデックスとその ID に対するチェック制約があります。たとえば、(わかりやすくするために無関係な詳細は削除されています)。
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
あり、チェック制約を使用するとほとんど時間がかからないはずですが、クエリ プランナーがチェック制約を使用しないため、1 時間以上かかります。
PostgreSQL wiki (このページの最後のセクション) によると、これは既知の問題であり、次のバージョンで修正される予定です。
max()
クエリ プランナーがチェック制約とクエリのサブテーブルのインデックスを利用するようにする良いハックはありますmin()
か?
ありがとう、
アダム