绑定变量窥测(Bind Variable Peeking)
????? 綁定變量窺測是oracle在進行硬解析生成執行計劃的時候會窺探綁定變量的真實值,去評估綁定變量的謂詞條件的選擇率,影響執行計劃是選擇訪問路徑是先走索引掃描進而去訪問表還是直接走全表掃描。
????? 沒有綁定變量窺測這一特性的時候oracle怎么去評估選擇性那,是基于字段統計信息中ndv,ndv接近表的行數的時候,選擇性越高,走索引的概率越大,ndv越小,則選擇性越差,走全表掃描的概率也就越大,但是在真實環境中,很多業務場景中字段取值都不均勻的,這個時候使用ndv去評估選擇性顯然不合理,所以綁定變量窺測會參考字段的取值,字段直方圖等統計信息,會評估出一個可靠的選擇率,這個時候優化器再去做選擇就準確多了。
??????綁定變量窺測的好處是能夠準確的生成第一次語句執行的時候的執行計劃,但是由于游標共享,之后相同的語句再次執行的時候不會再去窺探,這個是使用綁定變量的一個不好之處。
?????綁定變量窺測在oracle 9i中被引入,受到隱藏參數_optim_peek_user_binds的控制,并且該參數的默認值是true,就是說,綁定變量窺測這一特性默認是啟用的。
???? 優化器是否使用綁定變量窺測去生成執行計劃那,可以打印cursor中的執行計劃觀察這一特性的作用。
?
1 select * from table(dbms_xplan.display_cursor('d0g5mw5skptkq',0,'allstats advanced last')); 2 3 SQL_ID d0g5mw5skptkq, child number 0 4 ------------------------------------- 5 select * from t1 where owner = :owner 6 7 Plan hash value: 3617692013 8 9 --------------------------------------------------------------------------- 10 | Id | Operation | Name | E-Rows |E-Bytes| Cost (%CPU)| E-Time | 11 --------------------------------------------------------------------------- 12 | 0 | SELECT STATEMENT | | | | 427 (100)| | 13 |* 1 | TABLE ACCESS FULL| T1 | 90944 | 9M| 427 (1)| 00:00:01 | 14 --------------------------------------------------------------------------- 15 16 Query Block Name / Object Alias (identified by operation id): 17 ------------------------------------------------------------- 18 - SEL$1 / T1@SEL$1 19 Peeked Binds (identified by position): 20 -------------------------------------- 21 - :1 (VARCHAR2(30), CSID=178): 'SYS' 22 23 Predicate Information (identified by operation id): 24 --------------------------------------------------- 25 - filter("OWNER"=:OWNER)?執行計劃的黃色部分所以,oracle在生成此執行計劃的時候,用到了綁定變量窺測,由于‘SYS’在列中的選擇率太低,所以優化器選擇走全表掃描的表訪問路徑。
?
?
????
轉載于:https://www.cnblogs.com/wangxingc/p/6061418.html
總結
以上是生活随笔為你收集整理的绑定变量窥测(Bind Variable Peeking)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: day-6
- 下一篇: Maven命令行使用:mvn clean