父遊標 子游標和軟硬解析記載-02
繼續整理關於父遊標 子游標和軟硬解析的東東.根據前篇blog的http://dotaddjj.itpub.net/post/43172/525234的關於父子游標的整理,這裡再次補充一下。父遊標和v$sqlarea資訊相關聯,而子游標和v$sql資訊相關聯。
Shared cursor
而共享遊標shared cursor是在sql語句在遊標解析階段生成獲得,位於library cache中的sql語句或匿名的pl/sql塊,如果library cache的父遊標和子游標能夠被共享,此時則為共享遊標。父遊標能夠共享則為共享父遊標,子游標共享則是共享的子游標。
Session cursor
Oracle為session分配緩衝區存放sql語句執行結果,使用者透過這個快取區逐條取出記錄對其處理,直到記錄全部被處理完畢,而session cursor也就是跟session相對應pga的一塊記憶體區域。這裡有個檢視v$open_cursor檢視,每一個開啟或解析的sql都存在與該檢視中。
Session cursor和sql語句的關聯:
Session cursor從uga分配記憶體,有其生命週期。首先一個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語句產生執行計劃,讀取資料字典中統計資訊以及動態統計資訊,計算cost,cbo選擇最低的執行計劃
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- v$sql v$sqlarea和父遊標 子游標記載01SQL
- Oracle遊標共享,父遊標和子游標的概念Oracle
- Oracle - 共享遊標、父子游標、硬軟解析Oracle
- 深入理解父遊標,子游標的概念
- 草稿 - 遊標,硬解析,軟解析 等
- v$sql v$sqlarea v$sql_shared_cursor及父遊標,子游標SQL
- Oracle中的遊標、硬解析、軟解析、軟軟解析、解析失敗Oracle
- oracle實驗記錄 (子游標與解析)Oracle
- 遊標引數shared_cached_cursors和軟軟解析
- 軟解析和硬解析
- ORACLE 硬解析和軟解析 軟軟解析Oracle
- input 獲取游標位置與設定游標位置
- Web 中的“選區”和“游標”Web
- PL/SQL-遊標和遊標變數的使用SQL變數
- Oracle遊標共享(Cursor Sharing)--常規遊標共享和自適應遊標共享(ACS)Oracle
- 【筆記】遊標變數筆記變數
- Oracle的硬解析和軟解析Oracle
- 游標操作快捷鍵
- PLSQL Language Referenc-PL/SQL靜態SQL-游標變數-游標變數作為子程式引數SQL變數
- winform之手繪矩形及游標字串與游標關聯顯示ORM字串
- MySQL過程和遊標MySql
- ORACLE SQL解析之硬解析和軟解析OracleSQL
- Oracle SQL的硬解析和軟解析OracleSQL
- 【CSS: cursor】滑鼠游標指標樣式大全CSS指標
- 子游標過多導致大量mutex爭用故障分析Mutex
- (12)mysql 中的游標MySql
- 阻止游標預設事件事件
- secureCRT游標不見啦Securecrt
- css 滑鼠游標設定CSS
- a標籤裡面巢狀一個a標籤,點選子連結標籤時,同時觸發了父標籤a巢狀
- win10游標怎麼縮放_win10游標縮放方法Win10
- 遊標翻頁模式下的遊標值模式
- PLSQL Language Referenc-PL/SQL靜態SQL-游標變數-開啟和關閉游標變數SQL變數
- Oracle遊標Oracle
- Oracle 遊標Oracle
- SQL 遊標SQL
- oracle遊標簡單使用小記Oracle
- win10筆記本滑鼠游標不見了怎麼辦 win10滑鼠游標恢復的方法Win10筆記