`
dacoolbaby
  • 浏览: 1263289 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

[转]Oracle表连接方式学习

阅读更多

出自: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

 

 

 

  • 大小: 3.8 KB
  • 大小: 3.7 KB
  • 大小: 4.2 KB
分享到:
评论

相关推荐

    SqlServer表结构转oracle表结构

    C#代码可以通过ADO.NET或者其他数据库访问库连接到SQL Server和Oracle,读取SQL Server的表结构,然后在Oracle中创建相应的表。 3. **注释迁移**:在SQL Server中的表注释和字段注释,通常存储在系统视图中。C#代码...

    oracle 左连接 右连接学习

    Oracle 左连接右连接学习 Oracle 中的连接(Join)是一种强大的工具,用于将两个或多个表合并成一个结果集。在学习 Oracle 连接时,可能会感到困惑,因为有多种类型的连接,每种类型都有其特点和应用场景。下面我们...

    oracle表连接学习总结(火)

    oracle表连接学习总结(火) oracle表连接学习总结(火) oracle表连接学习总结(火)

    oracle多表连接技巧

    通过对Oracle中多表连接技术的学习,我们可以更加灵活地处理复杂的查询需求。正确使用各种类型的连接,能够帮助我们高效地获取所需的数据,并且避免出现不必要的数据冗余。希望本文能够对大家在实际工作中运用Oracle...

    oracle学习笔记(oracle远程连接)

    oracle学习笔记(oracle远程连接),有具体的案例说明。

    易语言oracle数据库连接模块源码

    在易语言中,开发Oracle数据库连接模块是为了实现对Oracle数据库的高效、便捷操作。Oracle数据库是全球广泛使用的大型关系型数据库管理系统,适用于处理大量数据和并发事务。 Oracle数据库连接模块的核心在于如何...

    Oracle 左连接、右连接

    本篇文章将深入探讨Oracle中的左连接(LEFT JOIN)和右连接(RIGHT JOIN),这两种连接方式都是为了在不同表之间建立联系,特别是在数据不完全匹配的情况下。 首先,我们来看一下左连接(LEFT JOIN)。左连接返回左...

    易语言连接Oracle数据库

    在"oracle连接.e"这个文件中,很可能是包含了一个使用易语言编写的示例程序,演示了如何配置和使用上述组件来实现数据库的连接和数据操作。通过学习和理解这个示例,开发者可以快速掌握易语言与Oracle数据库的交互...

    oracle ManagedDataAccess连接实例

    Oracle ManagedDataAccess提供了与ADO.NET兼容的接口,使得开发者可以利用已有的ADO.NET知识来操作Oracle数据库,而无需深入学习Oracle的原生API。 在"Oracle C# ManagedDataAccess.dll连接的小实例"中,我们将探讨...

    Oracle 数据库连接工具

    总的来说,Oracle数据库连接工具,尤其是SQL Developer,为用户提供了全面且直观的数据库管理平台,是学习和工作中不可或缺的工具。通过掌握其使用,不仅可以提高工作效率,还能深入理解Oracle数据库的运作机制。

    韩顺平玩转oracle视频教程笔记

    韩顺平的“玩转Oracle”视频教程旨在帮助学习者掌握Oracle的核心概念和技术。以下是对视频教程笔记的详细解析: 首先,Oracle认证是成为Oracle数据库管理员的重要步骤,这涉及到对数据库系统的深入理解和操作。与...

    C# oracle三种连接方法

    在提供的压缩文件中,"oracle连接二"可能包含对第二种方法(ODAC)的详细步骤或示例代码,"oracle连接测试"可能是一些测试连接数据库的代码片段,而"ShowDemo"可能是一个完整的演示应用程序,展示如何使用这三种方法...

    Oracle-新建Oracle数据库并连接(图文,详细).docx

    在这篇教程中,我们将学习如何新建Oracle数据库并连接到该数据库。该教程分为两部分:新建Oracle数据库和连接到数据库。 新建Oracle数据库 新建Oracle数据库需要使用Database Configuration Assistant工具,该工具...

    使用kettle转换oracle与 mysql的表数据

    这些文档是学习和应用Kettle进行数据转换的重要参考资料,务必仔细阅读并实践其中的案例。 总之,Kettle作为一个强大的ETL工具,使得Oracle到MySQL的数据转换变得直观且高效。通过理解其工作原理和配置方法,你可以...

    delphi ODAC oracle 连接控件

    ODAC(Oracle Data Access Components)是用于Delphi和C++Builder的组件库,它提供了高效、全面的Oracle数据库访问功能。这个组件集使得开发者...通过学习和掌握ODAC,开发者可以更高效地构建和维护Oracle数据库应用。

    Oracle数据库连接封装类

    本篇将详细介绍如何使用Java连接Oracle数据库,并提供一个封装好的连接类的使用方法。 首先,我们需要了解JDBC的基本概念。JDBC是Java平台的标准API,它允许Java应用程序连接到各种类型的数据库,包括Oracle。在...

    oracle存储过程学习经典入门

    用 Java 调用 Oracle 存储过程时,需要使用 JDBC 驱动程序来连接 Oracle 数据库,然后使用 CallableStatement 对象来调用存储过程。 在存储过程中做简单动态查询 在存储过程中,做简单动态查询需要使用 EXECUTE ...

    oracle新建数据库和连接配置步骤

    在IT行业中,Oracle数据库系统是广泛使用的数据库管理系统之一,尤其在企业级应用中占据着重要地位。本篇文章将详细介绍在Oracle环境下新建数据库以及配置连接的...在Oracle的世界里,持续学习和实践是提升技能的关键。

    Oracle学习笔记

    Oracle学习笔记是李兴华老师编写的Oracle从入门到精通的学习笔记,涵盖了 Oracle 的多表查询、连接、组函数和分组统计等知识点。在本篇笔记中,李兴华老师详细介绍了多表查询的基本语法、左右连接、交叉连接、自然...

    PDA连接Oracle实例(源码)

    本示例提供了一个通过WebService方式实现PDA与Oracle数据库连接的源码,帮助开发者理解如何在掌上设备上进行远程数据库操作。 首先,我们来了解WebService的基本概念。WebService是一种基于开放标准(如XML、WSDL和...

Global site tag (gtag.js) - Google Analytics