`

深入理解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

分享到:
评论

相关推荐

    MySQL中Nested-Loop Join算法小结

    数据库中JOIN操作的实现主要有三种:嵌套循环连接(Nested Loop Join),归并连接(Merge Join)和散列连接或者哈稀连接(Hash Join)。其中嵌套循环连接又视情况又有两种变形:块嵌套循环连接和索引嵌套循环连接。

    Sql中的三种物理连接操作

    Sql中的三种物理连接操作 嵌套循环连接(Nested Loop Join) 合并连接(Merge Join) 哈希匹配(Hash Join)

    Improving Nested Loop Pipelining on Coarse-Grained Reconfigurable Architectures

    complete flow of mapping loop nests onto CGRA. Experiment results on most kernels of the Polybench show that our proposed approach can improve the performance of the kernels by 42% on average, as ...

    【SQL高级(三)】【SQL 连接(JOIN)】

    文章目录SQL 连接(JOIN)不同的 SQL JOINSQL INNER JOIN 关键字SQL LEFT JOIN 关键字SQL RIGHT JOIN 关键字SQL FULL OUTER JOIN 关键字 SQL 连接(JOIN) SQL join 用于把来自两个或多个表的行结合起来。 下图展示了 ...

    Oracle中三种表连接算法的总结

    1. 嵌套循环连接 (NESTED LOOP Join)嵌套连接把要处理的数据集分为外循环(驱动数据源)和内循环(被驱动数据源),外循环只执行一次(先执行),内循环执行的次数等于外循环执行的数据集个数。 这种连接的好处是...

    Index-Nested-Loop-Join-INLJ:使用Semi Stream Join实现构建和分析DW原型

    所有具有相同名称的现有表将被删除,并替换为名为D_CUSTOMERS , D_PRODUCTS , D_STORES , D_SUPPLIERS和D_TIME的空表(维度表); 和W_FACTS (事实表)。 完成后,将创建上面的6个表。 步骤2:使用INLJ算法...

    浅谈SQL Server中的三种物理连接操作(性能比较)

    在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge Join,Hash Join这三种物理连接中的一种。理解这三种物理...

    oracle nested table demo

    NULL 博文链接:https://ivan-yan.iteye.com/blog/1007671

    MySQL 8.0 新特性之哈希连接(Hash Join)

    其中最引人注目的莫过于多表连接查询支持 hash join 方式了。我们先来看看官方的描述: MySQL 实现了用于内连接查询的 hash join 方式。例如,从 MySQL 8.0.18 开始以下查询可以使用 hash join 进行连接查询: ...

    MySQL中一些优化straight_join技巧

    在mysql中就有之对应的straight_join,由于mysql只支持nested loops的连接方式,所以这里的straight_join类似oracle中的use_nl hint。mysql优化器在处理多表的关联的时候,很有可能会选择错误的驱动表进行关联

    海量数据库解决方案_韩国_李华植

    3.2.2.2 排序合并连接(sort merge join)146 3.2.2.3 哈希连接(hash join)148 3.2.2.4 半连接(semi join)149 3.2.2.5 笛卡儿连接151 3.2.2.6 外连接(outer join)154 3.2.2.7 索引连接159 3.2.3 其他运算方式的执行...

    海量数据库解决方案_韩国_李华植_Part02

    3.2.2.2 排序合并连接(sort merge join)146 3.2.2.3 哈希连接(hash join)148 3.2.2.4 半连接(semi join)149 3.2.2.5 笛卡儿连接151 3.2.2.6 外连接(outer join)154 3.2.2.7 索引连接159 3.2.3 其他运算方式的执行...

    基于Nested Logit模型的出行路线方式选择和时间价值计算

    基于Nested Logit模型的出行路线方式选择和时间价值计算,宗芳,祁文田,本文介绍了Nested Logit模型的效用最大化理论、选择树的建立以及其概率表达式;时间价值的基本计算公式。对人们由长春到吉林的出行路

    Oracle中的半联结和反联结详解

    而反联结便是半联结的补集,它们会作为数据库中常见的联结方法如NESTED LOOPS,MERGE SORT JOIN,HASH JOIN的选项出现。 实际上半联结和反联结本身也可以被认同是两种联结方法;在CBO优化模式下,优化器能够根据实际...

    ORACLE9i_优化设计与系统调整

    第一部分 ORACLE系统优化基本知识 23 第1章 ORACLE结构回顾 23 §1.1 Oracle数据库结构 23 §1.1.1 Oracle数据字典 23 §1.1.2 表空间与数据文件 24 §1.1.3 Oracle实例(Instance) 24 §1.2 Oracle文件 26 §1.2.1...

    基于C++实现⾃然连接操作算法【100010157】

    本次实验三需要完成的内容为实现⾃然连接(natural join)操作算法,对两个关系进⾏⾃然连接,具体实现基于块的嵌套循环连接(Block-based Nested Loop Join)算法。我们要实现的函数在executer.cpp文件中。

    怎样看懂Oracle的执行计划

    教你怎样看懂Oracle的执行计划。

    Oracle的执行计划

    Oracle的执行计划,本文档说明了Oracle的执行计划,非原创,好东西再这里分项下

    Oracle实战优化器

    为SQL生成最佳的执行计划,比如什么时候是全表扫描(FTS full table scan),什么时候是 索引范围搜索(Index Range Scan),或者是全...HASH_JOIN 还是NESTED LOOPS 或者是MERGE JOIN。这些因素直接决定了SQL 的执行效率。

Global site tag (gtag.js) - Google Analytics