top_n_sql、top_n_sql_max都是表示按照Elapsed Time、CPU Time、Gets等指标数值从高到低排序后返回的sql语句的数量,结合top_sql_pct通过下面几个场景解释一下top_n_sql、top_n_sql_max所起的作用(以sql ordered by elapsed time为例)
(1)如果top_n_sql=top_n_sql_max=N
返回elapsed time最长的N-1条sql,top_sql_pct值被忽略
(2)如果top_n_sql=N,top_n_sql_max=M,且满足N+1=M
返回elapsed time最长的N条sql,top_sql_pct值被忽略
(3)如果top_n_sql=N,top_n_sql_max=M,且满足N+1<M
返回的sql语句为
elapsed time最长的N条sql
+
从elapsed time最长的M条sql里选出elasped time最短的(M-N)条sql且从中进一步过滤出%total>top_pct_sql值的N1条sql,这里M-N=>N1>=0
这种情况下返回的sql数目为:N+N1
(4)如果top_n_sql=N,top_n_sql_max=M,且N>M
返回elapsed time最长的M-1条sql语句,top_pct_sql值被忽略
(5)如果top_n_sql=N,top_n_sql_max为空;
返回elapsed time最长的N条记录,top_pct_sql值被忽略
(6)如果top_n_sql_max=N,top_n_sql为空;
返回elapsed time最长的10条记录
从上面的第3种情况可见AWR中返回的sql语句可以由指定topn、外加total%值作为过滤的方式共同作用的
至此,我们已经知道如何使用AWR_SET_REPORT_THRESHOLDS来指定AWR报告里所列SQL数量的方法了。
其实AWR报告里的SQL数量取决于两个因素
1、是MMON进程把多少条SQL从内存Flush到AWR里
2、AWR_SET_REPORT_THRESHOLDS从AWR中的过滤出多少条sql生成在AWR报告里。
相比之下前者是基础,从我们已经获得的知识知道statistics_level参数的取值,DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS里topnsql的取值决定了有多少SQL从内存Flush到AWR:
当statistics_level=typical时这个数字是30
当statistics_level=ALL时这个数字是100
topnsql的优先级最高,不当能够直接指定sql数量,而且能够覆盖掉statistics_level的功效。
但在11gR2里实际情况和上述观点还是有不少差异的,上面的三个约束条件似乎都不起作用。我测试的结果是无论statistics_level=typical还是statistics_level=all(只要不是Basic),无论topnsql的值是多少,mmon都会将尽可能多的sql flush到AWR里,我是通过下面的方法来验证的,有兴趣的同学可以尝试一下,这里就不再赘述验证过程了
--当statistics_level=typical时,下面的结果>30;当statistics_level=ALL时,下面的结果>100;当topnsql=N时,下面的结果>N
select count(distinct(sql_id)) from dba_hist_sqlstat where snap_id<:end_snap_id and snap_id>= :begin_snap_id; --这里的end_snap_id和begin_snap_id代表了连续的两个snap_id,中间没有gap
在CentOS 6.4下安装Oracle 11gR2(x64)