您好,登錄后才能下訂單哦!
這篇文章主要講解了“怎么 理解ORACLE的游標共享”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么 理解ORACLE的游標共享”吧!
游標共享(cursor sharing)指的是share cursor的共享
做到游標共享很簡單,使用綁定變量就可以實現,但是會遇到下面兩個問題
1、開發人員在開發時,未使用綁定變量,這是如果要用綁定變量,就會大量更改sql.
2、使用了綁定變量,但是由于綁定變量窺探的影響,會使某些解析樹和執行計劃不合時宜
針對上面兩個問題,分別用兩種游標共享來解決
1、常規游標共享 ,解決問題1
通過參數cursor_sharing啟用系統綁定變量
exact 不啟用綁定變量
similar 只對安全的謂語條件啟用,所謂的安全,就是執行計劃不會隨著這個值的變化而發生變化,比如主鍵列的等值查詢,而范圍類的查詢則是不安全的,比如大于,小于,like ,這是一個過時的值,任何時候都不要設置為這個值
force 啟用綁定變量,要在不改代碼的情況下,使那些where 字句或者values子句(insert) 共享相同的執行計劃和解析,可以用這個值。
2、自適應游標共享
11g中引入了自適應游標共享
bind sensitive 指某個含有綁定變量的目標SQL執行計劃可能隨著綁定變量輸入值的變化而變化。當滿足下列三個條件時,目標SQL對應的child cursor 會被標記為bind sensitive .
1)啟用綁定變量窺探
2)該SQL使用了綁定變量
3)該SQL是不安全的謂語條件(比如范圍查詢,目標列有直方圖統計信息的等值查詢)
bind aware 確定含有綁定變量的目標SQL執行計劃會隨著綁定變量輸入值的變化而變化,滿足下列兩個條件,目標SQL對應的child cursor 會被標記為bind aware
1)已被標記為bind sensitive
2)該SQL接下來的兩次執行,對應的runtime統計信息跟硬解析時的runtime統計信息相比差異較大。
v$sql中的三列:is_bind_sensitive is_bind_aware is_shareable
自適應游標共享相關的兩個視圖:v$sql_cs_statistics v$sql_cs_selectivity
v$sql_cs_statistics顯示指定child_cursor 的runtime 統計信息
v$sql_cs_selectivity 顯示指定的,已被標記為bind_aware的child_cursor中存儲的含綁定變量的謂語條件對應的可選擇率范圍。
自適應游標的整體執行過程:
1、sql第一次執行,硬解析,然后根據一系列條件(有沒有使用綁定變量,cursor_sharing的值,綁定變量列有沒有直方圖,等值查詢還是范圍查詢等)來判斷是否將child_cursor標記為bind_sensitive,如果已標記,會把執行該SQL的runtime統計信息額外存儲在child cursor中
2、第二次執行該SQL,會用軟解析,并重用之前的解析樹和執行計劃
3、第三次執行,如果之前child_cursor已經被標記為bind_sensitive,而且第二次,第三次執行該sql的runtime統計信息和硬解析時的runtime統計信息相差過大,則會重新硬解析該SQL,同時生成一個新的child cursor ,并把該child cursor標記為bind_aware。
4、對于標記為bind aware的sql ,再一次執行時,會根據謂語條件中綁定變量的可選擇率來選擇硬解析還是軟解析。判斷條件是,該選擇率位于該SQL硬解析時同名謂語條件在v$sql_cs_statistics中的選擇率范圍內,則用軟解析,反之則用硬解析。
感謝各位的閱讀,以上就是“怎么 理解ORACLE的游標共享”的內容了,經過本文的學習后,相信大家對怎么 理解ORACLE的游標共享這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。