會話級指定和提示級指定OPTIMIZER_FEATURES_ENABLE結果不同

yangtingkun發表於2011-09-27

幫客戶最佳化時發現,同樣是OPTIMIZER_FEATURES_ENABLE引數,在會話級設定和在HINT中指定的效果不同。

 

 

客戶的資料庫從11.1.0.6升級到最新的11.2.0.2之後,一些原本執行正常的SQL,查詢效能變得比較差,嘗試利用OPTIMIZER_FEATURES_ENABLE方式來恢復原始的執行計劃,但是發現有時在會話級設定OPTIMIZER_FEATURES_ENABLE引數執行計劃並沒有改變,而如果直接在SQL中設定OPTIMIZER_FEATURES_ENABLE提示,則可以使得SQL的執行計劃恢復到升級之前。

由於SQL 本身比較複雜,而且事實上和當前這個主題的關係不大,這裡就不列出來了。一共針對6個效能變差的SQL進行調整,發現如果使用ALTER SESSION SET OPTIMIZER_FEATURES_ENABLE = ’11.1.0.6’的方式,則有3個語句恢復11.1.0.6中的執行計劃,而對於另外3個執行計劃並沒有改變。

而如果嘗試在SQL中直接嵌入提示/*+ OPTIMIZER_FEATURES_ENABLE(’11.1.0.6’) */結果發現其中5SQL恢復了11.1.0.6的執行計劃,而只有1SQL執行計劃沒有改變。

雖然一直都清楚,使用OPTIMIZER_FEATURES_ENABLE並不能100%保證SQL的執行計劃恢復到指定版本,但是確實沒有想到,OPTIMIZER_FEATURES_ENABLE在提示中指定和在會話級設定還會有所區別。如果說HINT的優先順序更高會覆蓋會話級設定,這可以理解,但是二者效果有所區別,就說不過去了。除非是OPTIMIZER_FEATURES_ENABLE在會話級的設定不足以覆蓋某些其他的會話級引數設定,從而導致這個現象的產生。

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-708422/,如需轉載,請註明出處,否則將追究法律責任。

相關文章