您的位置:首页 > 数据库 > Oracle

Oracle 常见的几种等待事件

2020-07-14 06:27 225 查看
等待事件分为主动触发事件与被动触发事件。
主动触发事件:发生一次就进性一次记录,例如IO等
被动触发事件:例如latch的获取,只有当遇到阻塞时,获取不到时,才会记录该等待事件,如果没有阻塞,即使获取的时间再长,也不会记录该事件。

buffer busy wait:

读不阻塞写,写阻塞读。等待的元凶只能是DML语句
因为当一个用户A读取buffer时,首先获得CBC latch,然后修改buffer pin的锁为共享模式,然后释放CBC latch,此时用户B修改buffer,获得CBC latch,发现buffer pin上有共享锁,会克隆一个这个buffer,克隆后,源buffer的状态改为CR,新复制的buffer状态改为xcur,修改新复制的buffer 的buffer pin为独占模式,新复制的buffer用于修改。当此时再有一个用户C读取buffer时,发现新复制的buffer上有独占buffer pin。所以只能等待,会产生buffer busy wait。

log buffer space:

如果log buffer中没有空间,进程会先等待lgwr刷新log buffer中的空间。

DB file parallel write:

当DBWR写脏块时,会将脏块从检查点队列中移到各个对象的对象链表上进行合并(整合),如果一次性要写入的脏块太多,Oracle会分批进行合并,也就是将要写入的脏块分成几个Batch,然后分别依次对每个Batch进行合并,当第一个Batch开始写脏块前,DBWR会记录一个等待事件db file parallel write,直到这一个Batch所有脏块的写操作都完成了,db file parallel write事件才结束。可以通过db file parallel write 确定Batch的个数。
对象链表:用于写IO合并

free buffer wait:

当服务器进程扫描LRU链表寻找可用块时,如果找了百分之40的buffer(百分之40受_db_block_max_scan_pct控制)还没有找到可以覆盖的buffer,进程将停止继续扫描LRU,唤醒DBWR写脏块,同时进程转入睡眠,开始等待free buffer waits。

log file switch:

日志切换等待,需要等待DBWR写完下一个要覆盖的日志中脏块。

db file scattered read:

全表扫描等多块读访问路径触发的等待事件

db file sequence read:

单块读访问路径触发的等待事件

direct path read

将数据块直接读取到PGA中而不是SGA,当出现该等待事件时,意味着PGA空闲空间不足。

direct path write

直接从PGA写入磁盘文件上,不经过SGA

陆续补充!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: