出自: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
相关推荐
C#代码可以通过ADO.NET或者其他数据库访问库连接到SQL Server和Oracle,读取SQL Server的表结构,然后在Oracle中创建相应的表。 3. **注释迁移**:在SQL Server中的表注释和字段注释,通常存储在系统视图中。C#代码...
Oracle 左连接右连接学习 Oracle 中的连接(Join)是一种强大的工具,用于将两个或多个表合并成一个结果集。在学习 Oracle 连接时,可能会感到困惑,因为有多种类型的连接,每种类型都有其特点和应用场景。下面我们...
oracle表连接学习总结(火) oracle表连接学习总结(火) oracle表连接学习总结(火)
通过对Oracle中多表连接技术的学习,我们可以更加灵活地处理复杂的查询需求。正确使用各种类型的连接,能够帮助我们高效地获取所需的数据,并且避免出现不必要的数据冗余。希望本文能够对大家在实际工作中运用Oracle...
在易语言中,开发Oracle数据库连接模块是为了实现对Oracle数据库的高效、便捷操作。Oracle数据库是全球广泛使用的大型关系型数据库管理系统,适用于处理大量数据和并发事务。 Oracle数据库连接模块的核心在于如何...
oracle学习笔记(oracle远程连接),有具体的案例说明。
本篇文章将深入探讨Oracle中的左连接(LEFT JOIN)和右连接(RIGHT JOIN),这两种连接方式都是为了在不同表之间建立联系,特别是在数据不完全匹配的情况下。 首先,我们来看一下左连接(LEFT JOIN)。左连接返回左...
在"oracle连接.e"这个文件中,很可能是包含了一个使用易语言编写的示例程序,演示了如何配置和使用上述组件来实现数据库的连接和数据操作。通过学习和理解这个示例,开发者可以快速掌握易语言与Oracle数据库的交互...
Oracle ManagedDataAccess提供了与ADO.NET兼容的接口,使得开发者可以利用已有的ADO.NET知识来操作Oracle数据库,而无需深入学习Oracle的原生API。 在"Oracle C# ManagedDataAccess.dll连接的小实例"中,我们将探讨...
总的来说,Oracle数据库连接工具,尤其是SQL Developer,为用户提供了全面且直观的数据库管理平台,是学习和工作中不可或缺的工具。通过掌握其使用,不仅可以提高工作效率,还能深入理解Oracle数据库的运作机制。
韩顺平的“玩转Oracle”视频教程旨在帮助学习者掌握Oracle的核心概念和技术。以下是对视频教程笔记的详细解析: 首先,Oracle认证是成为Oracle数据库管理员的重要步骤,这涉及到对数据库系统的深入理解和操作。与...
在提供的压缩文件中,"oracle连接二"可能包含对第二种方法(ODAC)的详细步骤或示例代码,"oracle连接测试"可能是一些测试连接数据库的代码片段,而"ShowDemo"可能是一个完整的演示应用程序,展示如何使用这三种方法...
在这篇教程中,我们将学习如何新建Oracle数据库并连接到该数据库。该教程分为两部分:新建Oracle数据库和连接到数据库。 新建Oracle数据库 新建Oracle数据库需要使用Database Configuration Assistant工具,该工具...
这些文档是学习和应用Kettle进行数据转换的重要参考资料,务必仔细阅读并实践其中的案例。 总之,Kettle作为一个强大的ETL工具,使得Oracle到MySQL的数据转换变得直观且高效。通过理解其工作原理和配置方法,你可以...
2. **建立连接**:创建一个`CConnection`对象,使用`Open`方法连接到Oracle数据库。连接字符串是关键,它包含了数据库的地址、用户名、密码等信息。例如: ``` CConnection conn; conn.Open("Provider=MSDAORA;...
ODAC(Oracle Data Access Components)是用于Delphi和C++Builder的组件库,它提供了高效、全面的Oracle数据库访问功能。这个组件集使得开发者...通过学习和掌握ODAC,开发者可以更高效地构建和维护Oracle数据库应用。
本篇将详细介绍如何使用Java连接Oracle数据库,并提供一个封装好的连接类的使用方法。 首先,我们需要了解JDBC的基本概念。JDBC是Java平台的标准API,它允许Java应用程序连接到各种类型的数据库,包括Oracle。在...
用 Java 调用 Oracle 存储过程时,需要使用 JDBC 驱动程序来连接 Oracle 数据库,然后使用 CallableStatement 对象来调用存储过程。 在存储过程中做简单动态查询 在存储过程中,做简单动态查询需要使用 EXECUTE ...
在IT行业中,Oracle数据库系统是广泛使用的数据库管理系统之一,尤其在企业级应用中占据着重要地位。本篇文章将详细介绍在Oracle环境下新建数据库以及配置连接的...在Oracle的世界里,持续学习和实践是提升技能的关键。
Oracle学习笔记是李兴华老师编写的Oracle从入门到精通的学习笔记,涵盖了 Oracle 的多表查询、连接、组函数和分组统计等知识点。在本篇笔记中,李兴华老师详细介绍了多表查询的基本语法、左右连接、交叉连接、自然...