签到成功

知道了

CNDBA社区CNDBA社区

实验证明AWR报告并不能记录时间段内所有的SQL

2016-09-20 13:02 4525 0 原创
作者: arealman

今天有个网友问,想找数据库在指定时间段内执行过的所有SQL。我稍微想了一下AWR或许能解决他的问题,细想一下又觉得不妥,AWR报告中采集的SQL是两个采集时间点的SQL之差,如果SQL在这两个时间点之间被刷出了library cache, 则第二个时间点是采集不到该SQL的任何信息的,因此该SQL也就不会在报告中有体现了。

下面来做个试验,论证一下这个观点:http://www.cndba.cn/cndba/arealman/article/259

http://www.cndba.cn/cndba/arealman/article/259

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,当然还有其他很多办法,这只是其中的一种方式。

http://www.cndba.cn/cndba/arealman/article/259
http://www.cndba.cn/cndba/arealman/article/259

那么,我们现在来看看第一份报告:

http://www.cndba.cn/cndba/arealman/article/259

2.png


http://www.cndba.cn/cndba/arealman/article/259http://www.cndba.cn/cndba/arealman/article/259

可以见到,采集到了该SQL。http://www.cndba.cn/cndba/arealman/article/259

http://www.cndba.cn/cndba/arealman/article/259

来看看第二份报告:

第二份报告采集不到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消耗了很大的系统资源,也不见得就能体现在报告中。

http://www.cndba.cn/cndba/arealman/article/259

版权声明:本文为博主原创文章,未经博主允许不得转载。

AWR 历史SQL

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
arealman

arealman

关注
  • 10
    原创
  • 0
    翻译
  • 0
    转载
  • 5
    评论
  • 访问:53856次
  • 积分:51
  • 等级:注册会员
  • 排名:第42名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ