我刚刚重组了我的数据库以使用Postgres 8.2 中的分区。现在我遇到了查询性能问题:
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)