再次碰到一個詭異的事情,一樣的SQL在兩個相似數據庫中執行時間相差很是之多。直觀反應就是執行計劃不同,果不其然。html
在跑得很快的環境中的執行計劃,數據庫
可是在另一個環境中的執行計劃倒是,this
從執行計劃中能夠看到低效的執行計劃的consistent gets至關之高,差異就在於connect by走了 「CONNECT BY NO FILTERING WITH SW(UNIQUE)" 操做,而不是 "CONNECT BY WITH FILTERING(UNIQUE)"操做。3d
能夠用hint - CONNECT_BY_FILTERING 試下,結果執行計劃就變成了,htm
能夠看到執行計劃變了,consistent gets降低得很是之多。blog
其實仔細想一想,執行計劃不正確在不少狀況下是由於statistics不夠準確。這也能從Note: - dynamic sampling used for this statement (level=2)能夠看出來。get
嘗試下收集下表上的統計信息,而後把hint去掉,結果執行計劃就正確了,並且也沒有用dynamic sampling了,sed
~~~~~~~im
See in-depth analysis here - http://rwijk.blogspot.com/2012/03/connect-by-filtering.htmld3