基于dba_hist_sqlstat查看sql语句的性能历史

本文介绍了一个用于分析SQL语句性能历史的脚本,通过DBA_HIST_SQLSTATS数据字典,可以有效监控SQL执行情况及执行计划稳定性,有助于提前发现并解决潜在问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在生产环境中,如果系统已经稳定,调优的空间就会越来越小,但是不代表没有调优的余地,可能工作的重心就会更加求稳,sql调优就是一项不间断的工作,很多工作还是需要前瞻的,如果等到问题严重的时候再紧急处理,提前的分析这些潜在问题就会让你不会总是心跳加快,两手冒汗。
dba_hist_sqlstat是一个宝库,很多的sql执行统计信息都会在其中,可以基于这个数据字典分析很多的特性,比如查看某条sql语句的性能历史,分析执行计划是否稳定等等,这些功能在分析sql语句的时候是相当实用的,毕竟一个awr报告中的sql问题可能只是一个表象,如果结合历史来看就会分析出更多的因素来。
这个脚本在<>中提到,而且可以通过网站找到相关的脚本内容,如果明白了思路,大家想自己定制一下也不错。
大多数的脚本可以通过链接找到http://kerryosborne.oracle-guy.com/2009/06/oracle-11g-adaptive-cursor-sharing-acs/
分析某一条sql语句的性能历史脚本
set lines 155
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.snap_id, ss.instance_number node, begin_interval_time, sql_id, plan_hash_value,
nvl(executions_delta,0) execs,
(elapsed_time_delta/decode(nvl(executions_delta,0),0,1,executions_delta))/1000000 avg_etime,
(buffer_gets_delta/decode(nvl(buffer_gets_delta,0),0,1,executions_delta)) avg_lio
from DBA_HIST_SQLSTAT S, DBA_HIST_SNAPSHOT SS
where sql_id = nvl(‘&sql_id’,’4dqs2k5tynk61’)
and ss.snap_id = S.snap_id
and ss.instance_number = S.instance_number
and executions_delta > 0
order by 1, 2, 3
/

脚本运行情况如下:
SNAP_ID NODE BEGIN_INTERVAL_TIME SQL_ID PLAN_HASH_VALUE EXECS AVG_ETIME AVG_LIO


 38878      1 31-MAR-15 05.20.06.216 PM      0xtpfz5pj4prb      1880269335          104        5.702      327,280.7
 38879      1 31-MAR-15 05.30.06.754 PM      0xtpfz5pj4prb                          119        4.926      326,385.0
 38880      1 31-MAR-15 05.40.07.622 PM      0xtpfz5pj4prb                          125        4.713      328,324.9
 38881      1 31-MAR-15 05.50.08.418 PM      0xtpfz5pj4prb                            6        6.461      361,164.7
 38884      1 31-MAR-15 06.20.09.984 PM      0xtpfz5pj4prb                           21        5.324      321,935.6
 38885      1 31-MAR-15 06.30.10.720 PM      0xtpfz5pj4prb                          107        5.539      325,886.4
 38886      1 31-MAR-15 06.40.11.283 PM      0xtpfz5pj4prb                           64        5.432      329,591.9
 38887      1 31-MAR-15 06.50.11.900 PM      0xtpfz5pj4prb                          110        5.397      326,757.1
 38888      1 31-MAR-15 07.00.12.457 PM      0xtpfz5pj4prb                          103        5.792      329,023.0
 38889      1 31-MAR-15 07.10.13.355 PM      0xtpfz5pj4prb                          126        4.682      328,220.6
 38890      1 31-MAR-15 07.20.13.848 PM      0xtpfz5pj4prb                          128        4.601      326,872.7
 38891      1 31-MAR-15 07.30.14.326 PM      0xtpfz5pj4prb      1880269355          131        4.508      328,507.7
 38892      1 31-MAR-15 07.40.14.905 PM      0xtpfz5pj4prb                          129        4.571      326,210.3
 38893      1 31-MAR-15 07.50.15.372 PM      0xtpfz5pj4prb                          132        4.468      327,796.7
 38894      1 31-MAR-15 08.00.15.889 PM      0xtpfz5pj4prb                          113        5.176      328,226.4
 38895      1 31-MAR-15 08.10.16.442 PM      0xtpfz5pj4prb                           63        5.194      332,234.3
 38897      1 31-MAR-15 08.30.17.385 PM      0xtpfz5pj4prb                           37        6.175      326,039.1
 38898      1 31-MAR-15 08.40.17.922 PM      0xtpfz5pj4prb                           76        7.755      327,436.6
 38899      1 31-MAR-15 08.50.18.469 PM      0xtpfz5pj4prb                          113        5.245      327,478.5
 38900      1 31-MAR-15 09.00.18.950 PM      0xtpfz5pj4prb                          127        4.614      326,215.6
 38901      1 31-MAR-15 09.10.19.458 PM      0xtpfz5pj4prb                           74        4.316      332,214.9

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

Oracle 提供了一组以 `DBA_HIST_` 开头的视图,这些视图为 AWR(Automatic Workload Repository)的一部分。AWR 记录了数据库在一定时间间隔内的性能统计数据,而这些历史数据存储在 `DBA_HIST_*` 视图中,允许管理员对过去的数据库活动进行诊断和分析。 ### 常见的 `DBA_HIST_` 视图包括但不限于: 1. **DBA_HIST_ACTIVE_SESS_HISTORY** - 这是一个非常重要的视图,记录了过去一段时间内活跃会话的历史快照。它可以帮助我们了解哪些 SQL 导致了 CPU 使用率过高、I/O 瓶颈等问题。 2. **DBA_HIST_SNAPSHOT** - 存储 AWR 的快照信息。每一份快照代表了一个时间段的数据采集点,并包含这个时间段的各种性能指标。 3. **DBA_HIST_SQLSTAT** - 包含 SQL 语句历史统计信息,例如执行次数、CPU 时间、磁盘读取量等。这有助于识别那些在过去表现较差的查询。 4. **DBA_HIST_SYSTEM_EVENT** - 跟踪系统级别上发生的等待事件及其耗时情况,帮助定位由于等待而导致的整体性能下降的原因。 5. **DBA_HIST_OSSTAT** - 捕获操作系统级别的统计信息,如 CPU 利用率、内存使用状况等,以便从硬件角度理解性能瓶颈。 6. **DBA_HIST_PERFORMANCE_SCHEMA_STATEMENT_STATISTICS** - (注意:此表并非标准命名,在常规 Oracle 中无直接对应实体) 类似于追踪特定类型操作的状态变更频率及影响程度,结合业务需求定制化解读。 --- #### 查询示例 假设我们需要找到最近一次 AWR 快照的时间范围,可以这样查询: ```sql SELECT snap_id, begin_interval_time, end_interval_time FROM dba_hist_snapshot ORDER BY snap_id DESC FETCH FIRST 1 ROWS ONLY; ``` 如果希望检查某一特定时段内最耗费资源的前几条 SQL,则可通过联合 `DBA_HIST_SQLSTAT` 和其他相关信息完成更深入挖掘。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值