【DB筆試面試389】在Oracle中,什麼是綁定變量窺探?

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=



Q          題目

  

在Oracle中,什麼是綁定變量窺探?ide




     
A          答案          


 

目標SQL若不使用綁定變量,則當具體輸入值一旦發生了變化,目標SQL的SQL文本就會隨之發生變化,這樣Oracle就能很容易地計算出對應Selectivity和Cardinality的值,進而據此來選擇執行計劃。但對於使用了綁定變量的目標SQL而言,狀況就徹底不同了,由於如今不管對應綁定變量的具體輸入值是什麼,目標SQL的SQL文本都是如出一轍的。對於使用了綁定變量的目標SQL而言,Oracle能夠選擇以下兩種方法來決定其執行計劃:性能

l 使用綁定變量窺探(Bind Peeking)。spa

l 若是不使用綁定變量窺探,那麼對於那些可選擇率可能會隨着具體輸入值的不一樣而不一樣的謂詞條件使用默認的可選擇率(例如5%)對象

綁定變量窺探(Bind Peeking)是在Oracle 9i中引入的,是否啓用綁定變量窺探受隱含參數「_OPTIM_PEEK_USER_BINDS」的控制,該參數的默認值是TRUE,表示在Oracle 9i及其後續的版本中,默認啓用綁定變量窺探。blog

綁定變量窺探的優缺點以下所示:it

① 優勢:當綁定變量窺探被啓用後,每當Oracle以硬解析的方式解析使用了綁定變量的目標SQL時,Oracle都會實際窺探(Peeking)一下對應綁定變量的具體輸入值,並以這些具體輸入值爲標準,來決定這些使用了綁定變量的目標SQL的WHERE條件的Selectivity和Cardinality的值,並據此來選擇該SQL的執行計劃。須要注意的是,這裏這個「窺探(Peeking)」的動做只有在硬解析的時候纔會執行,當使用了綁定變量的目標SQL再次執行時(此時對應的是軟解析/軟軟解析),即使此時對應綁定變量的具體輸入值和以前硬解析時對應的值不一樣,Oracle也會沿用以前硬解析時所產生的解析樹和執行計劃,而再也不重複執行上述「窺探」的動做。由於有了綁定變量窺探,因此,Oracle在計算目標SQL的WHERE條件的Selectivity和Cardinality的值時,就能夠避免使用默認的可選擇率,這樣就有更大的可能性能獲得該SQL準確的執行計劃。class

② 缺點:對於那些執行計劃可能會隨着對應綁定變量具體輸入值的不一樣而變化的目標SQL而言一旦啓用了綁定變量窺探,其執行計劃就會被固定下來,至於這個固定下來的執行計劃究竟是什麼,則徹底倚賴於該SQL在硬解析時傳入的對應綁定變量的具體值。這意味着一旦啓用了綁定變量窺探,目標SQL在後續執行時就只會沿用以前硬解析所產生的解析樹和執行計劃,即便當時的執行計劃和解析樹並不適合於新傳入的值。變量

關於綁定變量窺探須要注意如下幾點:自適應

(1)在Oracle llg中引入自適應遊標共享後,綁定變量窺探這種無論後續傳入的綁定變量的具體輸入值是什麼而一直沿用以前硬解析時所產生的解析樹和執行計劃的缺點纔有所緩解。方法

(2)在不改變SQL語句文本的狀況下,讓SQL語句從新進行硬解析的方法有:①對SQL語句涉及到的對象執行DDL操做(例如COMMENT語句)。②執行DBMS_SHARED_POOL.PURGE來刪除共享池中的遊標。③在從新收集統計信息時指定NO_INVALIDATE=>FALSE選項。

綁定變量窺探這種無論後續傳入的綁定變量的具體輸入值是什麼而一直沿用以前硬解析時所產生的解析樹和執行計劃的特性一直飽受詬病(這種情況一直到Oracle llg中引入自適應遊標共享後纔有所緩解),由於綁定變量窺探可能使CBO在某些狀況下(對應綁定變量的某些具體輸入值)所選擇的執行計劃並非目標SQL在當前情形下的最優執行計劃,並且它可能會帶來目標SQL執行計劃的忽然改變,進而直接影響應用系統的性能。

綁定變量窺探的反作用在於,一旦啓用(默認狀況下綁定變量窺探就己經被啓用),使用了綁定變量的目標SQL就只會沿用以前硬解析時所產生的解析樹和執行計劃,即便這種沿用徹底不適合當前的情形,即根據第一次傳入的值而後固化執行計劃。

相關文章
相關標籤/搜索