淺談Oracle Result Cache

yingyifeng306發表於2021-05-06

Introduction

眾所周知快取是關係型資料庫中一種重要機制,記憶體的訪問速度遠遠高於磁碟,把經常使用的資料存放於記憶體中來提高檢索速度已不是什麼新鮮事了。

Result cache overview

我們知道資料庫在構建一個 SQL 查詢結果時,不僅需要在訪問資料上消耗時間,資料的排序、聚合以及連線操作也會消耗一部分時間。對此 Oracle 11GR1 引入了結果集快取( Result Cache ),目的就是將結果直接放入記憶體中來節省構建結果集所花費的時間和資源。引擎可以直接返回結果,而不必在 Cache 中讀取資料。

我們可以把 SQL 執行概括為三大階段 :

1. 從儲存獲取資料到記憶體(對於尚未在快取中的資料)

2. 對快取資料集進行篩選

3. 返回結果集給客戶端

Result Cache 啟用的情況下,不僅會把結果集返回給客戶端,而且還會把結果集快取在 Shared Pool 特定一塊區域內。當任何客戶端執行類似 SQL 返回相同結果時, Oracle 會跳過 1 2 直接從 result cache 中返回結果,大大提高了效能。

Result Cache 可以分為: Server Result Cache Client Result Cache

Server Result Cache :對於 Server Result Cache: 伺服器端結果集快取,在 Shared Pool 中單獨分配一塊記憶體來進行結果快取。

Client Result Cache :可以透過客戶端記憶體來快取查詢結果集,並可以在所有 session 間共享,當查詢反覆執行時,查詢結果可以直接從客戶段的快取中獲得,從而極大地提高應用效率。

 

Result Cache 特性可以透過一些動態引數進行控制。用以定義結果集的記憶體池的大小,觸發的方式等。

 

 

 

預設情況下 Result Cache 是開啟的,所有開發人員都可以使用該特性。

1. 表級別使用

2. 語句級別使用

預設情況下,如果基礎表發生改變,則 Oracle 會將 Result Cache 中的結果集置為無效。使得客戶端不會從結果快取中獲取過時的資料。 當查詢執行時, Result Cache 將自動填充,然後在提交 DML 時無效。

 

Result Cache 使用監控(相關檢視包及檢視)

v$result_cache_statistics                            記憶體統計資料

v$result_cache_object                                物件跟屬性

v$result_cache_dependency                     顯示結果的依賴關係

v$result_cache_memory                            顯示記憶體塊及統計資料

 

limits

Result Cache 與其他 Oracle 部分記憶體池類似也是透過 Latch 鎖進行保護,讀取快取池時需要持有共享鎖,修改時(用於新增新的結果集或使現有結果集無效)需要持有排他鎖,以避免別的會話同時訪問。

因此頻繁的更新 Result Cache 中對應的表格會引起 Latch 鎖的爭用(特別是 RC Latch ),

如果在某些物件上幾乎所有查詢都使用結果快取,情況會更糟。

 

 

Case

某客戶從 AIX 平臺遷到 x86 穩定執行半個月後,高峰期時常出現卡頓,提取故障點的 awr ash 報告。   從上述等待事件可以看出資料庫大部分時間都花在 enq: TX - row lock contention latch free 上。

第一反應可能覺得是 enq: TX - row lock contention 引起的故障,一開始我也犯了同樣的錯誤,但隨後與開發溝通後發現從遷移之後程式程式碼並無變化。既然業務邏輯沒有改變 TX 鎖引起此次故障可能性不大,初步判定是由於 latch free 使得 TX 鎖加劇。繼續檢視 latch free 相關的資訊。

latch 的資訊統計,定位主要元兇是 Result Cache:RC Latch

檢視 result 相關引數其中 result_cache_mode force ,解決辦法可以直接把 result_cache_mode 改成 manual 或直接禁用 result cache 設定 result_cache_max_size 0

 

Conclusion

Result Cache Oracle 又一個進步,能大幅提升效能,但也像其他特性一樣不是所有的會話都適用。


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