我有一个使用declarative partitioning表进行分区按日期范围表(w00t!) - 在我的情况一年。为什么Postgres不会过滤我的日期范围分区?
当我查询对阵表 - SELECT * FROM tbl WHERE date > date '2016-01-01'
,它的工作原理完全如预期;只扫描包含较新数据的表格。
当我使用变量或函数(CURRENT_DATE
,NOW()
等)指定日期时,EXPLAIN
表示它扫描每个分区。
东西,像预期的那样:
SELECT * FROM tbl WHERE date > date '2016-01-01'
--
SELECT * FROM tbl WHERE date > '2016-01-01'::date
的事情,不必要的扫描所有分区:
SELECT * FROM tbl WHERE date > CURRENT_DATE
--
SELECT * FROM tbl WHERE date > NOW()
--
SELECT * FROM tbl WHERE date > (NOW() - 365)::date
--
SELECT * FROM tbl WHERE date > (SELECT (NOW()::date - 365)::date AS d)
-- Even CTEs are no dice:
WITH a AS (SELECT CURRENT_DATE AS d)
SELECT * FROM tbl, a WHERE date > a.d
-- Same with JOINs
SELECT w.*
FROM (CURRENT_DATE - 365 as d) a
LEFT JOIN wtf w ON w.date > a.d
...等
我与其他运营商相比,相同的行为 - =
, <
等
文档说,我不需要在字段上的idx(我不反对)。我添加了一个以防万一,并没有帮助。
为什么会这样,我能做些什么来阻止它(最好是不添加复杂到简单的查询)?
请** [编辑] **你的问题,并添加'创建表'所讨论的表的语句(包括所有索引)以及使用**'explain(analyze,verbose)'**生成的执行计划。 [**格式化文本**](http://stackoverflow.com/help/formatting)请,[无屏幕截图](http://meta.stackoverflow.com/questions/285551/why-may-i-not当问问题/ 285557#285557) –
这是因为规划师不知道now()的输出,直到执行。 – JustMe
谢谢@JustMe - 你会发布这个作为答案,所以我可以接受它,并删除不必要的SQL和输出的解释,所以这可以帮助其他人呢? – onwsk8r