如何获取Oracle数据库中发生的插入/更新次数?

Noh*_*sib 2 oracle storage oracle10g oracle11g

如何获取一段时间内Oracle数据库中发生的插入/更新总数?

Jus*_*ave 9

假设您已配置AWR以保留所有SQL语句的数据(默认情况下仅保留前30个CPU,经过时间等,如果STATISTICS_LEVEL是'TYPICAL',前100个,如果STATISTICS_LEVEL'ALL')就像是

BEGIN
  dbms_workload_repository.modify_snapshot_settings (
    topnsql => 'MAXIMUM'
  );
END;
Run Code Online (Sandbox Code Playgroud)

并且假设在快照捕获SQL语句之前SQL语句没有老化,您可以使用AWR表来实现其中一些.

您可以收集执行INSERT语句的次数以及执行UPDATE语句的次数

SELECT sum( stat.executions_delta ) insert_executions
  FROM dba_hist_sqlstat stat 
       JOIN dba_hist_sqltext txt ON (stat.sql_id = txt.sql_id )
       JOIN dba_hist_snapshot snap ON (stat.snap_id = snap.snap_id)
 WHERE snap.begin_interval_time BETWEEN <<start time>> AND <<end time>>
   AND txt.command_type = 2;

SELECT sum( stat.executions_delta ) update_executions
  FROM dba_hist_sqlstat stat 
       JOIN dba_hist_sqltext txt ON (stat.sql_id = txt.sql_id )
       JOIN dba_hist_snapshot snap ON (stat.snap_id = snap.snap_id)
 WHERE snap.begin_interval_time BETWEEN <<start time>> AND <<end time>>
   AND txt.command_type = 6;
Run Code Online (Sandbox Code Playgroud)

请注意,这些查询包括应用程序发出的语句和Oracle在后台发出的语句.如果要筛选出某些SQL语句,可以添加其他条件.

同样,您可以获得不同INSERT和UPDATE语句的总数

SELECT count( distinct stat.sql_id ) distinct_insert_stmts
  FROM dba_hist_sqlstat stat 
       JOIN dba_hist_sqltext txt ON (stat.sql_id = txt.sql_id )
       JOIN dba_hist_snapshot snap ON (stat.snap_id = snap.snap_id)
 WHERE snap.begin_interval_time BETWEEN <<start time>> AND <<end time>>
   AND txt.command_type = 2;


SELECT count( distinct stat.sql_id ) distinct_update_stmts
  FROM dba_hist_sqlstat stat 
       JOIN dba_hist_sqltext txt ON (stat.sql_id = txt.sql_id )
       JOIN dba_hist_snapshot snap ON (stat.snap_id = snap.snap_id)
 WHERE snap.begin_interval_time BETWEEN <<start time>> AND <<end time>>
   AND txt.command_type = 6;
Run Code Online (Sandbox Code Playgroud)

但是,Oracle不会跟踪在给定时间间隔内插入或更新的行数.因此,您将无法从AWR获取该信息.您可以获得的最接近的是尝试利用Oracle所做的监控来确定统计信息是否过时.假设MONITORING为每个表启用(默认情况下为11g,我相信它默认为10g),即

ALTER TABLE table_name
  MONITORING;
Run Code Online (Sandbox Code Playgroud)

Oracle将定期将每个表插入,更新和删除的大致行数刷新到SYS.DBA_TAB_MODIFICATIONS表中.但这只会显示活动,因为统计数据是在表格上收集的,而不是特定时间间隔内的活动.但是,您可以尝试编写一个定期将此数据捕获到您自己的表中的进程并报告该进程.

如果您指示Oracle将监视信息从内存清除到磁盘(否则会有几个小时的延迟)

BEGIN
  dbms_stats.flush_database_monitoring_info;
END;
Run Code Online (Sandbox Code Playgroud)

自上次收集统计信息以来,您可以获得每个表中已更改的行数的近似计数

SELECT table_owner,
       table_name,
       inserts,
       updates,
       deletes
  FROM sys.dba_tab_modifications
Run Code Online (Sandbox Code Playgroud)