今天有个网友问,想找数据库在指定时间段内执行过的所有SQL。我稍微想了一下AWR或许能解决他的问题,细想一下又觉得不妥,AWR报告中采集的SQL是两个采集时间点的SQL之差,如果SQL在这两个时间点之间被刷出了library cache, 则第二个时间点是采集不到该SQL的任何信息的,因此该SQL也就不会在报告中有体现了。
下面来做个试验,论证一下这个观点:
SQL> select * from v$version; BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi PL/SQL Release 10.2.0.3.0 - Production CORE 10.2.0.3.0 Production TNS for Solaris: Version 10.2.0.3.0 - Production NLSRTL Version 10.2.0.3.0 - Production
先来构造3个AWR采集点(a,b,c), a~b, b~c 两个时间段内都执行相同的SQL,在b~c段末端将SQL刷出library cache. 然后去采集a~b,b~c的两份AWR报告。如果该SQL在第一份报告中存在,在第二份报告中不存在,则可以论证上面的观点。
测试执行的SQL为 :select count(*) from mv_node_test; 测试时候执行多遍的原因,是为了可以使得该SQL在报告中尽量靠前
SQL> exec dbms_workload_repository.create_snapshot(); -- a 采集点 PL/SQL procedure successfully completed SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node; COUNT(*) ---------- 1935111 SQL> exec dbms_workload_repository.create_snapshot(); --b 采集点 PL/SQL procedure successfully completed SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node_test; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node; COUNT(*) ---------- 1935111 SQL> select count(*) from mv_node; COUNT(*) ---------- 1935111 SQL> create index idx_mv_node_test on mv_node_test(nodeid); --索引创建后,其关联的library cache对象递归失效,从而被刷出library cache Index created SQL> exec dbms_workload_repository.create_snapshot(); --c采集点 PL/SQL procedure successfully completed
c 采集点之前的索引创建后,其关联的library cache对象递归失效,从而SQL(select count(*) from mv_node_test;)被刷出library cache,当然还有其他很多办法,这只是其中的一种方式。
那么,我们现在来看看第一份报告:
可以见到,采集到了该SQL。
来看看第二份报告:
第二份报告采集不到sql_id='fb0dpadqbrqjh' 的SQL了。或许你认为可能该SQL在相关指标统计中都排名比较后而没在报告中体现。那么我可以通过SQL脚本查询,也可以看到只有在b采集点(snap_id=47064)能采集到该SQL,c采集点则没有。
SQL> select s.snap_id, 2 s.sql_id, 3 s.executions_delta, 4 to_char(t.sql_text) sql_text 5 from dba_hist_sqlstat s, dba_hist_sqltext t 6 where s.dbid='3154057924' 7 and s.sql_id = t.sql_id 8 and s.sql_id = 'fb0dpadqbrqjh'; SNAP_ID SQL_ID EXECUTIONS_DELTA SQL_TEXT ---------- ------------- ---------------- -------------------------------------------------------------------------------- 47064 fb0dpadqbrqjh 15 select count(*) from mv_node_test
可见,尽管在AWR报告的时间段内执行了多次的SQL,尽管该SQL消耗了很大的系统资源,也不见得就能体现在报告中。
版权声明:本文为博主原创文章,未经博主允许不得转载。
AWR 历史SQL
- 上一篇:唯一值数估计算法的分析
- 下一篇:有关Oracle字符集转换的一点讨论