现在有两个大表做关联,CM_DEVICE表的ID是主键,在使用LEFT JOIN时,执行计划里走的是全表扫描,但是在使用子查询的时候,却走了主键索引,这是为什么?
使用LEFT JOIN:
使用子查询:
现在有两个大表做关联,CM_DEVICE表的ID是主键,在使用LEFT JOIN时,执行计划里走的是全表扫描,但是在使用子查询的时候,却走了主键索引,这是为什么?
使用LEFT JOIN:
使用子查询:
oracle在选择执行计划的时候,按按照总成本最低判断的,不是说一定要选择索引。
实际情况中,如果表数据量大,全表扫描后进行HASH JOIN,比使用NESTED LOOP,再走索引的方式效率要高。
另外,这两个sql在语义上不是等价的,如果CM_DEVICE和CM_LINK不是一对一的关系,第一个sql结果的行数比第二个sql应该多。
索引只有在where子句中才会起作用。另外就像楼上说的,创建了索引并不一定就会使用,oracle自动统计表的信息后,决定是否使用索引,表中数据很少时使用全表扫描速度已经很快,没有必要使用索引。
既然走了主键索引,说明通过索引查询效率更高。
1 回答2.4k 阅读✓ 已解决
1 回答2.3k 阅读✓ 已解决
1.4k 阅读
我理解数据库是不是full table scan还是走索引,是根据where语句。Left join只where了spec_id,那就只走cm_link表的spec_id索引,另一张表并没有where,也就是全表扫描。