3

这些表在 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 不能与函数和分区表一起正常工作。

有人知道解决此问题的方法吗?

4

1 回答 1

1

问题是 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 ...'
于 2012-12-04T15:00:42.840 回答