`

深入理解Oracle—三大表连接方式详解之Nested loop join和Sort merge join

阅读更多

        关系数据库技术的精髓就是通过关系表进行规范化的数据存储,并通过各种表连接技术和各种类型的索引技术来进行信息的检索和处理,下面大家一起来学习分享Oracle的三大表连接技术。

        在早期版本,Oracle提供的是nested-loop join,两表连接就相当于二重循环,假定两表分别有m行和n行,如果内循环是全表扫描,时间复杂度就是O(m*n);如果内循环是索引扫描,时间复杂度就是O(m*㏒n);而hash join的时间复杂度是O(m*n)。因此10g后,hash join成为缺省的连接方法。

        对于三种连接,我们都可以使用hint来强制让优化器走:use_hash,use_nl,use_merge

一.三种连接概述

1.nested loop

        从A表抽一条记录,遍历B表查找匹配记录,然后从a表抽下一条,遍历B表,就是一个二重循环。

2.hash join

        将A表按连接键计算出一个hash表,然后从B表一条条抽取记录,计算hash值,根据hash到A表的hash来匹配符合条件的记录。

3.sort merge join

        将A,B表都排好序,然后做merge,符合条件的选出。

 

二各种连接详解

1.Nested Loop Join

a.执行原理

        例如:

 

select t1.*,t2.* from t1,t2 where t1.col1=t2.col2;

 

        访问机制如下:

 

for i in (select * from t1) loop
  for j in (select * from t2 where col2=i.col1) loop
  display results;
  end loop;
  end loop;

 

        类似一个嵌套循环,嵌套循环执行时,先是外层循环进入内层循环,并在内层循环终止之后,接着执行外层循环再由外层循环进入内层循环中,当外层循环全部终止时,程序结束。

b.步骤如下

        ① 确定驱动表

        ② 把inner 表分配给驱动表

        ③ 针对驱动表的每一行,访问被驱动表的所有行

c.执行计划大致如下

NESTED LOOPS
outer_loop
inner_loop

        优化器模式为FIRST_ROWS时,我们经常会发现有大量的NESTED LOOP,这时,在返回数据给用户时,我们没有必要缓存任何数据,这是nested loop的一大亮点。

d.使用场景

        一般用在连接的表中有索引,并且索引选择性较好(也就是Selectivity接近1)的时候,也就是驱动表的记录集比较小(<10000)而且inner表需要有有效的访问方法(Index),需要注意的是:JOIN的顺序很重要,驱动表的记录集一定要小,返回结果集的响应时间是最快的。

e.和索引的关系

        嵌套循环和索引就像一对孪生兄弟,一般需要共同考量与设计,这从优化器的执行机制可以看出,比如,存在2张表,一个10条记录,一个1000万条记录,以小表为驱动表,则代价为:10*(通过索引在大表查询一条记录的代价),如果1000万的大表没有索引的时候,那么COST的代价可想而知。

        因此,在多表连接时,注意被驱动表的连接字段是否需要创建索引,或者连接字段与该表的其他约束条件字段上是否需要创建复合索引。

 

2.Sort Merge Join

a.执行原理

        例如:

select t1.*,t2.* from t1,t2 where t1.id=t2.id;

        访问机制如下:

        访问t1,并order by t1_1.id,这里的id代表连接字段;

        访问t2,并order by t2_1.id join t1_1.id = t2_1.id,依次交替比对归并,但无所谓驱动。

b.使用场景

        虽说,hash join就是用来替代Sort Merge Join的,但如果你的服务器的CPU资源和MEM资源都很紧张的时候,建议用SORT MERGE JOIN,因为hash join比sort merge join需要的资源更多,特别是cpu。

        10g sql tuning 文档上写道:

        On the other hand, sort-merge joins can perform better than hash joins if both of the following conditions are met:

        The row sources are already sorted. 

        A sort operation does not have to be done.

        所以,Sort Merge Join大概就用在没有索引,并且数据已经排序的情况。

 

文章来源:http://www.2cto.com/database/201301/186885.html

分享到:
评论

相关推荐

    oracle表的连接方式

    Oracle提供了三种主要的表连接方式:NESTED LOOP JOIN、HASH JOIN和SORT MERGE JOIN。每种方法都有其独特的应用场景和性能特点。 #### NESTED LOOP JOIN NESTED LOOP JOIN是一种简单的连接方式,适用于连接的数据...

    Oracle表连接方式

    根据不同的数据集和查询需求,Oracle提供了多种表连接方式,包括NESTED LOOP、HASH JOIN和SORT MERGE JOIN等。 NESTED LOOP NESTED LOOP是一种基本的表连接方式,适用于被连接的数据子集较小的情况。在nested loop...

    Oracle的三种表连接方式

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

    MySQL中Nested-Loop Join算法小结

    MySQL中的Nested-Loop Join(NLJ)是一种基本的JOIN操作实现方式,主要用于处理两个或多个表之间的连接。NLJ的基本思想是逐行遍历一张表(称为外部表),然后对每一行与另一张表(称为内部表)进行匹配。这个过程...

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

    本文将详细介绍三种主要的表连接方式:嵌套循环连接(Nested Loop Join,简称NL Join)、排序合并连接(Sort Merge Join,简称SM Join)以及散列连接(Hash Join)。我们将探讨它们的特点、优势与劣势,以便于在实际...

    Oracle CBO 学习笔记之(1) : 深入理解Oracle Hash Join的代价模型及其执行流程

    总之,Oracle CBO的Hash Join是数据库优化的关键技术之一,通过深入理解其代价模型和执行过程,我们可以更好地设计和调整数据库架构,以实现更高效的数据处理。这不仅涉及到理论知识,还需要实践中的不断尝试和调整...

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

    1. 嵌套循环连接(NESTED LOOP JOIN):这种连接方式适用于外部表小且内部表有高效索引的情况。Oracle会选择一个表作为驱动表,遍历其每一行并与另一个表逐行比较,生成结果集。嵌套循环连接在获取初始结果集时速度...

    Oracle中表的连接及其调整.

    本文将深入探讨 Oracle 中的三种主要连接方式:嵌套循环连接(Nested Loop)、排序合并连接(Sort Merge)和哈希连接(Hash Join),并结合案例分析其工作原理和优化策略。 1. 嵌套循环连接(Nested Loop) 嵌套...

    ORACLE表连接方式

    本文将对Oracle中的几种主要表连接方式进行详细介绍:内连接(Inner Join)、自然连接(Natural Join)、左外连接(Left Outer Join)、右外连接(Right Outer Join)、笛卡尔连接(Cartesian Join)、索引连接...

    Sql中的三种物理连接操作

    在SQL中,数据库管理系统在处理表间的连接时通常会使用三种物理连接操作:嵌套循环连接(Nested Loop Join)、合并连接(Merge Join)和哈希匹配(Hash Join)。理解这三种连接方式对于优化SQL查询性能至关重要。 ...

    Oracle 表三种连接方式使用介绍(sql优化)

    Oracle数据库在处理表之间的连接操作时提供了三种主要的连接方式:Nested Loop Join、Hash Join以及Sort Merge Join。这些连接方式各有特点,适用于不同的情景,理解它们的工作原理和适用条件对于SQL查询优化至关...

    hash join 原理和算法

    如果某个分区的哈希表仍然过大,Oracle会退化为Nested-Loops Hash Join,逐个对剩余的分区构建哈希表并与之连接。 **二、Hash Join原理** 在实际操作中,Oracle使用哈希函数对连接键进行运算,将数据分到不同的...

    几种常用的表连接方式

    本文将深入探讨四种常用的表连接方式:嵌套循环连接、排列合并连接、哈希连接以及索引连接,并详细阐述每种连接方式的工作原理、适用场景及其优缺点。 #### 1. 嵌套循环连接(Nested Loop Join) 嵌套循环连接是最...

    MySQL JOIN 工作原理浅析1

    当我们需要对两个表 R 和 S 进行连接时,Nested Loop Join 算法会将驱动表 R 中的每一条记录与被驱动表 S 中的每一条记录进行比较,从而得到连接结果。 在 Nested Loop Join 中,驱动表 R 会被作为外层循环,而被...

    ORACLE数据库SQL优化---表连接类型.docx

    - 排序合并连接(Sort Merge Join):两个已排序的表通过比较键值进行连接,适合大型表且有索引的情况。 - 嵌套循环连接(Nested Loops Join):驱动表的每一行与被驱动表的每一行进行比较,适合小表连接大表的...

    关于Oracle的SQL性能调整.pdf

    表连接的方式多样,如哈希连接(Hash Join)、嵌套循环连接(Nested Loop Join)和排序合并连接(Sort Merge Join),每种连接方式有其特定的适用场景。DBA需根据实际情况进行优化选择,这个过程可能较为耗时,因为...

    Oracle数据库表连接笔记.doc

    2. 排序合并连接(Sort-Merge Join)在两个已排序的表之间进行,需要先对参与连接的表进行排序。当处理大型表且连接条件涉及多个字段时,这种连接方式通常更有效。 3. 集群连接(Cluster Join)主要针对已存储在...

    oracle nested table demo

    通过“Oracle Nested Table Demo”,我们可以学习如何创建、插入和查询嵌套表,以及理解其在实际应用中的优势。这个示例是理解和实践Oracle高级数据类型的一个好起点,对于希望深入了解Oracle数据库特性的开发者来说...

    oracle执行计划详解

    本文将详细介绍 Oracle 执行计划的相关概念、访问数据的存取方法、表之间的连接等内容,并对总结和概述,以便于理解和记忆。 一、相关的概念 1. Rowid 概念:Rowid 是一个伪列,它不是用户定义的,而是系统自己给...

    oracle 优化资料

    - **嵌套循环连接(Nested Loop Join)**:适用于小表连接大表的情况,每次从大表中取出一行与小表中的每一行进行匹配。 - **群集连接(Cluster Join)**:在集群数据库中,当连接的表存储在同一集群内时使用,已很少...

Global site tag (gtag.js) - Google Analytics