cache buffers chains vs cache buffers lru chain

tsinglee發表於2008-05-16

http://luckysea.itpub.net/post/5481/323246
cache buffers chains當一個資料塊讀入sga區,相應的buffer header會被放置到hash列表上,我們稱其這hash chains,chain在中文的意為鏈條或串的意思,表達就是關連性.如果一個程式想訪問或修改hash chain上的block,它首先要獲得"cache buffers chains" latch。

cache buffers chains latch等待高大體有兩個方面:

1、寫的比較差的sql
cache buffers chains latch很大程度與邏輯讀有關,所以要觀注v$sql中BUFFER_GETS/EXECUTIONS大的語句。
同時每一個邏輯讀需要一個latch get 操作及一個cpu操作,這樣的sql也會很耗cpu資源。

2、熱塊
即多個程式讀同一個或幾個block的狀況,這要考慮應用的設計了,為什麼會出現這樣的情況,改善可以這樣:

聯合v$session_wait及x$bh檢視找到相應的熱塊程式最佳化
示例sql
程式碼:--------------------------------------------------------------------------------
SELECT A.HLADDR, A.FILE#, A.DBABLK, A.TCH, A.OBJ, B.OBJECT_NAME
FROM X$BH A, DBA_OBJECTS B
WHERE (A.OBJ = B.OBJECT_ID OR A.OBJ = B.DATA_OBJECT_ID)
AND A.HLADDR = &P1RAW
UNION
SELECT HLADDR, FILE#, DBABLK, TCH, OBJ, NULL
FROM X$BH
WHERE OBJ IN (SELECT OBJ
FROM X$BH
WHERE HLADDR = &P1RAW
MINUS
SELECT OBJECT_ID
FROM DBA_OBJECTS
MINUS
SELECT DATA_OBJECT_ID FROM DBA_OBJECTS)
AND HLADDR = &P1RAW
ORDER BY 4;--------------------------------------------------------------------------------

改變熱塊的途徑就是儘量讓一個block存少一些資料,比如加大pctfree引數.同時化化應用分散熱塊很重要。

cache buffers lru chain
這也是一個記憶體結構,用於標識哪些buffer操作狀態的,比如哪些是"髒資料"需要DBWn回寫到資料檔案。可以適當加大_DB_BLOCK_LRU_LATCHES及提升DBWn的寫速度得以解決。

cache buffers lru chain多也是bad sql語句的一個徵兆,表明了buffer cache操作很頻繁。比如做全表掃描或重複的掃描一個選擇性很差的索引都會造成cache buffers lru chain的競爭。透過v$session_wait,v$session,v$sqltext找到相關的語句進行最佳化也很必要。

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10599713/viewspace-1004135/,如需轉載,請註明出處,否則將追究法律責任。

相關文章