我有一个Postgresql表,用于存储有关已调度进程的信息,包括上次执行进程的时间。不同的流程对其运行频率有不同的要求。
我提取了一个我需要重新运行的进程列表:
SELECT * FROM processes WHERE last_run < now() - interval '2 hours'
我添加了一个名为exec_interval
的新列,该列具有以分钟为单位的任务运行频率,以便我可以取消硬编码值。
我想做这样的事情:
SELECT * FROM processes WHERE last_run < now() - interval exec_interval || ' minutes'
但是这会引发语法错误。是否有可接受的方式来处理这种情况?
答案 0 :(得分:2)
最简洁的方法可能是:
SELECT
*
FROM
processes
WHERE
last_run < now() - exec_interval * interval '1 minute' ;
或者,可能更好:
SELECT
*
FROM
processes
WHERE
last_run + exec_interval * interval '1 minute' < now() ;
(也就是说,您可以在<
的一侧保留可以从te表的一行计算的所有内容,而不是中的列(或f(列)) sides)
...以及以下(功能)索引:
CREATE INDEX idx_next_run
ON processes ( (last_run + (exec_interval * interval '1 minutes') ) ) ;
这将允许一个很好的执行计划,如:
| QUERY PLAN | | :----------------------------------------------------------------------------------------------------------------------------- | | Bitmap Heap Scan on processes (cost=1060.05..2799.58 rows=49001 width=16) (actual time=10.007..19.612 rows=49792 loops=1) | | Recheck Cond: ((last_run + ((exec_interval)::double precision * '00:01:00'::interval)) < now()) | | Heap Blocks: exact=637 | | -> Bitmap Index Scan on idx_next_run (cost=0.00..1047.80 rows=49001 width=0) (actual time=9.919..9.919 rows=49792 loops=1) | | Index Cond: ((last_run + ((exec_interval)::double precision * '00:01:00'::interval)) < now()) | | Planning time: 0.204 ms | | Execution time: 23.619 ms |
检查 dbfiddle here
中的所有设置和几个小变化