我有一个存储在 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
使用检查约束应该花费很少的时间,需要一个多小时,因为查询计划程序不使用检查约束。
根据 PostgreSQL wiki(本页的最后一部分),这是一个已知问题,将在下一个版本中修复。
是否有一个很好的技巧可以使查询计划器利用子表的检查约束和索引进行max()
查询min()
?
谢谢,
亚当