sql in为什么有时候不走索引之oracle篇

数据库 ORACLE 11g

 

看例子:

表pm_project,有数据10万条,id 5000000-5100000

执行计划走一波explain plan for下面的SQL:

-- 走索引 唯一扫描 BY INDEX ROWID unique scan

select * from pm_project where pm_project_id

in (5000041, 5000042);

-- 走索引 区间扫描 BY INDEX ROWID range scan

select * from pm_project where pm_project_id

in (select pm_project_id from pm_project where pm_project_id < 5000025);

-- 全表扫描 full

select * from pm_project where pm_project_id

in (select pm_project_id from pm_project where pm_project_id > 5000025);

那是为什么呢?

第一条,写死的值,oracle通过优化器选择走唯一索引。

第二条,子查询有25条记录,oracle通过优化器选择了索引 range scan。

第三条,子查询有9万多条记录,oracle通过优化器选择了全表扫描,因为整个表才10万条,没必要走索引了。

 

那么问题来了,这个优化器怎么就这么做出选择了呢?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值