文档章节

[转]Oracle表连接方式学习

吐槽的达达仔
 吐槽的达达仔
发布于 2014/12/05 22:18
字数 1882
阅读 41
收藏 0

出自:http://www.itpub.net/thread-207865-1-1.html

 

一般常见的Oracle数据库连接有3种:

Nested Loop,Merge,Hash Join

 

1.嵌套循环联接NL(Neeted Loop)
    嵌套循环联接也称为嵌套迭代,它将一个联接输入用作外部输入表(显示为图形执行计划中的顶端输入),将另一个联接输入用作内部(底端)输入表。外部循环逐行消耗外部输入表。

    内部循环为每个外部行执行,在内部输入表中搜索匹配行。最简单的情况是,搜索时扫描整个表或索引;这称为单纯嵌套循环联接。

    如果搜索时使用索引,则称为索引嵌套循环联接。

    如果将索引生成为查询计划的一部分(并在查询完成后立即将索引破坏),则称为临时索引嵌套循环联接。查询优化器考虑所有这些不同形式。

    如果外部输入很小而内部输入很大且预先创建了索引,则嵌套循环联接尤其有效。

    在许多小事务中(如那些只影响较小的一组行的事务),索引嵌套循环联接远比合并联接和哈希联接优越。但在大查询中,嵌套循环联接通常不是最佳选择。

    

    总而言之,nested loop适合于关联2个表结果集小的,而且关联字段上面存在索引的数据。

 

2.合并联接(Merge)
    合并联接要求两个输入都在合并列上排序,而合并列由联接谓词的等效 (WHERE) 子句定义。查询优化器一般扫描索引(如果在适当的一组列上存在一个索引),或在合并联接的下面放一个排序运算符。在很少的情况下,虽然可能有多个等效子句,但只用其中一些可用的等效子句获得合并列。   
    由于每个输入都已排序,Merge Join 运算符将获取每个输入中的行并将其进行比较。例如,对于内联接操作,如果行相等则返回。如果行不相等,则废弃值较小的行并从该输入中获得另一行。这一过程将重复进行,直到处理完所有的行为止。
    合并联接操作可以是常规操作,也可以是多对多操作。多对多合并联接使用临时表存储行。如果每个输入中有重复值,则在处理其中一个输入中的每个重复项时,另一个输入必须重绕到重复项的开始位置。
    如果存在驻留谓词,所有满足合并谓词的行都将对该驻留谓词取值,然后只返回那些满足该驻留谓词的行。
    合并联接本身的速度很快,但如果需要排序操作,选择合并联接就会非常费时。然而,如果数据量很大且能够从现有 B 树索引中获得预排序的所需数据,则合并联接通常是最快的可用联接算法。

 

3.哈希联接(Hash Join)
    哈希联接有两种输入:生成输入和探测输入。查询优化器指派这些角色,使两个输入中较小的那个作为生成输入。
     哈希联接可用于许多类型的集合匹配操作:内联接,左向外联接、右向外联接和完整外联接,左向半联接和右向半联接、交集、联合和差分。而且,哈希联接的变化形式能够进行重复项删除和分组操作(如 SUM(salary) GROUP BY department)。这些修改对生成和探测角色只使用一个输入。
     与合并联接相似,只有当联接谓词中至少有一个等效 (WHERE) 子句时才能使用哈希联接。然而,联接一般用于重组合由主键和外键之间的等效谓词表达的关系,因此大多数联接至少有一个等效子句。用等效谓词表达的列集合称为哈希键,因为这些列有助于哈希函数。还可以有附加的谓词,并且可以将这些谓词取值为驻留谓词以与哈希值比较分开。哈希键可以是表达式,只要能从单个行中的列对其进行排它计算。在分组操作中,按列表分组的列是哈希键。在交集等集合操作中以及删除复制项时,哈希键由所有列组成。

 

关于哈希连接的补充:

内存中的哈希联接
     哈希联接先扫描或计算整个生成输入,然后在内存中生成哈希表。根据为哈希键计算出的哈希值,将每行插入哈希存储桶。如果整个生成输入比可用内存少,则可以将所有行都插入哈希表中。生成阶段后接着是探测阶段。一次一行地对整个探测输入进行扫描或计算,并为每个探测行计算哈希键的值,扫描相应的哈希存储桶并生成匹配项。

Grace 哈希联接
     如果生成输入不适合内存,哈希联接将分步进行。每一步都包括生成阶段和探测阶段。首先,消耗整个生成和探测输入并(使用哈希键上的哈希函数)将其分区为多个文件。这类文件的数目称为分区输出端。通过使用哈希键上的哈希函数,可以保证任意两个联接记录必在相同的文件对中。因此,联接两个大输入的任务简化为相同任务的多个较小的实例。然后将哈希联接应用于每对分区文件。

递归哈希联接
     如果生成输入非常大,以至于标准外部合并排序的输入需要多个合并级别,则需要多个分区步骤和多个分区级别。如果只有某些分区较大,则只需对这些分区使用附加的分区步骤。为使所有的分区步骤尽可能快,将使用大的异步 I/O 操作以便单个线程就能使多个磁盘驱动器繁忙工作。

 

表连接用法介绍:

1.什么时候使用NL
必须有一个table拥有index;
只用一个table有index时,选择没有index的table作为驱动表;
当两个table都有index时,选择结果集较小的table作为驱动表 (CBO),RBO会选from的最后一个表做驱动表;
适用于有index的连接,两个有大小差异的结果集,数据量较小。

 

2.Merge Join
合并列要求排序;
在不使用index的情况下使用MR join:
在连接table的字段上不存在可用的index;
查询将返回两个table中大部分的数据块;
CBO认为table scan比index range scan更少的cost;
适用于没有index的连接,或两个大小接近的超大
结果集。

 

3.Hash join
在oracle7.3中作为NL join的代替方式首次引入的。
大小不同的结果集进行连接,小的结果集作为驱动表,创建基
于内存的Hash table,大的结果集计算hash value。

 

下面是图:

Nested Join:



 

Merge



 

Hash Join

 

 

 

本文转载自:http://dacoolbaby.iteye.com/blog/1845362

吐槽的达达仔
粉丝 28
博文 104
码字总数 7105
作品 0
广州
程序员
私信 提问
ORACLE学习笔记--性能优化7

<14>. /+ADDEQUAL TABLE INDEXNAM1,INDEX_NAM2,.../ 提示明确进行执行规划的选择,将几个单列索引的扫描合起来. 例如:   SELECT /+INDEXFFS(BSEMPMS INDPTNO,INEMPNO,INSEX)/ * FROM BSEMPM......

长征2号
2017/12/31
0
0
Oracle Table连接方式分析

表连接基本知识: 1、哪张表将驱动查询(即访问的第一张表)?按照指定的路径查询,何时将访问到没一张表?可选的驱动路径有哪些? 2、可能出现哪些Oracle连接?记住:在Oracle中,连接顺序、...

余二五
2017/11/16
0
0
【转】Oracle执行计划详解

简介: 本文全面详细介绍oracle执行计划的相关的概念,访问数据的存取方法,表之间的连接等内容。 并有总结和概述,便于理解与记忆! +++ 目录 --- 一.相关的概念 Rowid的概念 Recursive Sq...

王小明123
2014/04/30
496
0
Oracle数据库安装、连接与数据导入

Oracle数据库安装 个人学习建议用XE版本,短小精悍,才315M,完整版好几G,太耗资源。我安装的是64位的版本,版本号为OracleXE112_Win64,直接点击setup.exe进行安装,直到完成,打开window服...

留给明天
2016/09/04
206
0
数据库 JAVA JavaScript Struts2

数据库的学习与应用 从最基础的Oracle的安装与安装完成后的检查情况以及select语句讲起,oracle作为一种适用于大型、中型和微型计算机的关系数据库管理系统,操作相对比较繁琐,从select语句、...

CarlDing
2016/05/20
96
0

没有更多内容

加载失败,请刷新页面

加载更多

【TencentOS tiny】深度源码分析(4)——消息队列

消息队列 在前一篇文章中【TencentOS tiny学习】源码分析(3)——队列 我们描述了TencentOS tiny的队列实现,同时也点出了TencentOS tiny的队列是依赖于消息队列的,那么我们今天来看看消息...

杰杰1号
14分钟前
4
0
Hive

这就是那个 JAVA 类 package cn.itcast.bigdata;import java.util.HashMap;import org.apache.hadoop.hive.ql.exec.UDF;public class PhoneNbrToArea extends UDF{privat......

Garphy
14分钟前
6
0
Springboot开发,第二天

SpringBoot学习,第二天 目录:1、Springboot整合Listener 2、Springboot访问静态资源 3、异常处理 4、热部署 一、SpringBoot整合Listener 两种方式完成组件的注册 1、通过注解扫描完成组件的...

有一个小阿飞
18分钟前
5
0
BeginnersBook Perl 教程

来源:ApacheCN BeginnersBook 翻译项目 译者:飞龙 协议:CC BY-NC-SA 4.0 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 请您勇敢地去翻译和改进翻译。虽然我们追求卓越,但我们并...

ApacheCN_飞龙
30分钟前
5
0
我的Java秋招面经大合集

阿里面经 阿里中间件研发面经 蚂蚁金服研发面经 岗位是研发工程师,直接找蚂蚁金服的大佬进行内推。 我参与了阿里巴巴中间件部门的提前批面试,一共经历了四次面试,拿到了口头offer。 然后我...

Java技术江湖
35分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部