本中由于綁定變量窺探導致SQL語句無法獲得最佳執行計劃的缺陷,即能夠對效率低下的游標(子游標)進行自動識別而選擇最佳的執行計劃。本
文詳細描述了自適應游標共享并給出示例。
??? 有關綁定變量窺探請參考: Oracle 綁定變量窺探
一、示例自適應游標共享
??? 1、創建演示環境???????
??? 2、使用綁定變量執行SQL語句并獲得首次執行情況????????
??? 3、自適應游標共享的外在體現
??????? 自適應游標共享主要通過三個字段來得以體現,即is_bind_sensitive,is_bind_aware,is_shareable。(注:此三個字段僅在Oracle 11g
??????? 中存在)。通過上面從v$sql(v$sqlarea中不存在is_shareable)的查詢可知,三個字段分別被賦予了不同的值,代表了不同的含義。
?????
????? is_bind_sensitive(綁定是否敏感)
????????? 表示該子游標中是否使用了綁定變量要素,且采用bind peeking方法進行執行計劃生成。如果執行計劃依賴于窺探到的值,此處為Y,
????????? 否則為N。
?????
????? is_bind_aware(綁定是否可知)
????????? 表示該子游標是否使用了extended cursor sharing技術,是則為Y,否則為N,如為N,則該游標將廢棄,不再可用。
?????
????? is_shareable(是否可共享)
????????? 表示該子游標可否被下次軟解析是否可共享使用。可共享則為Y,否則為N,表示該子游標失去了共享價值,按LRU算法淘汰。
?
????? 由于該SQL語句為首次執行,因此從v$sql查詢的結果中得知
????????? is_bind_sensitive 為Y值(首次運行,執行了bind peeking)
????????? is_bind_aware???? 為N值(首次運行,不被extended cursor sharing支持)
????????? is_shareable????? 為Y值(執行計劃可共享)
??? 4、重新賦值后觀察游標共享情況???????
二、自適應游標共享的幾個相關視圖
?1、v$sql_cs_statistics
??????? 用于監控自適應游標共享的相關統計信息.下面的查詢中列出了每個子游標的peeking情況,以及執行次數,預處理行數,BUFFER_GETS等???????
??? 2、v$sql_cs_selectivity
??????? 顯示每個子游標的游標的選擇性范圍。下面的查詢中列出了謂詞,選擇性范圍,列上的選擇性的值???????
??? 3、v$sql_cs_histogram
??????? 用于決定一個查詢是否允許自適應游標共享,以直方圖形式存儲???????
三、總結
??? 1、自適應游標共享在SQL語句首次執行時(使用綁定變量),進行窺探,并記錄窺探結果,如果后續有相同的的SQL語句執行,則對窺探結果
?????? 進行比較以判斷是否需要生成新的執行計劃。此即為綁定變量是否敏感。
??? 2、綁定變量的可知性用于判斷當前的游標是否為可擴展性游標共享,當不可知時,則游標被廢棄。
??? 3、自適應游標共享的實質是在Oracle 10g以前的基礎上實現了多次綁定變量窺探,增加了獲取最佳執行計劃選擇的機率。
??? 4、盡管使用自適應游標共享特性,但并不能保證每次執行SQL語句一定按最佳計劃執行,本次演示中SQL語句的第二次執行并非最佳執行計劃。
??? 5、自適應游標共享也不能保證兩次執行相同SQL語句一定按相同的執行計劃執行,因為自適應游標共享會不斷嘗試peeking。
??????????????
四、延伸參考
???
Oracle 綁定變量窺探
???
Oracle自適應共享游標
???
綁定變量及其優缺點
?
???
父游標、子游標及共享游標
?
???
dbms_xplan之display_cursor函數的使用
?
???
dbms_xplan之display函數的使用
?
???
執行計劃中各字段各模塊描述
???
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
