优化SQL日记 Oracle 执行计划使用了错误的索引

优化SQL日记 Oracle 执行计划使用了错误的索引–>

今天遇到一个SQL,跑了2小时还没有出来。查看表的驱动表数据只有228条,根据业务条件最多返回的数据在6到7万左右。不应该有如此的速度。

1.查看真实的执行计划

A.发现不合理的地方 驱动表明明只有228,可是在一个Left JOin的子查询里面结果集到1M,相关的其他表join结果集都上百万数据。

B.单独执行这个子查询,没有这样的问题,并且速度很快,为什么放到原SQL中计划会如此不同,结合上下语句块,发现 Join 条件让一张表使用了另一个低效率的索引。 就是这个索引的使用导致这个子查询的Join顺序不正常,从而结果集很大。

2.想办法改变子查询的JOIN顺序

A.尝试使用Leading ,  但是不好用,由于子查询里面视图,视图里面有很多表的join。 所以换一条路

B.指定高效的访问索引

/*+ INDEX(V.t  index_name)*/,再次查看执行计划,发现JOIn的顺序是高效的,返回的结果集是比较小的,和预估的大小相似。

总结:

这次调优发现了导致问题的表, 访问的索引返回数据的差异。当评估问题的时候,要清楚了解所有相关表的索引,已经那个索引在当前情况下是最优的,Optimizer 是有可能选错的。 特别是表的索引很多,尽量是删除无用或者低效的索引。但是系统历史问题无法改变的只能改SQL去解决性能问题。

 

 

 

 

本文来源 互联网收集,文章内容系作者个人观点,不代表 本站 对观点赞同或支持。如需转载,请注明文章来源,如您发现有涉嫌抄袭侵权的内容,请联系本站核实处理。

© 版权声明

相关文章