Oracle SQL语句的谓词join如何利用索引

来源:这里教程网 时间:2026-03-03 18:58:39 作者:

例如,下面的连接谓词定义了deptno列上的emp和dept表之间的连接:          emp.deptno = dept.deptno 如果索引列是连接谓词的一部分,那么:在执行查询时,使用什么类型的连接方法来实现连接?     第一种 Hash / Sort Merge Join : 使用 Hash joins Sort Merge Join,外部表的信息在连接时不可用,从而无法在内部表上进行行查找; 而是分别访问两个表,然后将结果数据连接起来。不能仅使用基于连接列的索引来探测哈希或排序合并的内部表。 这是这些连接类型使用的实现机制的固有限制。 Nested Loops Join的不同之处在于它们允许对连接列进行索引查找。 即:(1)Hash join散列连接是CBO 做大数据集连接时的常用方式,优化器使用两个表中较小的表(通常是小一点的那个表或数据源)利用连接键(JOIN KEY)在内存中建立散列表,将列数据存储到hash列表中,然后扫描较大的表,同样对JOIN KEY进行HASH后探测散列表,找出与散列表匹配的行。需要注意的是:如果HASH表太大,无法一次构造在内存中,则分成若干个partition,写入磁盘的temporary segment,则会多一个写的代价,会降低效率。         (2)Merge Join 是先将关联表的关联列各自做排序,然后从各自的排序表中抽取数据,到另一个排序表中做匹配    第二种 Nested Loops Join:嵌套循环连接的工作方式是读取外部表,然后使用收集到的信息探测内部表。该算法允许在内部表上进行索引查找。 只有 Nested Loops Join才能允许在内部表上仅基于连接列进行索引查找. 即:Nested loops 工作方式是循环从一张表中读取数据(驱动表outer table),然后访问另一张表(被查找表 inner table,通常有索引)。驱动表中的每一行与inner表中的相应记录JOIN。类似一个嵌套的循环。 另外,连接顺序是否允许使用索引?

当使用嵌套循环连接时,必须先访问嵌套循环连接的外部表,然后才能在内部表上使用索引。检查查询的解释计划,以确定使用了哪个访问路径以及访问表的顺序。由于这个限制,表的连接顺序很重要。

例如:     如果我们如上所述使用“EMP. deptno = DEPT .deptno”谓词将EMP连接到DEPT,并且在EMP. deptno上有一个索引(假设该谓词中没有与EMP. deptno相关的其他谓词) 后期待续

相关推荐