1. 程式人生 > >深入理解Oracle中的shared pool與library cache元件及相關等待事件

深入理解Oracle中的shared pool與library cache元件及相關等待事件


傳統的’library cache pin’在10.2.0.2之後預設被取代, 此處PIN被Mutex及其ref count取代。 當程序執行遊標語句時或者需要PIN,或者需要hard parse一個子遊標heap。在版本10.2.0.1中, 使用mutex部分程式碼替代PIN的功能預設是不啟用的,實際上這取決於隱藏引數_KKS_USE_MUTEX_PIN,在10.2.0.2之後_KKS_USE_MUTEX_PIN預設為TRUE。 換而言之在版本10.2中我們還是可以關閉KKS使用MUTEX替代PIN保護CURSOR的, 但是在版本11g中則幾乎無法關閉MUTEX。 

share型別的library cache pin相當於cursor:pin S

exclusive型別的library cache pin 相當於cursor:pin X

library cache: mutex X相當於library cache lock 主要作用是在hash bucket中定位handle時使用

SQL執行步驟:

1、檢查是否有開啟的遊標,如果有,則直接通過遊標link到位於PGA的private SQL AREA( private SQL area),執行步驟15。否則,執行步驟2。
2、檢查初始化引數SESSION_CACHED_CURSORS是否被設定,如果被設定,則同樣可以通過遊標指向到位於PGA的私有SQL AREA,轉步驟15。否則執行步驟3。
3、檢查HOLD_CURSOR以及RELEASE_CURSOR的設定。如果RELEASE_CURSOR=no(預設no),HOLD_CURSOR=yes(預設為no),當ORACLE執行完SQL語句,為private SQL AREA分配的記憶體空間被保留,cursor和private SQL AREA之間的link也被保留,預編譯程式不再使用它,同樣可以通過這個指標直接在private SQL AREA獲得語句,轉步驟15。
這上面的三種情況,實際上都沒有作任何parse,都是直接從位於PGA中的private SQL AREA獲得語句並直接執行。此為fast parse。
這三種情況都不存在的情況下,oracle轉到步驟4執行。

4、建立一個遊標。
5、語法檢查Syntax Check:檢查語法書寫是否正確,是否符合SQL Reference Manual中給出的SQL語法。
6、語義分析Semantic Analysis:查詢資料字典,檢查表、列是否正確,在所要求的物件上獲取語法分析鎖,使得在語句的語法分析過程中不改變這些物件的定義, 驗證為存取所涉及的模式物件所需的許可權是否滿足。
7、將語句轉化成ASCII等效數字碼,再通過雜湊演算法得到雜湊值。

8,找到對應的bucket,獲得hash bucket的library cache lock,然後確認是否存在相同的SQL,即相同的LCO.若在獲得library cache lock過程中發生爭用,

      則等待library cache lock事件.相同的LCO存在時直接跳至第15步執行,此時稱為軟解析,每當發生sql parsing請求時,oracle會增加

     parse count(total)統計值.

9,如果不存在相同sql,在獲得shared pool latch後,從free list(空閒列)上查詢合適大小的空閒的Chunk,如果在獲得shared pool lock過程中發生爭用,則等待

     shared pool latch 或者 latch:shared pool事件。Oracle會一直持有shared pool latch,直到找到chunk為止。

10,若不存在適合大小的空閒Chunk,則查詢更大的空閒Chunk後分割使用,分割後剩下的記憶體區域重新登記到free list。

11,若檢索了所有free list也沒有找到合適的空閒的Chunk,則檢索LRU list.LRU list的Chunk是recreatable,而且是當前不使用的(還沒有Pin的)。

12,若在LRU list上檢索也不能確保找到合適大小的Chunk,則追加分配共享池內的剩餘記憶體空間。

13,以上過程如果均失敗,則發生錯誤ORA-4031。

14,若找到適當的Chunk,對SQL相應的Handle(Library cache handle)以Exclusive模式獲得library cache lock,並建立LCO資訊。建立LCO後,library cache lock

    的模式變換為Null模式,將library cache pin以Exclusive模式獲得後建立執行計劃。3-8步驟為硬解析Hard Parsing,如果發生硬解析,Oracle將增加

    Parse Count(hard)統計值。

15,Oracle對SQL Cursor以Shared模式獲得library cache lock和library cache pin.但是執行修改物件資訊(DDL)時,對相應的物件所對應的LCO以Exclusive模式

   獲得library cache lock和library cache pin。例如:‘alter table xxx add varchar2(10)’,這個語句在執行階段,對於SQL Cursor自身是以shared模式

   library cache lock,但是對於表xxx所對應的LCO以Exclusive 模式獲得,獲取library cache lock和library cache pin過程中發生爭用,則各自需要等待

   library cache lock事件和library cache pin事件.

16,Oracle對執行結束的SQL Cursor Fetch資料。這個過程就是fetch階段,在fetch階段,SQL cursor將library cache lock變換為Null模式,並解除library cache pin.

   Oracle手冊上將以Null模式獲得的library cache lock稱為breakable parse lock.