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

/

这条语句是生产库上的问题语句,可以才看到历史执行情况。

Oracle dba_hist_sqlstat_sql语句

如果某些指标突然发生了重大的变化,可以通过性能历史很清晰的看到,对于plan_hash_value做了断句处理,如果发生了执行计划的改变,就会很清楚什么时间点有了变动,哪些方面的变化等等。