PostgreSQL postgres_fdw在使用CURRENT_DATE - 1但不使用硬编码日期时查询大型外部表非常慢

thtygnil  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(110)

我正在使用postgres_fdw连接到另一个PostgreSQL数据库。有时候查询的性能很好,但有时候查询可能需要异常长的时间。我遇到了一个问题,如果我使用函数CURRENT_DATE,查询需要大约30分钟,但如果我硬编码相同的日期,查询需要1秒。查看两个查询的EXPLAIN ANALYZE,当我使用CURRENT_DATE时,它会扫描整个外部表,但当我硬编码日期时,它只扫描它需要的行。这就好像使用CURRENT_DATE并不使用表索引,但是硬编码日期会使用表索引。然而,很难知道是否是这种情况,因为EXPLAIN ANALYZE只是将两个查询都列为“外来扫描”。为什么这两个查询的执行时间如此不同?
下面是我比较的两个查询:

SELECT *
FROM pjm.prices
WHERE pricedate = CURRENT_DATE - 1
ORDER BY pricedate, hour, node_id;

个字符
以下是每个查询的EXPLAIN ANALYZE:

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

的字符串
我在Ubuntu 18.04服务器上运行PostgreSQL 12.1。
如果你有任何进一步的问题,请告诉我!
编辑:当我在本地用CURRENT_DATE运行查询时,我忘记添加了(因为我实际上登录到我的fdw连接到的数据库并从那里运行它),它只需要1秒。

rmbxnbpk

rmbxnbpk1#

我有类似的问题,并寻找所有可能的选项,只是尝试真空充分分析所有数据库涉及的FDW查询,然后FDW相关的查询。

相关问题