首页 > 数据库 > Oracle > Oracle SQL语句为什么不走索引-场景四
二 索引列和连接谓词的关系
基于优化系列的背景,如下面的连接谓词定义了deptno列上的emp和dept表之间的连接:
p.deptno = deptno .deptno
如果索引列是连接谓词的一部分,那么:在执行查询时,使用什么类型的连接方法来实现连接?
2.1 哈希/排序合并连接:使用哈希连接和排序合并连接,外部表的信息在连接时不可用,以启用对内部表的行查找;而是分别访问两个表,然后将结果数据连接起来。不能仅使用基于连接列的索引来探测哈希或排序合并的内部表。这是这些连接类型使用的实现机制的固有限制。嵌套循环连接的不同之处在于它们允许对连接列进行索引查找。
2.2 嵌套循环连接:嵌套循环连接工作通过读取外部表,然后使用收集到的信息来探测内部表。该算法允许在内部表上进行索引查找。
只有嵌套循环连接才能允许在内部表上仅基于连接列进行索引查找:
另外,连接顺序是否允许使用索引?
当使用嵌套循环连接时,必须先访问嵌套循环连接的外部表,然后才能在内部表上使用索引。检查查询的解释计划,以确定使用了哪个访问路径以及访问表的顺序。由于这个限制,表的连接顺序很重要。
例如:如果我们像上面那样使用“EMP. deptno = DEPT .deptno”谓词将EMP连接到DEPT,并且在EMP. deptno上有一个索引(假设在查询中没有与EMP. deptno相关的其他谓词),如果EMP在DEPT之前被访问,那么当时没有行值存在,可以用来查找EMP. deptno索引中的行,因为我们还没有访问任何对象来提供这样的查找键。在这种连接顺序下,使用索引的唯一方法是使用全索引扫描或索引快速全扫描(读取整个索引)。在这种情况下,有可能选择全表扫描(FTS)成本更低。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26342786/viewspace-3048684/ ,如需转载,请注明出处,否则将追究法律责任。