Postgresql 为什么Postgres不过滤我的日期范围分区?

Postgresql 为什么Postgres不过滤我的日期范围分区?,postgresql,database-partitioning,Postgresql,Database Partitioning,我有一张使用w00t的桌子!按日期范围对表进行分区——在我的例子中是一年 当我查询表格时,从tbl中选择*其中日期>日期'2016-01-01',它完全按照预期工作;只扫描包含较新数据的表 当我使用变量或函数CURRENT_date、NOW等指定日期时,EXPLAIN会扫描每个分区 按预期工作的事物: 从tbl中选择*其中日期>日期“2016-01-01” - 从tbl中选择*日期>'2016-01-01'::日期 不必要地扫描所有分区的内容: 从tbl中选择*其中日期>当前日期 - 选择*FR

我有一张使用w00t的桌子!按日期范围对表进行分区——在我的例子中是一年

当我查询表格时,从tbl中选择*其中日期>日期'2016-01-01',它完全按照预期工作;只扫描包含较新数据的表

当我使用变量或函数CURRENT_date、NOW等指定日期时,EXPLAIN会扫描每个分区

按预期工作的事物:

从tbl中选择*其中日期>日期“2016-01-01” - 从tbl中选择*日期>'2016-01-01'::日期 不必要地扫描所有分区的内容:

从tbl中选择*其中日期>当前日期 - 选择*FROM tbl WHERE date>NOW - 选择*FROM tbl WHERE date>NOW-365::date - 从tbl中选择*其中日期>选择现在::日期-365::日期为d -即使CTE也不是骰子: 以a为单位选择当前日期为d 从tbl中选择*,其中日期>a.d -连接也一样 选择w* 自当前_日期起-365日为日 从w.date>a.d.开始加入wtf 等等

我得到了与其他比较运算符相同的行为-=, 感谢JustMe回答这个问题-参见OP上的评论

问题在于何时根据FROM评估NOW和CURRENT_时间戳;当您尝试在join ala中进行筛选时,您会看到相同的问题,其中join_table.a>from_table.b

假设今天是1970年1月1日,这些查询

从my_stuff中选择*日期>现在::日期; - 从my_stuff中选择*日期>'1970-01-01'::日期; 将必然产生相同的结果集,但不一定以相同的方式进行评估

这就是为什么会发生这种情况,不幸的是,似乎没有一个简单的方法来阻止它。函数似乎是最佳选项:

创建或替换函数myfunc 返回tbl的集合 语言“plpgsql” 作为$$ 声明 n日期:=当前_日期-365; 开始 返回查询执行$a$ 从tbl中选择* 其中日期>1美元; $a$使用n; 完(元);
您可以通过将RETURNS setof tbl更改为RETURNS setof text并选择。。。要解释,请选择…

请回答您的问题,并为有问题的表添加create table语句,包括所有索引和使用EXPLAIN ANALYSE、verbose生成的执行计划。拜托,那是因为计划者直到执行才知道现在的输出。谢谢@JustMe-你能将此作为一个答案发布,这样我就可以接受它,并删除不必要的SQL和EXPLAIN的输出,这样也可以帮助其他人吗?