暂无图片
两个sql差别不大,执行计划走的是同样的索引,可是cost差别却很大,请大神帮忙看看两个sql从底层而言,到底差别在哪?
我来答
分享
1℃
2020-03-07
两个sql差别不大,执行计划走的是同样的索引,可是cost差别却很大,请大神帮忙看看两个sql从底层而言,到底差别在哪?
暂无图片 5M

15835924091.jpg15835924931.jpg15835925461.jpg

我来答
添加附件
收藏
分享
问题补充
6条回答
默认
最新
刘峰

语句1中where条件card.jizrq列上有表达式,语句2上没有,这点不同就产生很大的区别。
语句1在走索引之后还需要进一步通过trucate(card.jizrq)来获取数据,而语句2直接可以通过索引获取全部数据,自然cost也会小很多。

暂无图片 评论
暂无图片 有用 0
1℃

主要是我看到两个sql走的是同一个执行计划,只有cost不同,不明白oracle的底层究竟是怎么执行的

暂无图片 评论
暂无图片 有用 0
晨辉

语句一问题应该是出在这个 trunc()函数上,索引列带函数会导致走不了索引.
这两个语句虽然都走了这个索引,但语句二用到了两个字段(orgunit,jizrq),语句一只用到了(orgunit)字段,这样导致索引选择条件会差许多,从而多取出了特别多的行而后又要过滤掉,cost自然会大的多。
更多细节可以做个10053事件看下优化器分析过程。

暂无图片 评论
暂无图片 有用 0
1℃

感谢,还有个问题,我在这张表上建了一个索引,可是执行计划并没有走这个索引,这是一为什么?15835944061.jpg

暂无图片 评论
暂无图片 有用 0
外包DBA

索引扫描的范围更小更精确,当然成本更低咯

暂无图片 评论
暂无图片 有用 0
刘峰

很大可能性是where条件返回的数据量和card表占比很大,比如card表数据量1000,where条件的结果集为800,此是执行计划是不会走索引的,因为索引+回表的代价大于全表扫描的代价。

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏