Oracle 学习之 性能优化(十五) ASH、ADDM、AWR

ASH(Active Session History)

ASH以V$SESSION为基础,每秒采样一次,记录活动会话等待的事件。不活动的会话不会采样,采样工作由新引入的后台进程MMNL来完成。ASH buffers 的最小值为1MB,最大值不超过30MB.内存中记录数据。期望值是记录一小时的内容。

AWR(Automatic Workload Repository)

自动工作负载信息库

ASH 内存记录数据始终是有限的,为了保存历史数据,引入了自动负载信息库(AutomaticWorkload Repository ,AWR) 由后台进程MMON定期的将ASH信息同步到AWR负载库中。ASH全部写出是不可接受的,所以一般只写入收集的10%的数据量,而且使用direct-path insert完成,尽量减少日志的生成,从而最小化数据库性能影响。

写出到AWR负载库的ASH信息记录在AWR的基础表wrh$active_session_hist中,wrh$active_session_hist是一个分区表,Oracle会自动进行数据清理。

AWR 是Oracle安装好后自动启动的,不需要特别的设置。收集的统计信息存储在SYSAUX表空间SYS模式下,以WRM$_*和WRH$_*的格式命名,默认会保留最近7天收集的统计信息。每个小时将收集到的信息写到数据库中,这一系列操作是由一个叫MMON的进程来完成的。

snapshot的生成周期是每小时,数据保留8天。

手工执行快照

 Exec dbms_workload_repository.create_snapshot;

可以通过视图查询

SQL> select * from DBA_HIST_WR_CONTROL;

      DBID SNAP_INTERVAL							       RETENTION								   TOPNSQL
---------- --------------------------------------------------------------------------- --------------------------------------------------------------------------- ------------------------------
1417794109 +00000 01:00:00.0							       +00008 00:00:00.0							   DEFAULT

可以使用DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS来修改snap_interval 和retention。

ADDM (Automatic Database Diagnostic Monitor AWR) 

Oracle内部的一个顾问系统,能够自动的完成最数据库的一些优化的建议,给出SQL的优化,索引的创建,统计量的收集等建议。每当生成一次AWR的snapshot时,系统会自动根据当前snapshot和上一次的snapshot,给出一个ADDM报告。ADDM报告只显示系统任务有问题的项目。

生成ash报告

SQL> @?/rdbms/admin/ashrpt.sql

EM->Performance->Average Active Sessions的右上方[Run ASH Report]

生成awr报告

SQL> @?/rdbms/admin/awrrpt.sql

快照之间实例不能关闭。

创建baseline

Exec
DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE(start_snap_
id,end_snap_id ,baseline_name);

awr比对报告

@?/rdbms/admin/awrddrpt

RAC全局awr

@?/rdbms/admin/awrgrpt
时间: 2024-10-25 19:54:20

Oracle 学习之 性能优化(十五) ASH、ADDM、AWR的相关文章

Oracle 学习之性能优化(五)执行计划

读懂执行计划有什么用呢? 执行计划贯穿Oracle调优始终. 了解执行计划的真实执行过程,将有助于优化. 对亍Oracle的原理理解有一定帮助. 读懂执行计划,SQL调优的第一步. 什么是SQL Execution Plan执行计划? SQL是声明型语言,她只说我要去哪里,但很少告诉你到底如何去? SQL语句的执行最终会落实为Oracle执行步骤的组合 =>[SQL执行计划] 查看执行计划的方法 SQLPLUS AUTOTRACE Explain Plan For SQL SQL_TRACE 使

Oracle 学习之 性能优化(十二) 分区表

一.分区概念 Oracle允许将表.索引.索引组织表细分成更小的片,每个片我们称之为分区.分区有其自己的名字和存储参数. 如下图: 每行数据只能属于一个分区,分区键决定数据行属于哪个分区.分区键由一个或多个列组成.Oracle自动的将数据的DML操作映射到相应的分区中. 何时使用分区表: Tables greater than 2 GB should always be considered as candidates for partitioning. Tables containing hi

Oracle 学习之性能优化(三)绑定变量

根据Oracle 学习之性能优化(二)游标中的描述,我们知道如下两条语句是不共享的. select * from emp where empno=7698; select * from emp where empno=7566; 这样就造成每次执行用户的查询都要进行硬解析,但是我们知道,其他这两个语句的执行计划应该是相同.那么有什么方法能避免不必要的硬解析吗?这里我们提供2种方法. 一.绑定变量 SQL> variable empno number; SQL> exec :empno := 7

Oracle 学习之性能优化(八)优化器

 我们知道,在sql语句解析的过程中,有一个过程叫优化.Oracle中有一个叫优化器的组件,专门来处理sql的优化.在考虑查询条件和对象引用的许多相关因素后,优化器能确定出执行SQL语句最有效的方式来.对于任何SQL语句,优化器优化的结果,可以极大地影响执行时间. Oracle优化器的优化方法有两种: CBO 基于成本的优化法则 RBO 基于规则的优化法则 初始化参数optimizer_mode控制着优化器优化的行为 SQL> show parameter optimizer_mode NAME

Oracle 学习之性能优化(十)锁

锁(lock)是用于防止在访问相同的资源(包括用户对象.系统对象.内存.Oralce数据字典中的共享数据结构,最常见的是数据库表Table对象)时 ,事务之间的有害性 交互(存.取)的一种机制. 不同类型的锁,代表了当前用户是允许还是阻止其它用户对相同资源的同时存取,从而确保不破坏系统数据的完整性.一致性和并行性. 加锁是实现数据库并发控制的一个非常重要的技术.当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁.加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能

Oracle 学习之 性能优化(十三) 索引

一.索引概念 索引是一种供服务器在表中快速查找一个行的数据库结构.合理使用索引能够大大提高数据库的运行效率. 在数据库中建立索引主要有以下作用. (1)快速存取数据. (2)既可以改善数据库性能,又可以保证列值的唯一性. (3)实现表与表之间的参照完整性 (4)在使用order by.group by子句进行数据检索时,利用索引可以减少排序和分组的时间. 在关系数据库中,每一行都由一个行唯一标识RowID.RowID包括该行所在的文件.在文件中的块数和块中的行号.索引中包含一个索引条目,每一个索

Oracle 学习之性能优化(九)使用hint

基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担.但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比.此时就需要DBA进行人为的干预,告诉优化器使用我们指定的存取路径或连接类型生成执行计划,从 而使语句高效的运行.例如,如果我们认为对于一个特定的语句,执行全表扫描要比执行索引扫描更有效,则我们就可以指示优化器使用全表扫描.在Oracle 中,是通过为语句添加 Hints(提示)来实现干预优化器优化的目的. 不建议在代码中使用hint,

Oracle 学习之性能优化(六)访问路径

访问路径是指Oracle找到用户需要的数据的方法,这些方法很少,包括: 声名狼藉的全表扫描--人们不惜一切视图避免的(曲解的)访问路径. 各种类型的索引扫描--这是人们感觉良好的访问路径(多数情况下是被曲解的). 通过hash或者rowid的方式直接访问,通常对于单数据行来说,是最快的. 并没有一种访问路径是最好的,如果有,那么Oracle只需提供这一种访问路径就好了. 全表扫描 全扫描就是顺序的读取表中的所有数据块.采用多块读的方式,从头开始扫描表中的块,直到高水位线.全扫描是处理大数据量行之

Oracle 学习之性能优化(七)join的实现方式

本文讨论一下join技术背后的机制.我们知道常用的表连接有如下几种 笛卡尔连接 内连接 左外连接 右外连接 全连接 这些sql的写法,想必大家都很清楚了,那么这些连接的数据访问是如何实现的呢? nested loop 我们看如下查询 SQL> alter session set optimizer_mode=rule; Session altered. SQL> select ename,dname from emp,dept where emp.deptno=dept.deptno; 14