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

在Oracle 11g数据库中,当使用SQL查询时,优化器根据数据量和索引选择不同的执行计划。例如,对于有固定值的查询会走唯一索引,子查询返回25条记录时选择索引范围扫描,而9万多条记录时则选择全表扫描。优化器主要分为基于规则的优化器(RBO)和基于成本的优化器(CBO)。在设有统计信息的情况下,Oracle默认使用CBO,可以根据优化模式(如Rule, Choose, First Rows, All Rows)来决定是否考虑成本。统计信息用于评估执行计划的开销,包括CPU和内存等。查询数据库的优化模式和统计信息,可以帮助理解查询执行计划的选择。" 121767917,11346007,喜马拉雅音频解析算法详解,"['音频处理', 'Python编程', '网络爬虫', '数据解析']
摘要由CSDN通过智能技术生成

数据库 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万条,没必要走索引了。

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值