Oracle 10g之前对数据库做性能检测使用statspack工具。
Oracle Database 10g 提供了一个新的工具:(AWR:Automatic Workload Repository)。
AWR简称Automatic Workload Repository,它作为SYSAUX表空间中的一组表和其他对象而存在。
统计信息在内存中(也就是在SGA内的数据结构中)累积。因为统计信息只反映实例所做的操作,所以并不影响实例的性能.
将计信息定期的(默认是60分钟)写入磁盘,也就是写入AWR。这称为一次AWR快照。
将统计信息写入磁盘的操作由后台进程MMON(可管理性监视器)完成。默认情况下,在重写前,快照会保留8天。
与 Statspack 不同,快照由一个称为 MMON 的新的后台进程及其从进程自动地每小时采集一次。
只要生成快照,MMON进程就会自动运行ADDM(Automatic Database Diagnostic)。
AWR 使用几个表来存储采集的统计数据,所有的表都存储在新的名称为 SYSAUX 的特定表空间中的 SYS 模式下,
并且以 WRM$_* 和 WRH$_* 的格式命名。
前一种类型存储元数据信息(如检查的数据库和采集的快照),后一种类型保存实际采集的统计数据。
H 代表“历史数据 (historical)”而 M 代表“元数据 (metadata)”。
在这些表上构建了几种带前缀 DBA_HIST_ 的视图,这些视图可以用来编写您自己的性能诊断工具。
视图的名称直接与表相关;例如,视图 DBA_HIST_SYSMETRIC_SUMMARY 是在WRH$_SYSMETRIC_SUMMARY 表上构建的。
statistics_level 默认是typical,在10g中表监控是激活的,强烈建议在10g中此参数的值是typical。如果STATISTICS_LEVEL设置为basic,不仅不能监控表,而且将禁掉如下一些10g的新功能:
ASH(Active Session History)
ASSM(Automatic Shared Memory Management)
AWR(Automatic Workload Repository)
ADDM(Automatic Database Diagnostic Monitor)
/* AWR使用 */
SQL>@?/rdbms/admin/awrrpt.sql
/* 查看当前的AWR保存策略 */
SQL> col SNAP_INTERVAL format a20
SQL> col RETENTION format a20
SQL> select * from dba_hist_wr_control;
DBID SNAP_INTERVAL RETENTION TOPNSQL
---------- -------------------- -------------------- ----------
2432893466 +00000 01:00:00.0 +00008 00:00:00.0 DEFAULT
/* 调整AWR配置 */
AWR配置都是通过dbms_workload_repository包进行配置。
/* 调整AWR产生snapshot的频率和保留策略 ,
如将收集间隔时间改为30 分钟一次。并且保留5天时间(单位都是分钟):*/
SQL> exec dbms_workload_repository.modify_snapshot_settings(interval=>30, retention=>5*24*60);
SQL> exec dbms_workload_repository.modify_snapshot_settings(interval=>30, retention=>5*24*60);
BEGIN dbms_workload_repository.modify_snapshot_settings(interval=>30, retention=>5*24*60); END;
*
ERROR at line 1:
ORA-13541: system moving window baseline size (691200) greater than retention
(432000)
ORA-06512: at "SYS.DBMS_WORKLOAD_REPOSITORY", line 174
ORA-06512: at "SYS.DBMS_WORKLOAD_REPOSITORY", line 222
ORA-06512: at line 1
SQL> select 5*24*60*60 as sec from dual;
sec
----------
432000
/* 检查当前的移动窗口基线大小 */
col BASELINE_NAME for a30
SELECT dbid, baseline_name, baseline_type, moving_window_size from dba_hist_baseline;
DBID BASELINE_NAME BASELINE_TYPE MOVING_WINDOW_SIZE
---------- ------------------------------ ------------- ------------------
2432893466 SYSTEM_MOVING_WINDOW MOVING_WINDOW 8
SQL> exec dbms_workload_repository.modify_baseline_window_size(5);
PL/SQL procedure successfully completed.
SQL> exec dbms_workload_repository.modify_snapshot_settings(interval=>30, retention=>5*24*60);
PL/SQL procedure successfully completed.
SQL> select * from dba_hist_wr_control;
DBID SNAP_INTERVAL RETENTION TOPNSQL
---------- -------------------- -------------------- ----------
2432893466 +00000 00:30:00.0 +00005 00:00:00.0 DEFAULT
/* 关闭AWR,把interval设为0则关闭自动捕捉快照 */
SQL> exec dbms_workload_repository.modify_snapshot_settings(interval=>0);
/* 手工创建一个快照 */
SQL> exec DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();
PL/SQL procedure successfully completed.
/* 查看快照 */
SQL> select count(*) from sys.wrh$_active_session_history;
COUNT(*)
----------
599
/* 查看 10天以前的快照snap_id */
select distinct snap_id,sample_time from sys.wrh$_active_session_history where sample_time < sysdate - 10;
/* 手工删除指定范围的快照 */
SQL> exec DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE(low_snap_id => 339, high_snap_id => 353, dbid => 2432893466);
/* 创建baseline,保存这些数据用于将来分析和比较 */
SQL> exec dbms_workload_repository.create_baseline(start_snap_id => 373,end_snap_id => 376,baseline_name => 'bl_test');
PL/SQL procedure successfully completed.
/* 查看基线*/
SQL> col BASELINE_NAME for a10
SQL> select baseline_id,baseline_name,baseline_type,start_snap_id,end_snap_id,creation_time
from dba_hist_baseline;
BASELINE_ID BASELINE_N BASELINE_TYPE START_SNAP_ID END_SNAP_ID CREATION_TIME
----------- ---------- ------------- ------------- ----------- ------------------
2 bl_test STATIC 373 376 24-NOV-13
0 SYSTEM_MOV MOVING_WINDOW 359 389 15-MAY-13
ING_WINDOW
/* 删除baseline , cascade参数选择是否将其关联的Snapshots级别进行删除*/
SQL> exec DBMS_WORKLOAD_REPOSITORY.DROP_BASELINE(baseline_name => 'bl_test',cascade => false);
PL/SQL procedure successfully completed.
4.1 SQL ordered by Elapsed Time
记录了执行总和时间的TOP SQL(请注意是监控范围内该SQL的执行时间总和,而不是单次SQL执行时间 Elapsed Time = CPU Time + Wait Time)。
Elapsed Time(S): SQL语句执行用总时长,此排序就是按照这个字段进行的。注意该时间不是单个SQL跑的时间,而是监控范围内SQL执行次数的总和时间。单位时间为秒。Elapsed Time = CPU Time + Wait Time
CPU Time(s): 为SQL语句执行时CPU占用时间总时长,此时间会小于等于Elapsed Time时间。单位时间为秒。
Executions: SQL语句在监控范围内的执行次数总计。
Elap per Exec(s): 执行一次SQL的平均时间。单位时间为秒。
% Total DB Time: 为SQL的Elapsed Time时间占数据库总时间的百分比。
SQL ID: SQL语句的ID编号,点击之后就能导航到下边的SQL详细列表中,点击IE的返回可以回到当前SQL ID的地方。
SQL Module: 显示该SQL是用什么方式连接到数据库执行的,如果是用SQL*Plus或者PL/SQL链接上来的那基本上都是有人在调试程序。一般用前台应用链接过来执行的sql该位置为空。
SQL Text: 简单的sql提示,详细的需要点击SQL ID。
4.2 SQL ordered by CPU Time:
记录了执行占CPU时间总和时间最长的TOP SQL(请注意是监控范围内该SQL的执行占CPU时间总和,而不是单次SQL执行时间)。
4.3 SQL ordered by Gets:
记录了执行占总buffer gets(逻辑IO)的TOP SQL(请注意是监控范围内该SQL的执行占Gets总和,而不是单次SQL执行所占的Gets)。
4.4 SQL ordered by Reads:
记录了执行占总磁盘物理读(物理IO)的TOP SQL(请注意是监控范围内该SQL的执行占磁盘物理读总和,而不是单次SQL执行所占的磁盘物理读)。
4.5 SQL ordered by Executions:
记录了按照SQL的执行次数排序的TOP SQL。该排序可以看出监控范围内的SQL执行次数。
4.6 SQL ordered by Parse Calls:
记录了SQL的软解析次数的TOP SQL。说到软解析(soft prase)和硬解析(hard prase),就不能不说一下Oracle对sql的处理过程。
4.7 SQL ordered by Sharable Memory:
记录了SQL占用library cache的大小的TOP SQL。Sharable Mem (b):占用library cache的大小,单位是byte。
4.8 SQL ordered by Version Count:
记录了SQL的打开子游标的TOP SQL。
4.9 SQL ordered by Cluster Wait Time:
记录了集群的等待时间的TOP SQL
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28859270/viewspace-777442/ ,如需转载,请注明出处,否则将追究法律责任。