`

oracle 表连接方式

 
阅读更多

在查看sql执行计划时,我们会发现表的连接方式有多种,本文对表的连接方式进行介绍以便更好看懂执行计划和理解sql执行原理。 
一、连接方式:
        嵌套循环(Nested  Loops (NL))
      (散列)哈希连接(Hash Join (HJ))
    (归并)排序合并连接(Sort Merge Join (SMJ) )

二、连接说明:
    1.Oracle一次只能连接两个表。不管查询中有多少个表,Oracle 在连接中一次仅能操作两张表。
    2.当执行多个表的连接时,优化器从一个表开始,将它与另一个表连接;然后将中间结果与下一个表连接,以此类推,直到处理完所有表为止。

三、表连接详解:
     1.嵌套循环(Nested  Loops (NL)):
        嵌套循环实现机制(伪代码):
          For r1 in (select rows from table_1 where colx={value})
          loop
                for r2 in (select rows from table_2 that match current row from table_1)
               loop
                  output values from current row of table_1 and current row of table_2;
               end loop;
         End loop;
   这段代码由两个循环构成。
   嵌套循环中的这两个表通常称为外部表(outer table)和内部表(inner table)。
   在嵌套循环连接中,外部表又称为驱动表(driver table)
  伪代码中:table_1为驱动表,table_2为内表
  从伪代码中可以看出该连接过程就是一个2层嵌套循环,所以外层循环的次数越少越好,这也就是我们为什么将小表或返回较小结果集的表作为驱动表的原因。
  NEST LOOP JOIN COST =   从第一个表取得数据的成本 +    从第一个表得到结果的基数 Х 对第二个表访问一次的成本
所以嵌套循环一般适合于驱动表记录集比较少(<10000)且内表有高效索引访问方式。
  使用USE_NL(table_1 table_2)可强制CBO 执行嵌套循环连接。
  驱动表确定:驱动表【select rows from table_1 where colx={value} 】一般为根据where条件能得到较小结果集的表,而不一定是整个表记录比较小的表。
         
    2.(散列)哈希连接(Hash Join (HJ)):
        Hash join一般用于一张小表和一张大表进行join。在绝大多数情况下,hash join效率比其他join方式效率更高。
         对于hash join的详细理解,可参看网上一篇文章写的比较透彻:http://www.hellodba.com/reader.php?ID=144&lang=cn

    3.排序合并连接(Sort Merge Join (SMJ) ):

       通常情况下散列连接的效果都比排序合并连接要好,然而如果行源已经被排过序,在执行排序合并连接时不需要再排序了,这时排序合并连接的性能会优于散列连接。可以使用USE_MERGE(table_1 table_2)来强制使用排序合并连接。
过程:将两个表排序,然后将排序后两个表合并。

四、连接方式总结:
1))嵌套循环(nest loop):
          对于被连接的数据子集较小的情况,嵌套循环连接是较好的选择。在嵌套循环中,外表驱动内表,外表返回的每一行都要在内表中检索找到它匹配的行,因此整个查询返回的结果集不能太大(大于10000不合适),要把返回子集较小的表作为外表(驱动表),而且在内表的连接字段上一定要有索引。
2)哈希连接(hash join):
         哈希连接是大数据集连接时常用的方式,优化器使用两个表中较小的表,利用连接键在内存中建立散列表,然后扫描较大的表并探测散列表,找出与散列表匹配的行。
        这种方式适用于较小的表完全可以放入内存的情况,这样成本就是访问两个表的成本之和。但是在表很大的情况下并不能完全放入内存,这时优化器将它分割成若干不同的分区,不能放入内存的部分就把该分区写入磁盘的临时段。
        哈希连接只能应用于等值连接(如WHERE A.COL3 = B.COL4)、非等值连接(WHERE A.COL3 > B.COL4)、外连接(WHERE A.COL3 = B.COL4(+))。
3)排序合并连接(Sort Merge Join )
          通常情况下哈希连接的效果都比排序合并连接要好。然而如果行源已经被排过序,在执行排序合并连接时不需要再排序了,这时排序归并连接的性能会忧于哈希连接。

五、连接方式应用场景:
1. 哈希连接只适用于等值连接。
2. 嵌套循环是行源连接方式,只适合小量数据连接。
     哈希连接和排序合并连接是集合连接方式,适合大量数据连接。
3. 在等值连接方式下,返回少量记录(<10000)且内部表在连接列上存在索引,适合嵌套循环连接。若返回大量记录则适合哈希连接。
4. 在等值连接方式下,两个行源集合都很大,若连接列是高基数列,则适合哈希连接,否则适合排序合并连接。
5. 嵌套循环连接可以先返回已经连接的行,而不必等待所有的连接操作处理完才返回数据。而其它两种连接方式则不行。
6.    排序合并连接的两个数据集可以并行处理,而嵌套循环和哈希连接不能.

注: 整理自网络

分享到:
评论

相关推荐

    Oracle表连接方式

    Oracle表连接方式 Oracle表连接方式是指在数据库中连接多个表以获取所需数据的方法。根据不同的数据集和查询需求,Oracle提供了多种表连接方式,包括NESTED LOOP、HASH JOIN和SORT MERGE JOIN等。 NESTED LOOP ...

    ORACLE表连接方式分析及常见用法

    本文主要探讨Oracle SQL优化中的表连接方式、特性和适用场景,以及如何进行优化。 首先,我们了解表连接的基本概念,它通过FROM子句中的多个表和WHERE子句中的连接条件来组合数据。Oracle提供了多种连接类型,包括...

    详解Oracle多种表连接方式

    Oracle 数据库支持多种表连接方式,包括内连接(Inner Join)、外连接(Outer Join),以及它们的变体,如自然连接(Natural Join)。这些连接方式是数据库查询中非常重要的概念,用于合并来自多个表的数据。 1. **...

    ORACLE表连接方式的分析与优化_tony.doc

    ORACLE表连接方式的分析与优化_tony.doc

    Oracle+表连接方式(内连接-外连接-自连接)+详解

    ### Oracle表连接方式详解 #### 一、内连接(自然连接) 内连接是数据库中最常见的连接类型之一,其目的是为了从两个或多个表中找出共同的记录,即那些在所有参与连接的表中都有匹配项的记录。在Oracle中,内连接...

    Oracle数据库中表的四种连接方式讲解

    根据连接方式的不同,表连接主要分为四种类型:相等连接、外连接、不等连接和自连接。 1. 相等连接(Equal Join) 相等连接是最常见的连接类型,基于两个或更多表之间相同列的值相等来合并数据。例如,在`EMP`和`...

    Oracle数据库表连接方式及常见用法

    Oracle 数据库表连接方式及常见用法 Oracle 数据库表连接方式是指在数据库中连接两个或多个表以获取所需的数据。这些连接方式包括相等连接、外连接、不等连接、自连接和哈希连接等。本文将详细介绍这些连接方式的...

    Oracle的三种表连接方式

    "Oracle 的三种表连接方式详解" Oracle 的三种表连接方式是指在做表 join 的时候, Oracle 有三种方式,分别是:sort merge join(SMJ) ·nest loop(NL) ·hash join(HJ)。下面是对这三种策略的详细讲解: sort ...

    Oracle+表连接方式

    综上所述,理解并熟练运用 Oracle 的各种表连接方式对于处理复杂的数据查询至关重要。无论是内连接的精确匹配,还是外连接的包含所有记录,或是自连接的内部关系挖掘,都是数据库查询中不可或缺的部分。熟悉这些连接...

    Oracle数据库3种主要表连接方式对比

    ### Oracle数据库三种主要表连接方式对比 在Oracle数据库中,为了获取来自多个表的数据,我们需要使用不同的连接方式来实现这一目的。本文将详细介绍三种主要的表连接方式:嵌套循环连接(Nested Loop Join,简称NL...

    Oracle多表连接练习

    `e.deptno(+)=d.deptno`是左连接的表示方式,即使在员工表中找不到对应部门编号,也会返回部门的信息,但员工数为零。 3. 第三个练习利用内连接和`ORDER BY`语句,按年薪升序排列所有员工的姓名、年工资和部门名称...

    关于Oracle多表连接,提高效率,性能优化操作

    这是因为ORACLE只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询..数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性...

    Oracle表连接的具体讲解

    自连接是一种特殊的表连接方式,它将同一个表连接到自己身上。例如: SQL&gt; Select a.id,a.name,b.name from dave a join dave b on a.id=b.id; 自连接可以用于实现某些复杂的查询操作,例如查找某个表中的重复记录...

    oracle表的连接方式

    ### Oracle表的连接方式详解 在Oracle数据库中,表连接是一种常见的操作,用于结合两个或多个表中的数据,以提供更全面的信息。Oracle提供了三种主要的表连接方式:NESTED LOOP JOIN、HASH JOIN和SORT MERGE JOIN。...

    Oracle 表的扫描方式及连接方法

    Oracle 表的扫描方式及连接方法 Oracle 表的扫描方式是指 Oracle 访问表的方法,包括全表扫描、索引扫描、索引范围扫描、索引唯一扫描等。这些扫描方式的选择取决于查询的条件、索引的类型和数据的分布。 一、全表...

    Oracle中表的四种连接方式讲解

    本文主要探讨了四种基本的连接方式:相等连接、外连接(包括左外连接和右外连接)、不等连接和自连接。 1. 相等连接: 相等连接是最基础的连接类型,它基于两个表中相同意义的列之间的相等条件。例如,在查询员工...

    ORACLE 数据库如何连接,连接方式

    以下将详细讲解Oracle数据库的连接方式和配置过程。 首先,Oracle数据库连接主要通过以下几种方式实现: 1. **SQL*Plus**:这是Oracle提供的一种命令行工具,可以直接在命令行界面输入SQL语句与数据库交互。要连接...

    oracle客户端连接远程服务器

    标题中提到的“Oracle客户端连接远程服务器”,是指使用Oracle数据库客户端软件来建立与远程Oracle数据库服务器的连接。Oracle数据库是一种广泛使用的商业数据库系统,它支持多用户并发访问并保证数据的一致性,适用...

    强制释放Oracle数据连接方案

    ### 强制释放Oracle数据连接方案 在日常的数据库管理工作中,我们经常遇到数据库连接超限的情况,这通常是由于大量的数据库连接未被正确关闭或回收所导致的。本文将详细介绍如何查看并调整Oracle数据库的连接数量...

    oracle数据库连接工具

    oracle数据库连接工具:toad oracle 11

Global site tag (gtag.js) - Google Analytics