Oracle,执行select * 并从大型事务表中选择计数,以从表中计算select * 的计数

uxhixvfz  于 2023-01-30  发布在  Oracle
关注(0)|答案(2)|浏览(129)

我有一个很大的oracle事务表,每隔4小时提取一次数据,我需要使用followup select count(*)from table查询来验证提取数据的计数,但是select * from table where tend between sysdate-4hours and sysdateselect count(*) from table where tend between sysdate-4hours and sysdate查询需要同时启动,就好像它们在赛跑一样。
目标是记录计数,并且此表在分钟级别接收大量事务。我为select * 查询添加了并行提示,它提供了良好的结果,但是当我启动这两个作业时,即使计数查询运行的时间特别长,提取也会提前很久完成。如何继续?

sxpgvts3

sxpgvts31#

在我看来,您似乎被"什么时间是“现在”“这个问题所困扰,因为在不同时间运行的两个查询对“现在”有不同的含义。
那么,显式地设置它怎么样呢?类似这样:

declare
  l_now date := sysdate;
begin
  -- extract data, e.g.
  insert into another_table (col1, ool2, ...)
  select col1, col2, ...
  from huge_table
  where date_column between l_now - interval '4' hour and l_now;
  
  -- you want to know number of rows? Easy-peasy
  l_cnt := sql%rowcount;
  
  -- you want to count rows explicitly? OK, if you must
  select count(*)
    into l_cnt
  from huge_table
  where date_column between l_now - interval '4' hour and l_now;
end;
qpgpyjmq

qpgpyjmq2#

不要使用相对于SYSDATE的偏移量,而是将上次检索到的date_column值存储在客户端(或者,如果愿意,存储在某个控制表中),并在下次刷新时从该值开始,提取所有行>=
(for 1秒粒度的日期,请确保使用>=,而不仅仅是>
这样,您的查询是一致的,并且它们是否在完全相同的时间运行并不重要。

相关问题