ITPub博客

首页 > 数据库 > Oracle > Oracle SQL语句的谓词join如何利用索引

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

原创 Oracle 作者:Haoword_wang 时间:2023-09-09 18:59:41 0 删除 编辑

例如,下面的连接谓词定义了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相关的其他谓词)


后期待续



来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26342786/viewspace-2982129/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle Postgresql MySQL DBA,DEVOPS 开发人员

注册时间:2013-03-03

  • 博文量
    73
  • 访问量
    69125