PostgreSQL postgres_fdw очень медленно запрашивает большие внешние таблицы при использовании CURRENT_DATE - 1, но не с жестко закодированной датой - PullRequest
3 голосов
/ 26 января 2020

Я использую postgres_fdw для подключения к другой PostgreSQL БД. Иногда производительность запроса работает нормально, но в других случаях запрос может занять ненормально много времени. Я столкнулся с проблемой, когда, если я использую функцию CURRENT_DATE, запрос занимает ~ 30 минут, но если я жестко закодирую ту же дату, запрос занимает 1 сек c. Глядя на EXPLAIN ANALYZE обоих запросов, он появляется, когда я использую CURRENT_DATE, он сканирует всю чужую таблицу, но когда я жестко кодирую дату, он сканирует только те строки, которые ему нужны. Это как если бы CURRENT_DATE не использовал индекс таблицы, а жесткое кодирование даты. Тем не менее, трудно понять, так ли это, поскольку EXPLAIN ANALYZE просто перечисляет оба запроса как «Чужие сканы». Почему эти два запроса имеют такое разное время выполнения?

Вот два запроса, которые я сравниваю:

SELECT *
FROM pjm.prices
WHERE pricedate = CURRENT_DATE - 1
ORDER BY pricedate, hour, node_id;
SELECT *
FROM pjm.prices
WHERE pricedate = '2020-01-24'
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  
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

Я работаю PostgreSQL 12.1 на сервере Ubuntu 18.04.

Дайте мне знать, если у вас есть дополнительные вопросы!

РЕДАКТИРОВАТЬ: Я забыл добавить, когда я запускаю запрос с CURRENT_DATE локально (так как в действительности я захожу в БД, к которой подключается мой fdw, и запускаю ее оттуда), это займет всего 1 сек c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...