等待事件分为主动触发事件与被动触发事件。
主动触发事件:发生一次就进性一次记录,例如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
陆续补充!