1. 程式人生 > >Oracle硬解析,軟解析,軟軟解析介紹

Oracle硬解析,軟解析,軟軟解析介紹

Oracle資料庫中的CURSOR分為兩種型別:Shared Cursor 和 Session Cursor

1,Shared Cursor

Oracle裡的第一種型別的Cursor就是Shared Cursor。 它是存在Shared Pool裡,Shared Pool 是SGA裡的裡的一塊記憶體區域,Shared Pool(Library Cache & Data Dict Cache)。 Library Cache快取的是剛剛執行過的SQL語句和PL/SQL語句(procedure,function, package and trigger)所對應的執行計劃,解析數(parse tree).Pcode,Mcode等物件。快取在庫快取中的物件我們稱它為庫快取物件(Library Cache Object). Oracle資料庫中的Shared Cursor又細分為Parent Cursor(父遊標)和Child Cursor(子游標). 這兩種型別。我們可以通過查詢V$SQLAREA和 V$SQL 來檢視當前快取中的Parent Cursor和 Child Cursor。其中V$SQLAREA用於檢視Parent Cursor, V$SQL用於檢視Child Cursor. 在ORACLE資料庫裡,任意一個目標SQL 一定會同時對應兩個Shared Cursor,其中一個是Parent Cursor,另外一個是Child Cursor. Parent Cursor會儲存該SQL 的SQL 文字,而該SQL 真正的可以被重用的解析數和執行計劃則儲存在Child Cursor中。

2,Session Cursor

Oracle裡的第二種型別的Cursor就是Session Cursor。它是當前Session解析和執行SQL的載體,換句話說,Session Cursor用於在當前Session中的解析和執行SQL,它和Shared Cursor的區別是,它是快取在PGA中,而不是像Shared Cursor那樣快取在SGA的庫快取裡。

Session Cursor與Session是一一對應的,不同的session的Session Cursor直接沒有辦法共享,這個和Shared Cursor有本質的區別。Session Cursor是有生命週期的,每個session都在使用的過程中都至少會經歷一場(open,parse,bind,execute,fetch and Close)中的一個或者多個階段。用過的Session Cursor不一定快取在對應的Session 的PGA中,這取決於Session_cached_cursor的值是否大於0.

Oracle在解析和執行目標SQL時,會先去當前的SESSION的PGA中找是否有匹配的快取的Session Cursor.當第一次解析和執行目標SQL時(顯然是硬解析),當前SESSION的PGA中肯定不存在匹配的SESSION CURSOR,這個時候ORACLE 會新生成一個Session Cursor和一對Shared Cursor(即Parent Cursor 和 Child Cursor),這其中的Shared Cursor會儲存能被所有Session共享,重用的內容(比如目標SQL的解析樹,執行計劃等),而Session Cursor則會經歷一次open,parse,bind,execute,fetch和close中的一個或多個階段。
顯然一個Session Cursor 只能對應一個Shared Cursor, 而一個Shared Cursor卻可以同時對應多個Session Cursor.

硬解析:目標SQL第一次解析和執行,會同時生成Session Cursor和一對Shared Cursor(Parent Cursor and Child Cursor)

軟解析:Session_Cached_Cursors=0,那麼Session Cursor就會正常的執行Close操作,當上述的SQL再次重複執行時,是可以找到匹配的Shared Cursro但是找不到 Session Cursor了,這就意味著ORACLE 還必須為該SQL 新生成一個Session Cursor.

軟軟解析: Session_Cached_Cursor>0,那麼滿足一定的額外條件時,Oracle就不會對Session Cursor執行CLOSE操作,而是會將其標記為Soft Closed,同時將其快取在當前的Session 的PGA中。這樣做的好處是,當目標SQL 再次被重複執行時,此時的Shared Cursor 和Session Cursor都能匹配到。意味著ORACLE 不需要為該SQL 生成新的Session Cursor了,而是隻需要從當前SESSION 的PGA中將之前已經標記為Soft Closed的匹配Session Cursor直接拿過來用就可以了。和軟解析相比,此時ORACLE省掉了OPEN一個新的Session Cursor所需要耗費的資源和時間,另外,close 一個現有Session Cursor也不用做了(只需要把他標記為Soft Closed,同時將其快取在當前的SESSION的PGA中就可以了),當然剩下的Parse, Bind,Execute,Fetch還是需要做的,這個過程就是軟軟解析。

總上所述,我們對Sesion Cursor和Shared Cursor之間的關聯關係有如下總結:

無論是硬解析,軟解析還是軟軟解析,ORACLE在解析和執行目標SQL時,始終會先去當前SESSION的PGA中尋找是否存在匹配的快取Session Cursor.

1,如果在當前SESSION 的PGA中找不到匹配的快取Session Cursor, Oracle就會去庫快取中找是否存在匹配的Parent Cursor。如果找不到,Oracle就會新生成一個Session Cusor 和一對 Shared Cursor(Parent Cursor and Child Cursor),如果找到了匹配的Parent Cursor,但是找不到匹配的Child Cursor, Oracle就會去新生成一個Session Cursor和一個Child Cursor(這個Child Cursor會被掛在之前找到的匹配Parent Cursor下),無論哪一種情況,這兩個過程對應的都是硬解析。

2, 如果在當前Session的PGA中找不到匹配的快取 Session Cursor,但在庫快取中找到了匹配的Parent Cursor和Child Cursor,則Oracle會新生成一個Session Cursor並重用剛剛找到的匹配Parent Cursor和 Child Cursor,這個過程就是軟解析。

3,如果在當前Session的PGA中找到了匹配的快取Session Cursor,此時就不再需要新生成一個Session Cursor,並且也不再需要向軟解析那樣得去庫快取中查詢匹配的Parent Cursor了,因為ORACLE此時可以重用找到的匹配 Session Cursor,並可以通過這個Session Cursor直接訪問到該SQL對應的Parent Cursor,這個過程就是軟軟解析。