将列插入postgres间隔

时间:2017-07-18 22:11:02

标签: sql postgresql

我有一个Postgresql表,用于存储有关已调度进程的信息,包括上次执行进程的时间。不同的流程对其运行频率有不同的要求。

我提取了一个我需要重新运行的进程列表:

SELECT * FROM processes WHERE last_run < now() - interval '2 hours'

我添加了一个名为exec_interval的新列,该列具有以分钟为单位的任务运行频率,以便我可以取消硬编码值。

我想做这样的事情:

SELECT * FROM processes WHERE last_run < now() - interval exec_interval || ' minutes'

但是这会引发语法错误。是否有可接受的方式来处理这种情况?

1 个答案:

答案 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

中的所有设置和几个小变化