|
"# cat logic_read1.log|grep "entry 8ea1d750"
3 111575 sskgslcas:entry i=517 PID::entry:==pid970racle:sskgslcas:entry 8ea1d750 0 20000016 fdc3f1e4 fdc3f18c fdc3f1e4
3 111578 sskgsldecr:entry i=526 PID::entry:==pid970racle:sskgsldecr:entry 8ea1d750 20000016 fdc3f1e4 fdc3f18c fdc3f1e4 804544c
3 111575 sskgslcas:entry i=552 PID::entry:==pid970racle:sskgslcas:entry 8ea1d750 0 20000016 1 fdc3f17c 81e1c064
3 111578 sskgsldecr:entry i=566 PID::entry:==pid970racle:sskgsldecr:entry 8ea1d750 20000016 1 fdc3f17c 81e1c064 8045510
这四行,两个函数调用,sskgslcas、sskgsldecr,第一个参数都是Latch的地址:8ea1d750。我相信这不是巧合,它们肯定是申请、释放Latch的函数。
i=517这行,Oracle调用sskgslcas持有Latch,在i=526这行,调用sskgsldecr释放,接下来在i=552又一次调用sskgslcas持有Latch,在i=566处调用
sskgsldecr释放。一次逻辑读对应两次Latch调用。"
一次逻辑读取一个buffer header,需要两次持有cache buffer chain latch,我的理解是,既然能够读取buffer_header ,说明该buffer是在LRU链的冷端尾部,
TCH<2,这个时候需要持有一次latch把次buffer_header从LRU链的冷端尾部取下,然后,当该buffer被独占之后,显然,该buffer已经不属于“冷”块了,因此,需要再次持有一次latch把该buffer_header挂到LRU的中间部位。
因此,“一次逻辑读取一个buffer header,需要两次持有cache buffer chain latch”
|
|