发表于: 2010.06.25 09:51
分类: 一般分类
出处: http://daveluo.itpub.net/post/42121/501299
---------------------------------------------------------------
select event,
sum (decode(wait_Time, 0 , 0 , 1 )) "Prev",
sum (decode(wait_Time, 0 , 1 , 0 )) "Curr",
count (*) "Tot"
from v$session_Wait
group by event
order by 4 ;
一 等待事件概述
Oracle 的等待 事件是衡量 oracle 运行状况的重要依据及指标 .
等待事件的概念是在 Oracle7.0.1.2 中引入的,大致有 100 个等待事件。在 Oracle 8.0 中这个数目增加到了大约 150 个,在 Oracle8i 中大约有 200 个事件 , 在 Oracle9i 中大约有 360 个等待事件。
主要有两种类别的等待事件,即空 闲( idle )等待事件和非空闲( non-idle )等待事件。
空闲等待事件是指 Oracle 正等待某种工作 , 比如用 sqlplus 登录之后,但没有进一步发出任何命令,此时该 session 就处于 SQL*Net message from/to client 等待事件状态,等待用户发出命令,任何的在诊断和优化数据库的时候 , 我们不用过多注意这部分事件。非空闲等待事件专门针对 Oracle 的活动 , 指数据库任务或应用运行过程中发生的等待,这些等待事件是我们在调整数据库的时候应该关注与研究的。
二 oracle 等待事件类型
每一个等待事件都属于某一类 , 下面给出了每一类等待事件的描述 .
管理类 : administrative
类等待事件是由于 DBA 的管理命令引起的,这些命令要求用户处于等待状态,比如,重建索引。
应用程序类 :
此类等待事件是由于用户应用程序的代码引起的(比如:锁等待) .
群集类: Cluster
此类等待事件和真正应用群集 RAC 的资源有关。(比如: gc cr block busy 等 待事件) .
此类等待事件只包含一种等待事件--在执行了一个 commit 命令后,等待一个重做日志写确认(也就是 log file sync ) .
此类等待事件是由内部数据库资源引起的,比如闩锁。
此类等待事件是由数据库或实例的不当配置造成的,比如,重做日志文件尺 寸太小,共享池的大小等。
此类等待事件意味着会话不活跃,等待工作。比如 ,sql * net messages from client 。
和网络环境相关的一些等待事件,比如 sql* net more data to dblink 。
此类等待事件通常比较少见。
Resource Manager related waits (for example, 'resmgr: become active')
此类等待事件通过是由后台进程的 I/O 操作引起的,比如 DBWR 等待, db file paralle write 。
此类等待事件通常是由用户 I/O 操作引起的 , 比如 db file sequential read 。
三 等待事件详细描述
1, db file scattered read (DB 文件分散读取 )
这种情况通常与全表扫描相关 . 当数据库进行全表扫描时 , 基于性能的考虑 , 数据会分散 (scattered) 读入 buffer cache. 如果这个等待事件比较显著 , 可能考虑查看对应的表有没有创建合适的索引 .
然而这个等待事件并不一定就意味 着性能低下 , 在某些条件下 oracle 会主动使用全表扫描来替换索引扫描以提高性能 , 这和访问的数据量有关 , 在 CBO 下 oracle 会进行更为智能的选择 , RBO 下 oracle 更倾向于使用索引 .
因为全表扫描到内存的数据块被置 于 LRU 链表的冷端 , 所以这些数据块将可能在较短时间内被置换出物理内存 , 为了避免反复物理 IO, 对频繁访问的较小的数据表 , 可以选择把他们 cache 到内存中 .
当这个等待时间比较显著时 , 可以结合 v$session_longops 动态性能视图来进行诊断 , 该视图中记录了长时间 ( 运行时间超过 6 秒 ) 运行的事务 , 可能很多是全表扫描操作 .
2, db file sequential read(DB 文件顺序读取 )
这一事件通常显示与单个数据块相 关的读取操作 , 比如对索引块的读取 . 如果这个等待事件比较显著 , 可能表示在多表连接中 , 表的链接顺序存在问题 , 可能没有正确的使用驱动表 ; 或者可能说明不加选择地进行索引 .
3, free buffer ( 释放缓冲区 )
这个等待事件表明系统正在等待内 存中的可用空间,这说明当前 Buffer 中已经没有 Free 的内存空间。 Free Buffer 等待可能说明 DBWR 的写出速度不够,或者磁盘存在严重的竞争,可以需要考虑增加检查点、使用更多的 DBWR 进程,或者增加物理磁盘的数量 , 分散负载,平衡 IO 。
4, buffer busy( 缓冲区忙 )
该等待事件表示正在等待一个以 unshareable 方式使用的缓冲区,或者表示当前正在被读入 buffer cache 。一般来说 Buffer Busy Wait 不应大于 1% 。检查缓冲等待统计部分 ( 或 V$WAITSTAT) ,看一下等待是否位于段头 (Segment Header) 。如果是,可以考虑增加自由列表 (freelist ,对于 Oracle8i DMT) 或者增加 freelist groups( 在很多时候这个调整是立竿见影的,在 8.1.6 之前,这个 freelists 参数不能动态修改 ; 在 8.1.6 及以后版本,动态修改 feelists 需要设置 COMPATIBLE 至少为 8.1.6).
--------------------------------- --------------------------------- --------------------------------- --------------------------------- ---------------------------------
在oracle 9i中等待事件是不分类的,查找起来非常不方便,在10g中得到了彻底的改善,对等待事件进行了分类(一共12个)。
0 Administrative,DBA的命令导致的等待,如重建索引;
1 Application :应用程序代码导致等待,如行级锁和显式的表锁;
2 Cluster:RAC相关资源导致的等待,如全局缓存资源而导致的等待-gc cr block busy
3 Commit:这个类别仅和一个等待事件相关,在发出commit命令后等待redo log write 确认,这个事件是log file sync.
4 Concurrency :内部资源造成的等待,如latches。
5 Configuration:由于实例或数据库资源配置不当而造成的等待,如不适当的redo log buffer size 和 shared_pool size;
6 Idle:Session为非活动的且等待工作,此类事件属于此范畴,典型的如 'SQL*Net message from client';
7 Network:网络相关等待,如'SQL*Net more data to dblink'
8 Other:通常不会发生的等待,如 'wait for EMON to spawn';
9 Scheduler:资源管理器相关等待,如'resmgr: become active';
10 System I/O:后台进程的IO等待,如DBWR wait for 'db file parallel write'
11 User I/O:用户进程的IO/等待,如db file sequential read'。
--------------------------------- --------------------------------- --------------------------------- --------------------------------- --------------------------------- ---------------------------------
This view lists block contention statistics. This table is only updated when timed statistics are enabled.
Sum of all wait times for all the waits by this OPERATION for this CLASS of block |
select * from V$WAITSTAT
CLASS | COUNT | TIME |
data block | 318671 | 91287 |
undo header | 50352 | 1172 |
undo block | 28 | 1 |
segment header | 10 | 5 |
file header block | 8 | 1 |
1st level bmb | 3 | 0 |
bitmap index block | 0 | 0 |
system undo block | 0 | 0 |
system undo header | 0 | 0 |
unused | 0 | 0 |