您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關sga中library cache的內部原理是什么,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
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屬性。
分別以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的內部原理是什么,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。