再次碰到一個詭異的事情,同樣的SQL在兩個類似資料庫中執行時間相差非常之多。直觀反應就是執行計劃不一樣,果不其然。
在跑得很快的環境中的執行計劃,
但是在另外一個環境中的執行計劃卻是,
從執行計劃中可以看到低效的執行計劃的consistent gets相當之高,差別就在於connect by走了 “CONNECT BY NO FILTERING WITH SW(UNIQUE)" 操作,而不是 "CONNECT BY WITH FILTERING(UNIQUE)"操作。
可以用hint - CONNECT_BY_FILTERING 試下,結果執行計劃就變成了,
可以看到執行計劃變了,consistent gets下降得非常之多。
其實仔細想想,執行計劃不正確在很多情況下是因為statistics不夠準確。這也能從Note: - dynamic sampling used for this statement (level=2)可以看出來。
嘗試下收集下表上的統計資訊,然後把hint去掉,結果執行計劃就正確了,而且也沒有用dynamic sampling了,
~~~~~~~
See in-depth analysis here - http://rwijk.blogspot.com/2012/03/connect-by-filtering.html