Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PostgreSQL分区表上使用函数时,它会执行完整的表扫描_Sql_Enterprisedb - Fatal编程技术网

在PostgreSQL分区表上使用函数时,它会执行完整的表扫描

在PostgreSQL分区表上使用函数时,它会执行完整的表扫描,sql,enterprisedb,Sql,Enterprisedb,这些表在PostgreSQL 9数据库中进行分区。当我运行以下脚本时: select * from node_channel_summary where report_date between '2012-11-01' AND '2012-11-02'; 它从正确的表发送数据,而不进行完整的表扫描。但如果我运行此脚本: select * from node_channel_summary where report_date between trunc(sysdate)-30 AND trunc

这些表在PostgreSQL 9数据库中进行分区。当我运行以下脚本时:

select * from node_channel_summary
where report_date between '2012-11-01' AND '2012-11-02';
它从正确的表发送数据,而不进行完整的表扫描。但如果我运行此脚本:

select * from node_channel_summary
where report_date between trunc(sysdate)-30 AND trunc(sysdate)-29;
在这种情况下,它会执行性能不可接受的全表扫描。-30和-29将由参数替换

在做了一些研究之后,Postgres无法正确处理函数和分区表


有人知道如何解决这个问题吗?

问题是,在编译函数时,PostgreSQL会计算并缓存执行计划。这对于分区表是一个问题,因为PostgreSQL使用查询计划器来消除分区。您可以通过将查询指定为字符串,强制PostgreSQL在运行时重新分析和规划查询来解决此问题:

FOR row IN EXECUTE 'select * from node_channel_summary where report_date between trunc(sysdate)-30 AND trunc(sysdate)-29' LOOP
    -- ...
END LOOP;

-- or
RETURN QUERY EXECUTE 'select * from ...'

您是否使用表继承来实现分区?什么是
trunc()
sysdate
?它们当然不是PostgreSQL的东西……我想我们实际上是在谈论:基本上是PostgreSQL,但支持各种Oracle功能,包括。正确的标记要求您只包含enterprisedb,而不是PostgreSQL,以免像显然已经做过的那样混淆人们。有什么原因我不能移除那个标签吗?(也就是说,我将这样做,恢复它,如果你必须恢复它,请留下评论)我是PostgreSQL世界的新手。我正在使用EnterpriseDB运行pgAdmin III中的SQL脚本。函数
trunc()
sysdate
在我的SQL脚本中使用,并按预期工作。除非你有更好的方法在postgreSQL中获取今天的日期。