oracle pl-sql优化计算两个事务时间

hrirmatl  于 2023-02-21  发布在  Oracle
关注(0)|答案(1)|浏览(117)

一个主要的问题是我如何编写优化查询来计算两个事务之间的时间戳。实际上,一个表中有大量的事务,我想计算最后插入的记录和最新插入的记录之间的时间戳。所以,您能帮我计算一下处理这个问题的最佳方法吗
我使用了滞后函数来查找最新事务,然后减去新插入记录的时间,但这会消耗大量时间

kuarbcqp

kuarbcqp1#

这个例子是基于Scott的模式样本的,它的表当然没有 * 巨大数量的事务 *,但是这应该足以说明该方法。(所有日期都是DD.MM.YYYY)。

SQL> select ename, hiredate
  2  from emp
  3  order by hiredate desc;

ENAME      HIREDATE
---------- ----------
ADAMS      12.01.1983   --> that's "new inserted record"
SCOTT      09.12.1982   --> that's "last inserted"
MILLER     23.01.1982
FORD       03.12.1981
<snip>

14 rows selected.

这两个日期之间的差值为(天数)

SQL> select date '1983-01-12' - date '1982-12-09' as diff from dual;

      DIFF
----------
        34

Query * 使用rank分析函数,按hiredate降序对 * 行进行排序,即rn = 1代表"新插入的记录",rn = 2代表"最后插入的记录",然后相减得到结果:

SQL> with temp as
  2    (select ename,
  3            hiredate,
  4            rank() over (order by hiredate desc) rn
  5    from emp
  6   )
  7  select a.hiredate - b.hiredate as diff
  8  from temp a cross join temp b
  9  where a.rn = 1
 10    and b.rn = 2;

      DIFF
----------
        34

SQL>

在您的情况下:

with temp as
  (select insert_time,
          row_number() over (order by insert_time desc) rn
  from your_table
 )
select a.insert_time - b.insert_time
from your_table a cross join your_table b
where a.rn = 1 
  and b.rn = 2;

它将受益于

  • insert_time上的索引
  • 定期收集表的统计信息(或者更好的是收集整个模式的统计信息)

或者,如果您创建一个只包含这两个日期的新表,也许您可以 * 显著地 * 改进整个过程:

SQL> create table latest_diff
  2    (new_insert  date,
  3     last_insert date
  4    );

Table created.

插入初始记录(以便您有一个 * 起点 *):

SQL> insert into latest_diff (new_insert, last_insert) values (date '1983-01-12', date '1982-12-09');

1 row created.

然后,在你的表上创建一个简单的触发器(在我的例子中是emp)来设置日期值,这个触发器应该很快就能完成它的工作:

SQL> create or replace trigger trg_bi_emp
  2    before insert on emp
  3    for each row
  4  begin
  5    update latest_diff set
  6      last_insert = new_insert,
  7      new_insert  = :new.hiredate;
  8  end;
  9  /

Trigger created.

好吧,我们试试看:初始数据显示了我们已经计算的差异(34天):

SQL> select * from latest_diff;

NEW_INSERT LAST_INSER
---------- ----------
12.01.1983 09.12.1982

SQL> select new_insert - last_insert diff from latest_diff;

      DIFF
----------
        34

正在向表中插入新记录:

SQL> insert into emp (empno, hiredate) values (1, date '1983-01-18');

1 row created.

latest_diff表已修改(触发器已执行此操作):

SQL> select * from latest_diff;

NEW_INSERT LAST_INSER
---------- ----------
18.01.1983 12.01.1983

查找差异非常简单和快速,因为您不必每次都"滚动"这个"巨大"的表,而是从单行表中获取数据。

SQL> select new_insert - last_insert diff from latest_diff;

      DIFF
----------
         6

SQL>

相关问题