ORACLE 的LEFT JOIN不会走主键索引?

现在有两个大表做关联,CM_DEVICE表的ID是主键,在使用LEFT JOIN时,执行计划里走的是全表扫描,但是在使用子查询的时候,却走了主键索引,这是为什么?
使用LEFT JOIN:
图片描述

使用子查询:
图片描述

阅读 15.6k
3 个回答

我理解数据库是不是full table scan还是走索引,是根据where语句。Left join只where了spec_id,那就只走cm_link表的spec_id索引,另一张表并没有where,也就是全表扫描。

oracle在选择执行计划的时候,按按照总成本最低判断的,不是说一定要选择索引。
实际情况中,如果表数据量大,全表扫描后进行HASH JOIN,比使用NESTED LOOP,再走索引的方式效率要高。

另外,这两个sql在语义上不是等价的,如果CM_DEVICE和CM_LINK不是一对一的关系,第一个sql结果的行数比第二个sql应该多。

新手上路,请多包涵

索引只有在where子句中才会起作用。另外就像楼上说的,创建了索引并不一定就会使用,oracle自动统计表的信息后,决定是否使用索引,表中数据很少时使用全表扫描速度已经很快,没有必要使用索引。
既然走了主键索引,说明通过索引查询效率更高。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进