IN里的值过多时会造成Oracle不用索引?

visulcer 2015-10-11 02:42:11
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

为什么会这样的?
...全文
3031 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
董松建 2016-05-19
  • 打赏
  • 举报
回复
楼主,网址不存在啊。你有笔记之类的吗?我也想学习一下,谢谢
visulcer 2015-10-12
  • 打赏
  • 举报
回复
A表和索引都已经分析过统计信息
visulcer 2015-10-12
  • 打赏
  • 举报
回复
这里已经完美解答
http://www.dbthink.com/archives/177
visulcer 2015-10-12
  • 打赏
  • 举报
回复
真实表是in里达到459个的时候就不会用索引了
visulcer 2015-10-12
  • 打赏
  • 举报
回复
oracle 9i
我也只是个普通猿,对oracle不太了解
解决办法是有,用两表关联就行了,但对于oracle这种行为就没有个说法吗?用索引速度比全表扫要快20几倍,它都要全表扫

上面的例子是在真实表上做的,我又建了一个简单表做了一个测试
create table TEST
(
ID NUMBER(10) primary
)

插了26w条记录
select * from test where id in (11111,22222,33333)
SELECT STATEMENT, GOAL = CHOOSE 2 3 9
TABLE ACCESS FULL TEST TEST 2 3 9
in只有三个也全表扫,会不会这表占用的数据块太少了,oracle就是宁愿全表扫
对于oracle这种行为就没有个说法吗?
binsweet 2015-10-12
  • 打赏
  • 举报
回复
100+,我看你是醉了,明显不合理吗,应该寻求其他解决办法
visulcer 2015-10-11
  • 打赏
  • 举报
回复
上面是固定写死SQL的情况,在in里用子查询也是一样

Oracle给了1G内存,共享池、大型池、缓存都给了两三百M

17,382

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧