Ускорение запроса относительно переменной даты - PullRequest
0 голосов
/ 03 августа 2020

Мне нужно запрашивать данные, сгенерированные вчера, каждое утро с помощью сценария.

Запрос похож на

select xxx 
from table 
where create_time >= current_date - 1 
  and create_time < current_date 
limit 10;

Его план запроса:

                   QUERY PLAN                                     
------------------------------------------------------------------------------------
 Limit  (cost=100.00..117.64 rows=3 width=138)
   ->  Foreign Scan on table  (cost=100.00..117.64 rows=3 width=138)

Вышеупомянутый запрос занимает очень много времени.

Однако, когда я использую фиксированное время, как показано ниже, он немедленно возвращает результаты ...

select xxx 
from table 
where create_time >= '2020-07-30 00:00:00' 
  and create_time < '2020-08-03 00:00:00' 
limit 10;

Его план запроса: 10;

                                       QUERY PLAN                                       
----------------------------------------------------------------------------------------
 Limit  (cost=100.00..131.46 rows=3 width=138)
   ->  Foreign Scan on table (cost=100.00..131.46 rows=3 width=138)
         Filter: ((create_time < CURRENT_DATE) AND (create_time >= (CURRENT_DATE - 1)))

В чем разница? А как ускорить 1-й запрос?

Ответы [ 2 ]

1 голос
/ 03 августа 2020

По-видимому, table - это сторонняя таблица . Обертка внешних данных Postgres не может передать sh выражение current_date - 1 внешнему серверу, потому что сервер может иметь другое представление о том, что такое current_date, а не о сервере, на котором вы выполняете запрос. Таким образом, он должен получить все строки с удаленного сервера и выполнить фильтрацию на сервере, на котором вы выполняете запрос.

Постоянное значение может быть передано на внешний сервер, чтобы возвращаются только строки (и отправляются по сети), которые соответствуют условию (скорее всего, с использованием индекса).

0 голосов
/ 03 августа 2020

попробуйте:

select xxx 
from table 
where create_time >= (select current_date - 1)
  and create_time < (select current_date)
limit 10;

может так будет быстрее

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