大表上的可变日期过滤器太慢

时间:2019-06-14 10:20:38

标签: postgresql postgresql-9.5

我有一个拥有2500万条记录的巨大表,以及一个系统,该系统具有可以执行查询的计划任务。查询需要通过创建日期(时间戳)列快速获取最新记录,并应用一些计算。问题在于日期也保存在表中,每次执行时都会将日期更新为最新的执行日期。它确实可以工作,但是非常慢:

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变量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 :(得分:0)

您可以使用以下功能来做到这一点:

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()