这个oracle语句为什么会做全表查询

表tab_a字段a是索引。
这样查询,执行计划显示走了索引。
select * from tab_a where a in ('123');
但是像下面这样在条件中加入另一张表,再看执行计划显示tab_a做了table acces full。
select * from tab_a where a in (select * from tab_b);
请问这是为什么呢?第二个语句怎样调整才能做到走tab_a表索引呢?

索引失效了。
select * from tab_b
子查询换成具体的字段。

首先这个问题可能有多种情况,以下是你这个问题的可能性之一
1.tab_a不同数据太少,无法构建直方图,所以导致不走索引
2.tab_a数量太少,全表扫描成本低所以不走索引
3.tab_b返回数据量过多,因此全表扫描成本更低
4.统计信息为0
我预估你的问题应该是第二种或者第三种。
请注意:表数据量较少的情况下,全表扫描会比使用索引更高效,不走索引是很正常的。
如果一定要走索引可以加提示强制走索引/*+ index(表名或别名 索引名) */
如果想了解更多数据库知识可关注我的公众号:唯一的小彬哥