优化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的顺序是高效的,返回的结果集是比较小的,和预估的大小相似。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值