PostgreSQL postgres_fdw在使用当前_日期-1但不使用硬编码日期时,在大型外部表上查询速度非常慢
我正在使用postgres_fdw连接到另一个PostgreSQL数据库。有时查询的性能可以正常工作,但有时查询可能需要异常长的时间。我遇到了一个问题,如果我使用函数CURRENT_DATE,查询需要约30分钟,但如果我硬编码相同的日期,查询需要1秒钟。查看这两个查询的解释分析,当我使用CURRENT_DATE时,它会扫描整个外部表,但当我硬编码日期时,它只扫描它需要的行。这就好像使用当前的_日期不使用表索引,但硬编码日期会这样做。但是,很难知道情况是否如此,因为解释分析只是将两个查询都列为“外来扫描”。为什么这两个查询的执行时间如此不同 以下是我正在比较的两个查询:PostgreSQL postgres_fdw在使用当前_日期-1但不使用硬编码日期时,在大型外部表上查询速度非常慢,postgresql,query-optimization,query-performance,foreign-data-wrapper,postgres-fdw,Postgresql,Query Optimization,Query Performance,Foreign Data Wrapper,Postgres Fdw,我正在使用postgres_fdw连接到另一个PostgreSQL数据库。有时查询的性能可以正常工作,但有时查询可能需要异常长的时间。我遇到了一个问题,如果我使用函数CURRENT_DATE,查询需要约30分钟,但如果我硬编码相同的日期,查询需要1秒钟。查看这两个查询的解释分析,当我使用CURRENT_DATE时,它会扫描整个外部表,但当我硬编码日期时,它只扫描它需要的行。这就好像使用当前的_日期不使用表索引,但硬编码日期会这样做。但是,很难知道情况是否如此,因为解释分析只是将两个查询都列为“外
SELECT *
FROM pjm.prices
WHERE pricedate = CURRENT_DATE - 1
ORDER BY pricedate, hour, node_id;
以下是分别对每个查询的解释分析:
Sort (cost=4620220.79..4621390.74 rows=467980 width=120) (actual time=2258506.411..2258509.528 rows=31752 loops=1)
Sort Key: hour, node_id
Sort Method: quicksort Memory: 5196kB
-> Foreign Scan on prices (cost=100.00..4576146.22 rows=467980 width=59) (actual time=8737.505..2258486.086 rows=31752 loops=1)
Filter: (pricedate = (CURRENT_DATE - 1))
Rows Removed by Filter: 93563101
Planning Time: 107.264 ms
Execution Time: 2258547.132 ms
我正在Ubuntu 18.04服务器上运行PostgreSQL 12.1
如果您还有任何问题,请告诉我
编辑:当我在本地以当前日期运行查询时,我忘记添加(就像我实际上登录到fdw连接的数据库并从那里运行一样),只需1秒钟。回答了您的问题吗?在(搜索“不可变”)中也有相当多的信息。是的!我尝试将当前的_日期放入子查询,结果成功了。我不知道IMMUTABLE,我想这解释了我在fdw上遇到的很多问题。非常感谢!但是,很难知道是否是这种情况,因为解释分析只是将两个查询都列为“外部扫描”,右解释输出不会“递归”到外部服务器。但是您可以在外部服务器上设置auto_explain,然后检查日志文件。
Sort (cost=4620220.79..4621390.74 rows=467980 width=120) (actual time=2258506.411..2258509.528 rows=31752 loops=1)
Sort Key: hour, node_id
Sort Method: quicksort Memory: 5196kB
-> Foreign Scan on prices (cost=100.00..4576146.22 rows=467980 width=59) (actual time=8737.505..2258486.086 rows=31752 loops=1)
Filter: (pricedate = (CURRENT_DATE - 1))
Rows Removed by Filter: 93563101
Planning Time: 107.264 ms
Execution Time: 2258547.132 ms
Sort (cost=122729.63..122816.37 rows=34694 width=120) (actual time=1006.677..1009.733 rows=31752 loops=1)
Sort Key: hour, node_id
Sort Method: quicksort Memory: 5196kB
-> Foreign Scan on prices (cost=753.45..120113.29 rows=34694 width=59) (actual time=987.827..989.274 rows=31752 loops=1)
Planning Time: 108.424 ms
Execution Time: 1046.897 ms