IN里的值过多时会造成Oracle不用索引?
0
A表里有10w条记录,主键名为id
select name from A where id in(.....)
如果只是100来个,会用索引
SELECT STATEMENT, GOAL = CHOOSE 87 131 6943
INLIST ITERATOR
TABLE ACCESS BY INDEX ROWID TEST A 87 131 6943
INDEX RANGE SCAN TEST PK_A 2 131
但当in里的值达到500个左右的时候,执行计划就是不会用索引了,
SELECT STATEMENT, GOAL = CHOOSE 298 537 28461
TABLE ACCESS FULL TEST A 298 537 28461
为什么会这样的?
select name from A where id in(.....)
如果只是100来个,会用索引
SELECT STATEMENT, GOAL = CHOOSE 87 131 6943
INLIST ITERATOR
TABLE ACCESS BY INDEX ROWID TEST A 87 131 6943
INDEX RANGE SCAN TEST PK_A 2 131
但当in里的值达到500个左右的时候,执行计划就是不会用索引了,
SELECT STATEMENT, GOAL = CHOOSE 298 537 28461
TABLE ACCESS FULL TEST A 298 537 28461
为什么会这样的?
没有找到相关结果
重要提示:提问者不能发表回复,可以通过评论与回答者沟通,沟通后可以通过编辑功能完善问题描述,以便后续其他人能够更容易理解问题.
1 个回复
老头子 - 专注是唯一的捷径 2015-10-11 回答
赞同来自:
关,之和最后查询出的数据量/总数据的大小有关,可以看看我的博客。
你可以试试
select count(*) from xx where a.id in (xxx,xxx)
select count(*) from xx
看下数据量的比例
CBO什么时候走索引,索引存在的意义在哪,这个要搞懂,这个明白了就不会拘泥于SQL的形式而疑惑执行计划是否走索引。