我刚刚重组了我的数据库,使用PostgreSQL 8.2中的partitioning。现在我遇到查询性能问题:多分区Postgres表的高效查询
SELECT *
FROM my_table
WHERE time_stamp >= '2010-02-10' and time_stamp < '2010-02-11'
ORDER BY id DESC
LIMIT 100;
表中有4500万行。在分区之前,这将使用反向索引扫描并在达到极限时立即停止。
分区后(在time_stamp范围内),Postgres会对主表和相关分区执行完整索引扫描,并合并结果,对它们进行排序,然后应用限制。这需要太长时间。
我可以解决这个问题:
SELECT * FROM (
SELECT *
FROM my_table_part_a
WHERE time_stamp >= '2010-02-10' and time_stamp < '2010-02-11'
ORDER BY id DESC
LIMIT 100) t
UNION ALL
SELECT * FROM (
SELECT *
FROM my_table_part_b
WHERE time_stamp >= '2010-02-10' and time_stamp < '2010-02-11'
ORDER BY id DESC
LIMIT 100) t
UNION ALL
... and so on ...
ORDER BY id DESC
LIMIT 100
这跑得快。时间戳超出范围的分区甚至不包括在查询计划中。
我的问题是:是否有某种暗示或语法,我可以在Postgres的8.2用于阻止查询筹办者通过扫描整个表,但仍使用简单的语法,只是指主表?
基本上,我是否可以避免动态构建每个正在被定义的分区的UNION查询的痛苦?
编辑:我已经启用(感谢@Vinko Vrsalovic)
8.2?真?在做任何事情之前,你应该考虑升级到支持(和当前)的Postgres版本(9.2是当前的版本) – 2013-04-01 15:57:50