Sql 将列插入到postgres间隔中
我有一个Postgresql表,用于存储有关计划进程的信息,包括进程最后一次执行的时间。不同的流程对运行频率有不同的要求 我提取了需要重新运行的进程列表,如下所示:Sql 将列插入到postgres间隔中,sql,postgresql,Sql,Postgresql,我有一个Postgresql表,用于存储有关计划进程的信息,包括进程最后一次执行的时间。不同的流程对运行频率有不同的要求 我提取了需要重新运行的进程列表,如下所示: SELECT * FROM processes WHERE last_run < now() - interval '2 hours' SELECT * FROM processes WHERE last_run < now() - interval exec_interval || ' minutes' 但这会引发
SELECT * FROM processes WHERE last_run < now() - interval '2 hours'
SELECT * FROM processes WHERE last_run < now() - interval exec_interval || ' minutes'
但这会引发语法错误。有没有一种公认的方法来处理这种情况?最干净的方法可能是:
SELECT
*
FROM
processes
WHERE
last_run < now() - exec_interval * interval '1 minute' ;
这将允许一个良好的执行计划,例如:
| 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上检查所有设置和一些小的变化,最干净的方法可能是:
SELECT
*
FROM
processes
WHERE
last_run < now() - exec_interval * interval '1 minute' ;
这将允许一个良好的执行计划,例如:
| 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上的所有设置和一些小的变化SELECT*来自上次运行