фильтр с переменной датой на большой таблице слишком медленный - PullRequest
0 голосов
/ 14 июня 2019

У меня есть огромная таблица с 25 миллионами записей и система, в которой есть запланированная задача, которая может выполнить запрос. Запрос должен быстро выбрать последние записи по столбцу создания даты (отметка времени) и применить некоторые вычисления. Проблема заключается в том, что дата также хранится в таблице и при каждом выполнении обновляется до самой последней даты выполнения. Это работает, но очень медленно:

select * from request_history
where createdate > (select startdate from request_history_config)
limit 10;

требуется около 20 секунд, что слишком медленно по сравнению с этим:

set custom.startDate = '2019-06-13T18:02:04';
select * from request_history
where createdate > current_setting('custom.startDate')::timestamp
limit 10;

, и этот запрос завершается в течение 100 миллисекунд. Проблема в том, что я не могу обновить и сохранить дату для следующего выполнения! Я искал оператор SET variable TO, который позволил бы мне получить какое-либо значение из таблицы, но все эти попытки не работают:

select set_config('custom.startDate', startDate, false) from request_history_config;
// ERROR:  function set_config(unknown, timestamp without time zone, boolean) does not exist

set custom.startDate to (select startDate from request_history_config);
// ERROR:  syntax error at or near "("

1 Ответ

0 голосов
/ 14 июня 2019

Вы можете сделать это, используя такую ​​функцию:

CREATE OR REPLACE FUNCTION get_request_history()
 RETURNS TABLE(createdate timestamp)
 LANGUAGE plpgsql
AS $function$
DECLARE
  start_date timestamp;
BEGIN
   SELECT startdate INTO start_date FROM request_history_config;
   RETURN QUERY
   SELECT *
   FROM   request_history h
   WHERE  h.createdate > start_date
   LIMIT 10;
END
$function$

А затем используйте функцию для получения значений:

select * from get_request_history()
...