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

本文讲述了在遇到SQL执行慢的问题时,如何通过分析执行计划发现子查询中索引使用不当导致效率降低。通过指定高效索引,成功改变了JOIN顺序,优化了查询性能。强调在优化时需关注所有相关表的索引选择,以解决性能问题。
摘要由CSDN通过智能技术生成

今天遇到一个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去解决性能问题。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值