Oracle典型的等待事件及其分析

  1.  db file scattered read:离散读,表示session正从存储上进行多块读取,发生这个等待事件表示可能正在发生全表或者全索引扫描。这个等待事件太多就需要分析是不是有一些存在不合理全表扫描的语句存在(没有建立合适的索引)。
  2. db file sequential read:顺序读,表示session正从存储上顺序的进行单块读取,发生这个等待事件表示可能正在发生通过索引读取表的数据。这个等待事件太多就需要分析是不是有一些不合理查询路径存在,语句是不是使用了效率不高的索引,是不是在索引扫描中有太多的冗余扫描(没有用到最优的索引、查询路径不优)。
  3. direct path read/write:这个等待事件表示PGA直接从存储(实际上一般就是临时表空间)上读写数据,不通过SGA,发生这个等待事件表示可能正在发生排序或者hash操作(hash join表连接方式)且这个操作无法全部在内存中完成,需要使用到临时表空间。这个等待事件太多就要分析是不是有太多的排序(没有必要的一些排序操作)或者太多的hash join(不合理的表连接方式)、或是相关的内存空间设置不足(8i为sort_area_size、hash_area_size,9i以上为PGA)。
  4. enqueue:锁等待。比如TX类型的enqueue(dml锁等待),在10g中做了更加细致的划分,TX锁等待单独列示为enq:TX。这样的等待事件太多,就需要看看有没有一些不合理的并发的资源修改(比如并发的操作去修改相同的数据而没有合理控制)。
  5. buffer busy wait:热块等待的一种,表示正在等待从存储或者内存读取的一个块。在10g中又分出了等待事件read by other session,跟buffer busy wait实际是同一等待事件。 buffer busy wait太多就必须考虑是不是存在对某些相同数据过量的并发访问。(block作为一个基础单位,实际上真正意义上读写操作都是串行的,即使读一个块,也是一个session一个session依次来作的)(发生大量的热块等待,1是确实并发操作过大,2是大量不够优化的查询扫描了太多的冗余数据造有很多需要读取数据的重复部分)
  6. latch free:等待取得需要的latch。latch是oracle用于保护内存结构的一种锁,要访问相关的内存结构(不管是data buffer中的数据块还是shared pool中的数据字典、sql语句、执行计划等等),都需要取得对应内存结构的latch。由于latch的数量是有限的,且实际上latch的取得和使用基本上串行的,因此大量对资源的并发操作就有可能造成latch free等待。

几种常见的latch

  1. cache buffers chains latch:在10g中单独体现为latch:cache buffers chains,这是热块等待的一种,表示正在等待data buffer中相关数据块的latch。这个等待很多,也是按照热块的原因去分析;跟buffer busy wait略有不同是,它的原因更倾向于并发访问相同的一大块数据。
  2. shared pool latch、library cache latch:在10g中单独体现为latch:shared pool、latch:library cache,表示正在等待从shared pool中分配一块连续空间来执行sql语句。这个等待过多,表示shared pool短缺或者对shared pool消耗过大,比如sql语句没有使用绑定变量或者动态拼接出过于巨大的sql语句。
  3. library cache lock latch、library cache pin latch:在10g中单独体现为latch:library cache lock、latch:library cache pin,表示正在等待在shared pool中锁住一个对象,通常发生于需要对对象作ddl操作时对象正被调用或要调用对象时对象正处于dll操作中,比较常见的是编译package、procedure、function时它们正在运行或想调用package、procedure、function时它们正在被编译。
  4. row cache objects latch:表示正在等待锁住相关对象的数据字典,当进程需要加载、引用或清除相关的数据字典对象时(数据库中的许多操作都需要锁住相关的数据字典,比如生成sql的执行计划时涉及到通过同义词引用对象、使用view时view里引用相关的table或者view等等),必须取得这个latch。比较典型的是过大并发的访问sequence的nextval,因为取nextval可能会改变sequence的start with值(如果是从cache中取就不会),这就需要锁定sequence的数据字典;解决方法是增大cache值以适应并发程度。

redo log相关的一些等待事件

  1. log file sync:等待将redo log写到日志组中,这个等待事件表示当前产生redo log的速度比redo log写日志组的速度要快或log file间写满后的切换有些慢。
  2. log file switch (archiving needed):等待日志组的第一个log file完成归档,这个等待事件表示日志归档速度跟不上当前产生redo log的速度。
  3. log file switch (checkpoint incomplete):等待日志组的第一个log file涉及的相关被修改的数据从内存写到存储,这个等待事件表示数据从内存写到存储可能有I/O缓慢。
  4. 出现比较多的redo log相关的等待事件,一般来说表示redo log产生的速度远远超过了redo log归档的速度。解决的方法,1是增加日志组或提高redo log归档速度,2是减小一些不必要的redo log(比如将逐条语句依次dml操作修改为一条语句批次dml批量记录、使用一些global temporary等)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值