父遊標 子游標和軟硬解析記載-02

dotaddjj發表於2011-11-23

繼續整理關於父遊標 子游標和軟硬解析的東東.根據前篇bloghttp://dotaddjj.itpub.net/post/43172/525234的關於父子游標的整理,這裡再次補充一下。父遊標和v$sqlarea資訊相關聯,而子游標和v$sql資訊相關聯。

Shared cursor

而共享遊標shared cursor是在sql語句在遊標解析階段生成獲得,位於library cache中的sql語句或匿名的pl/sql塊,如果library cache的父遊標和子游標能夠被共享,此時則為共享遊標。父遊標能夠共享則為共享父遊標,子游標共享則是共享的子游標。

Session cursor

Oraclesession分配緩衝區存放sql語句執行結果,使用者透過這個快取區逐條取出記錄對其處理,直到記錄全部被處理完畢,而session cursor也就是跟session相對應pga的一塊記憶體區域。這裡有個檢視v$open_cursor檢視,每一個開啟或解析的sql都存在與該檢視中。

Session cursorsql語句的關聯:

Session cursoruga分配記憶體,有其生命週期。首先一個sql語句會在其uga中分配記憶體區域生成對應的遊標並開啟; 解析遊標(將sql語句與遊標關聯,並將其執行計劃載入到library cache中);定義輸出變數(如果遊標需要返回資料時);繫結資料變數(如果遊標關聯的sql語句使用繫結變數);執行與遊標關聯的sql語句;獲取遊標返回結果(遊標將逐條取出查詢的記錄直到取完為止);關閉遊標(釋放uga中該遊標佔有的相關資源,但library cache中的遊標的執行計劃按lru原則清除,主要也是為了提供遊標共享)

遊標的解析:

可以得出任何sql語句相對應的遊標都經歷了記憶體分配,建立,開啟,解析,執行與關閉幾個過程。而其中的遊標的解析過程又分為:

1包含vpd的約束條件:如果使用了虛擬私有資料庫,並且被解析的SQL語句中引用的某張表啟用了它的話,安全策略生成的約束條件就會被新增到WHERE語句中。

(這個vpd的約束條件具體是什麼了。)

2語法語義及訪問許可權檢查:

3儲存父遊標:將遊標的文字進行雜湊得到雜湊值並在library cache尋找相同的雜湊值,如不存在則生成父遊標儲存在library cache中。

4邏輯最佳化:透過最佳化手段生成等價意義sql語句,一旦操作完成,則執行計劃數量,收縮空間會相應增長(這個收縮空間又是什麼了)

5物理最佳化:為邏輯最佳化階段sql語句產生執行計劃,讀取資料字典中統計資訊以及動態統計資訊,計算costcbo選擇最低的執行計劃

6儲存子游標:分配記憶體,將共享子游標儲存進去,然後關聯父遊標和子游標

當只執行前兩個步驟時成為軟解析嗎,否則則為硬解析,而邏輯最佳化和物理最佳化非常消耗cpu和資源

父遊標裡包含的sql文字,首次開啟父遊標被鎖定,直到其他session關閉後遊標才被解鎖,被鎖定的父遊標是不能按照lru演算法置換出library cache的,只有在解鎖以後才能被置換出library cache,同樣對應的子游標也隨著父遊標一起被清除出library cache

子游標包含具體的執行計劃,繫結變數,object和許可權,最佳化器設定等,子游標可以被lru演算法隨時清除出library cache,而oracle可以利用父遊標的資訊重新構建出一個子遊標,這個過程也就是reload

所以與父遊標相關的SQL文字,與子游標相關的時執行計劃和執行環境。而硬解析通常是由不可共享的父遊標導致,而在不使用繫結變數以及動態SQL語句時硬解析就無法避免。

以上的一些定義和總結部參照了ORACLE效能診斷藝術!

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1056500/,如需轉載,請註明出處,否則將追究法律責任。

相關文章