共計 2879 個字符,預計需要花費 8 分鐘才能閱讀完成。
本篇文章給大家分享的是有關 sga 中 library cache 的內部原理是什么,丸趣 TV 小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著丸趣 TV 小編一起來看看吧。
一、概述
library cache(庫緩存)是 shared pool 中的一塊內存區域,它的主要作用是緩存剛剛執行過的 sql 語句和 pl/sql(包括存儲過程、包、函數、觸發器)所對應的解析計劃、解析樹等對象,當同樣的 sql 或 pl/sql 再次被執行時,就可以直接利用在 library cache 中的那些相關對象,而無需再次從頭開始解析,這樣提高了這些語句的執行效率。
查看 library cache 在內存中的位置。
緩存在 library cache 中的對象我們稱之為庫緩存對象(library cache object), 所有的庫緩存對象都是以庫緩存對象句柄(library cache object handle)的結構存儲在 library
cache 中,oracle 通過訪問庫緩存對象句柄來訪問庫緩存對象。
庫緩存對象句柄是 oracle 自定義的一種 c 語言復雜結構,它是以 hash table 的方式存儲在 library cache 中的,這意味著 oracle 會通過 hash 運算來存儲和訪問對應的庫緩存對象句柄。
下圖為從 hash 角度分析庫緩存的構成:
由上圖可看出,整個 library cache 可以看作是一組由 hash bucket 所組成,每一個 hash bucket 所對應的不同的哈希值。對于單個 bucket 而言,里面存儲的就是哈希值相同的所有庫緩存對象句柄,同一個 hash bucket 中不同的庫緩存對象句柄之間會用指針鏈接起來,即同一個 hash bucket 中不同的庫緩存對象句柄之間實際上組成了一個庫緩存對象句柄鏈表(library
cache object handles)。一個 library handle 管理著一個 libirary cache object(lco),handle 對實際的 lco 起到元數據和指針作用,lco 保存著實際信息。
當運行 select * from employees 時,oracle 會計算 sql 文本的哈希值,以此尋找相關的 hash bucket,遍歷庫緩存對象句柄鏈表,如果能找到則可直接使用解析計劃、解析樹等信息,若找不到,則需要從頭開始解析,生成解析樹、解析計劃等并存儲在 library cache object handle 中。
library
cache object handle 結構圖:
庫緩存對象句柄有 name、namespace 等屬性組成,著重分析 name、namespace、heap 0 這三個屬性。
屬性“name”表示庫緩存對象句柄所對應的庫緩存對象名稱。例如如果是 sql 語句對應的庫緩存對象句柄,則屬性 name 就是該 sql 語句的 sql 文本;如果是表對應的庫緩存對象句柄,則屬性 name 就是該表的表名。
屬性“namespace”表示的是庫緩存對象句柄對應的庫緩存對象所在的分組名,不同類型的庫緩存對象句柄可能屬于同一個分組。
屬性“heap 0 pointer”:這里要說明下 library cache object handle 類似 c 語言的結構體,library cache object handle 中還嵌套了一些子結構,其中 heap
0 pointer 是指向子結構 heap 0 的指針
在 library cache 中,bucket 初始化的數量受隱藏參數 _kgl_bucket_count 參數控制。
值為 9,則理論上應分配 2^9*256=131072 個 bucket.
通過 library cache dump 可發現,bucket 為 131072。在 library
cache dump 中,size 為 Buckest 的數量,count 為 Object Handles 的數量。
heap 0 pointer(一說為 heap 0 object) 就是指向子結構 heap 0 的指針,heap 0 的結構如下:
heap 0 也是一種復雜的結構,它有很多屬性,
tables 屬性:記錄的是與該 heap 0 所在的庫緩存對象有關的庫傳訊對象句柄地址集合。Tables 分為許多細類。
Data blocks 屬性。
二、dump 驗證
分別以 sys 用戶和 test 用戶創建一張一摸一樣的表。
SQL show user
USER is SYS
SQL create table t as select * from v$mystat;
Table created.
另起一個連接,用數據庫用戶 test 登錄
SQL show user
USER is TEST
SQL create table t as select * from v$mystat;
Table created.
以倆個用戶為基礎分別執行 select
* from t where t.STATISTIC#=671;
查詢該 sql 的 sql_id 和 hash_value
執行 library cache dump
SQL alter session set events immediate trace name library_cache
level 10
Session altered.
通過 sql_id 或 hash value 查詢 dump, 可在 dump 中找到關于該 sql 的內容,如下圖
以上圖為例分析 library
cache 結構
Bucket: #=114283 Mutex=0x9bdc28e8(0, 20, 0, 6)
LibraryHandle: Address=0x84e5fb00 Hash=cb15be6b LockMode=N
PinMode=0 LoadLockMode=0 Status=VALD
–bucket 號,Hash=cb15be6b 此處采用的是 16 進制,轉換為十進制的值為 3407199851,正好與上面 v$sqltext 中查出來的值一致。
ObjectName: Name=select * from
t where t.STATISTIC#=671
–object 的名稱 即上面說過的 name 屬性,也就是 lco(library cache objects)
FullHashValue=9581b1f4c50e25f2e8500930da5a0101 Namespace=SQL AREA(00)
Type=CURSOR(00) Identifier=0 OwnerIdn=0
– 上面說過的 namespace,尚不太清楚 fullhashvalue 的含義
ChildTable: size= 16
Child: id= 0 Table=0x87b03f60
Reference=0x87b039c8 Handle=0x98efe438
Child: id= 1 Table=0x87b03f60
Reference=0x87b03d10 Handle=0x83595530
– 倆個 child cursor
以上就是 sga 中 library cache 的內部原理是什么,丸趣 TV 小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注丸趣 TV 行業資訊頻道。