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

为什么会这样的?
已邀请:
0

老头子 - 专注是唯一的捷径 2015-10-11 回答

是因为你的表数据量小,或者说当你的in的值达到500个的时候select的数据量大于表总数据量的15%,索引和in的值无
关,之和最后查询出的数据量/总数据的大小有关,可以看看我的博客。
你可以试试
select count(*) from xx where a.id in (xxx,xxx)
select count(*) from xx
 
看下数据量的比例
 
CBO什么时候走索引,索引存在的意义在哪,这个要搞懂,这个明白了就不会拘泥于SQL的形式而疑惑执行计划是否走索引。

要回复问题请先登录注册