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