dba_hist_sqlstat是一个宝库,很多的sql执行统计信息都会在其中,可以基于这个数据字典分析很多的特性,比如查看某条sql语句的性能历史,分析执行计划是否稳定等等,这些功能在分析sql语句的时候是相当实用的,毕竟一个awr报告中的sql问题可能只是一个表象,如果结合历史来看就会分析出更多的因素来。
SQL> desc dba_hist_sqlstat
Name Null? Type
-------- -------- -------
SNAP_ID NOT NULL NUMBER
DBID NOT NULL NUMBER
INSTANCE_NUMBER NOT NULL NUMBER
SQL_ID NOT NULL VARCHAR2(13)
PLAN_HASH_VALUE NOT NULL NUMBER
OPTIMIZER_COST NUMBER
OPTIMIZER_MODE VARCHAR2(10)
OPTIMIZER_ENV_HASH_VALUE NUMBER
SHARABLE_MEM NUMBER
LOADED_VERSIONS NUMBER
VERSION_COUNT NUMBER
MODULE VARCHAR2(64)
...........................................................................
下面这条语句是用来分析问题sql的历史执行情况
set lines 900
col execs for 999,999,999
col avg_etime for 999,999.999
col avg_lio for 999,999,999.9
col begin_interval_time for a30
col node for 99999
break on plan_hash_value on startup_time skip 1
select ss.instance_number node,
begin_interval_time,
sql_id,
plan_hash_value,
nvl(executions_delta, 0) exe_num, --执行次数
trunc(elapsed_time_delta / 1000000) exe_time,--执行时间
trunc((elapsed_time_delta / decode(nvl(executions_delta, 0), 0, 1, executions_delta)) / 1000000) avg_exe_time,--平均执行时间
buffer_gets_delta lg_read,--逻辑读
trunc((buffer_gets_delta / decode(nvl(buffer_gets_delta, 0), 0, 1, executions_delta))) avg_lg_read --平均逻辑读
from DBA_HIST_SQLSTAT S, DBA_HIST_SNAPSHOT SS
where sql_id = '6w3u9wccxtyzp'--问题sql语句的sql_id值
and ss.snap_id = S.snap_id
and ss.instance_number = S.instance_number
and s.instance_number=1
and executions_delta > 0
order by NODE,BEGIN_INTERVAL_TIME
/
这条语句是生产库上的问题语句,可以才看到历史执行情况。
如果某些指标突然发生了重大的变化,可以通过性能历史很清晰的看到,对于plan_hash_value做了断句处理,如果发生了执行计划的改变,就会很清楚什么时间点有了变动,哪些方面的变化等等。