buffer cache實驗5-latch:cache buffers chain
1.CBC latch產生的原理:
一次邏輯讀時CBC latch鎖及Buffer pin鎖的獲取和釋放過程如下:1.加Latch X
2.進入hash chain,在相應的BH上加Buffer pin S (0-->1)
3.釋放Latch X
4.進行邏輯讀--也就是通過BH中的buffer adderss找到資料塊在記憶體中真實位置 ---假如讀了1MS
5.加Latch X
6.釋放Buffer pin S (1-->0) 0:沒鎖 1:共享鎖 2:獨佔鎖
7.釋放Latch X
物理讀時需要將資料塊的buffer header掛載到hash chain上,也需要獲取CBC LATCH,buffer header中有hash chain的資訊,BH掛載到hash chain上,應該在BH記憶體結構中會有資訊更改,BH的修改也就需要有Buffer pin了,鎖的獲取和釋放應該和邏輯讀時差不多,不過是在Buffer pin S 上要加2號獨佔鎖。當然這一點是我大膽推測的哈哈。
CBC latch上一般都用的獨佔鎖,使用共享鎖的情況是:9I後在索引的根、枝葉讀時使用共享CBC LATCH,無BUFFER PIN方式訪問上
BH上Buffer pin鎖狀態:
0 未加鎖
1 共享鎖,讀BUFFER BLOCK ---SELECT
2 獨佔鎖,寫BUFFER BLOCK ---DML語句
2.從CBC latch產生的原理可以發現,出現CBC LATCH爭用會有以下情況:
1.CBC latch保護不同的連結串列、不同BH :同一CBC LATCH下多個hash chain上的多個BH被同時訪問時,
2.CBC latch保護同一連結串列下同一BH :同一hash chain上同一BH被同時訪問時
3.物理讀將資料塊掛載到hash chain上時,多個物理塊HASH衝突都掛載到同一個hash chain或者要掛載的hash chain上的BH在被邏輯讀
這裡的被訪問,可能發生在邏輯讀或者物理讀,即:使用到CBC latch的場景是:
伺服器程式需要掃描hash chain上資料塊--邏輯讀
伺服器程式需要將資料塊掛載到hash chain上--物理讀
關於hash chain與hash bucket,詳見本系列第一篇:點選開啟連結
3.關於CBC LATCH爭用的模擬實驗,有兩種思路:
一是熱鏈--這個不太好模擬,我也沒做成功。二是熱塊-這個好模擬,同時還會有buffer busy waits,具體實驗見:點選開啟連結
4.latch: cache buffers chains 解決思路:
1、熱鏈:調整_db_block_hash_latches加大latch數量,作用是減少同一LATCH下多個桶被同時訪問的情況。即多個表的相應塊在BUFFER CACHE中對應不同BH,不同BH又對應在不同HASH BUCKETS,但是這多個HASH BUCKETS是屬於同一個LATCH。。
alter system set "_db_block_hash_latches"=10240 scope=spfile;
2、熱塊:調整BUFFER _CACHE,引數:db_cache_size,big integer 100M
熱塊是:同一表在BUFFER CACHE中的塊(一個塊對應一個BH,BH對應一個HASH BUCKET)被多個會話同時讀,--全表掃描時容易出現。可以使用多個會話同時讀取同一表的同一行的方式來模擬產生CBC latch,查詢時使用ROWID做條件,查詢速度快,更容易引起CBC latch。
3、修改應用,減少全表掃描,也就是優化SQL語句了
SYS@ bys3>col name for a20
SYS@ bys3>select NAME,GETS ,MISSES ,SLEEPS ,IMMEDIATE_GETS, IMMEDIATE_MISSES from v$latch where name like '%cache buffers chains%';
NAME GETS MISSES SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES
-------------------- ---------- ---------- ---------- -------------- ----------------
cache buffers chains 2006932 0 0 78095 0
相關文章
- 用於排查cache buffers chainsAI
- Oracle Cache Buffer ChainsOracleAI
- IO之核心buffer----"buffer cache"
- 【Cache】將常用的“小表”快取到Buffer Cache快取
- library cache lock和library cache bin實驗_2.0
- 33、buffer_cache_3(redo的產生、LRBA、buffer cache裡的等待事件)事件
- Linux Buffer/Cache 的區別Linux
- buffer與cache的區別
- Buffer Cache以及buffer busy waits/gc相關事件AIGC事件
- 【BUFFER】Oracle buffer cache之 latch 學習記錄Oracle
- 清理buffer/cache/swap的方法梳理
- PostgreSQL DBA(89) - Linux(Buffer vs Cache)SQLLinux
- Linux記憶體、Swap、Cache、BufferLinux記憶體
- Cache 和 Buffer 的區別在哪裡?
- Cache 和 Buffer 有什麼區別?
- buffer cache深度分析及效能調整(五)
- buffer cache深度分析及效能調整(四)
- buffer cache深度分析及效能調整(六)
- Linux工具效能調優系列二:buffer和cacheLinux
- Linux如何手動釋放Swap、Buffer和CacheLinux
- PostgreSQL的shared_buffers和系統OS cache的關係SQL
- [20231023]備庫與alter system flush buffer_cache.txt
- 手動釋放Linux上的Swap、Buffer和CacheLinux
- Cache和Buffer都是快取,有什麼區別?Linux快取Linux
- library cache pin和library cache lock(一)
- library cache pin和library cache lock (zt)
- library cache pin和library cache lock(二)
- Guava CacheGuava
- Spring CacheSpring
- Service Worker Cache 和 HTTP Cache 的區別HTTP
- MySQL:Table_open_cache_hits/Table_open_cache_misses/Table_open_cache_overflowsMySql
- Library Cache最佳化篇(一)降低library cache lock和library cache pin的方法
- PWA(Progressive Web App)入門系列:Cache Storage & CacheWebAPP
- Client Side Cache 和 Server Side Cache 的區別clientIDEServer
- LRU cache原理及go實現Go
- guava cache過期方案實踐Guava
- 調整緩衝區快取記憶體(Buffer Cache)的效能(轉)快取記憶體
- Cache Aside PatternIDE
- torrent cache websiteWeb