再次碰到一个诡异的事情,同样的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