Oracle Shared Pool之Library Cache

1. Shared Pool組成
  Shared Pool由許多區間(Extent)組成,這些區間又由多個連續的內存塊(Chunk)組成,這些內存塊大小不一。從邏輯功能角度,Shared pool主要包含三個部分:Library Cache,Dictionary Cache和Control Structure。而這裏,我們主要介紹其中的Library Cache。
2. Library Cache

  Library Cache主要用於存儲系統中的可執行對象(例如:SQL語句,PL/SQL塊及相關對象等)及其相關信息(解析信息,可執行代碼,相關對象及信息,相關控制結構等),以便實現這些可執行對象及其相關信息的快速訪問和共享。

3. Hash Bucket

   Hash Bucket主要用於特定可執行對象的快速定位和存取,每個哈希桶中對應一個將多個可執行對象連接起來的鏈表,而這些可執行對象在鏈表中的表現形式就是可執行對象的句柄(Handle),當需要定位或訪問特定對象時,系統通過對特定SQL或PL/SQL對象做特定哈希計算,就可以快速得知該特定對象應該位於的哈希桶,而每個哈希桶的鏈表比較短,尤其是高版本的Oracle中,哈希桶的鏈表更短,這樣,在哈希桶鏈表中定位和訪問特定對象會非常快速。至於Library Cache中哈希桶的數目,系統會根據Shared Pool的大小自動算出,以確保哈希桶在夠用的同時,也不會導致哈希桶中對象數目過多而影響定位和訪問的效率。哈希桶示意圖如下所示。


4. Hash Latch

    前面講到了哈希桶及其鏈表,當多個用戶同時訪問這些哈希桶和鏈表時,就會出現衝突和問題,爲了實現用戶對這些哈希桶及其鏈表的有序訪問和共享,Oracle通過一種叫做哈希Latch的機制來保護這些共享資源,當一個用戶需要訪問或修改這些哈希桶及其鏈表時,需要首先獲取其上的哈希Latch,期間,其他需要獲取相同哈希Latch的用戶或會話就需要等待,直到持有該哈希Latch的用戶釋放爲止,需要提出的是,並不是針對每個哈希桶都有一個哈希Latch,而是一個哈希Latch覆蓋多個哈希桶,這樣,當不同用戶即使不是訪問同一個哈希桶及其鏈表時,只要被同一個哈希Latch覆蓋,也是需要等待該哈希Latch被釋放纔可以。哈希Latch具體如下所示。


5. Library Cache Handle

  上面我們也提到,每個哈希桶通過鏈表將多個可執行對象連接到一起,而這些可執行對象在其中以對象句柄形式存在在,這些句柄包含了這些對象的相關屬性,例如:名稱、標記、指向對象內存地址的指針等。Library Cache Handle具體如下所示。


6. Library Cache Object
  哈希桶中鏈表上的Handle對應的是可執行對象(Library Cache Object),這些對象由一些獨立的堆(Heap)所組成,具體說,哈希桶中鏈表上的Handle指向這些可執行對象時,其實是指向它的第一個堆(heap 0),其中記錄了指向該對象其他堆(Heap)的指針信息等,這些堆具體包括:
   1)依賴表(Dependency Table):當前對象(Library Cache Object,簡稱LCO)依賴的其它對象信息,例如:該對象所依賴的表、視圖、索引等。
   2)子表(Child Table):當前對象的子LCO及其相關信息。
   3)數據塊(Data Block):當前對象的SQL語句、執行計劃、執行文本等信息。
   。。。

   Library Cache Object具體如下所示。


7.Library Cache整體示意圖如下所示。


 8. 父遊標/子游標(Parent Cursor/Child Cursor)

     當Oracle用戶提交SQL或PL/SQL等可執行對象後,這將在Library Cache中生成一個叫做遊標(cursor)對象,這些遊標對象可被多個會話共享,這樣既節省了資源又提高了效率。同時,每個遊標又由兩部分表達和限定,即父遊標(Parent Cursor)和子游標(Child Cursor),這些通過系統相關動態視圖可以查詢和了解。父遊標和子游標具體如下所示。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章