`
qinglin876
  • 浏览: 13090 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

谈Oracle中的三种Join方法

阅读更多
转自:http://database.51cto.com/art/200905/122793.htm

摘要:这里将为大家介绍Oracle中的三种Join方法,Nested loop join、Sort merge join和Hash join。整理出来以便帮助大家学习。
标签:Oracle  Join  查询
Oracle帮您准确洞察各个物流环节

基本概念

Nested loop join:

Outer table中的每一行与inner table中的相应记录join,类似一个嵌套的循环。

Sort merge join:

将两个表排序,然后再进行join。

Hash join:

将两个表中较小的一个在内存中构造一个Hash 表(对Join Key),扫描另一个表,同样对Join Key进行Hash后探测是否可以join,找出与之匹配的行。

一张小表被hash在内存中。因为数据量小,所以这张小表的大多数数据已经驻入在内存中,剩下的少量数据被放置在临时表空间中;

每读取大表的一条记录,就和小表中内存中的数据进行比较,如果符合,则立即输出数据(也就是说没有读取临时表空间中的小表的数据)。而如果大表的数据与小表中临时表空间的数据相符合,则不直接输出,而是也被存储临时表空间中。

当大表的所有数据都读取完毕,将临时表空间中的数据以其输出。如果小表的数据量足够小(小于hash area size),那所有数据就都在内存中了,可以避免对临时表空间的读写。

如果是并行环境下,前面中的第2步就变成如下了:每读取一条大表的记录,和内存中小表的数据比较,如果符合先做join,而不直接输出,直到整张大表数据读取完毕。如果内存足够,Join好的数据就保存在内存中。否则,就保存在临时表空间中。

适用范围

Nested loop join:

适用于outer table(有的地方叫Master table)的记录集比较少(<10000)而且inner table(有的地方叫Detail table)索引选择性较好的情况下(inner table要有index)。

inner table被outer table驱动,outer table返回的每一行都要在inner table中检索到与之匹配的行。当然也可以用ORDERED 提示来改变CBO默认的驱动表,使用USE_NL(table_name1 table_name2)可是强制CBO 执行嵌套循环连接。

cost  = outer access cost + (inner access cost * outer cardinality)

Sort merge join:

用在数据没有索引但是已经排序的情况下。

通常情况下hash join的效果都比Sort merge join要好,然而如果行源已经被排过序,在执行排序合并连接时不需要再排序了,这时Sort merge join的性能会优于hash join。可以使用USE_MERGE(table_name1 table_name2)来强制使用Sort merge join。
cost = (outer access cost * # of hash partitions) + inner access cost

Hash join:

适用于两个表的数据量差别很大。但需要注意的是:如果HASH表太大,无法一次构造在内存中,则分成若干个partition,写入磁盘的temporary segment,则会多一个I/O的代价,会降低效率,此时需要有较大的temporary segment从而尽量提高I/O的性能。

可以用USE_HASH(table_name1 table_name2)提示来强制使用散列连接。如果使用散列连HASH_AREA_SIZE 初始化参数必须足够的大,如果是9i,Oracle建议使用SQL工作区自动管理,设置WORKAREA_SIZE_POLICY 为AUTO,然后调整PGA_AGGREGATE_TARGET 即可。

也可以使用HASH_JOIN_ENABLED=FALSE(默认为TRUE)强制不使用hash join。

cost = (outer access cost * # of hash partitions) + inner access cost

效率比较

Hash join的主要资源消耗在于CPU(在内存中创建临时的hash表,并进行hash计算),而merge join的资源消耗主要在于磁盘I/O(扫描表或索引)。在并行系统中,hash join对CPU的消耗更加明显。所以在CPU紧张时,最好限制使用hash join。

在绝大多数情况下,hash join效率比其他join方式效率更高:

在Sort-Merge Join(SMJ),两张表的数据都需要先做排序,然后做merge。因此效率相对最差;
Nested-Loop Join(NL)效率比SMJ更高。特别是当驱动表的数据量很大(集的势高)时。这样可以并行扫描内表。
Hash join效率最高,因为只要对两张表扫描一次。

分享到:
评论

相关推荐

    oracle中left join和right join的区别浅谈

    在Oracle数据库中,JOIN操作是用于合并两个或更多表中的数据行,以便基于它们之间的相关列获取结果集。LEFT JOIN(也称为LEFT OUTER JOIN)和RIGHT JOIN(也称为RIGHT OUTER JOIN)是两种特殊的JOIN类型,它们在处理...

    浅谈Oracle优化排序的操作

    ### 浅谈Oracle优化排序的操作 #### 概念与机制 在探讨Oracle排序操作的优化之前,我们首先需要理解Oracle数据库中的排序是如何发生的以及它所依赖的资源。Oracle的排序操作通常发生在以下几种情况下:创建索引、...

    浅谈Oracle数据库性能的优化

    ### 浅谈Oracle数据库性能的优化 #### 一、引言 随着信息技术的快速发展和企业对数据处理需求的增加,数据库作为数据管理的核心组件,在企业的信息化建设中扮演着至关重要的角色。Oracle数据库作为全球最广泛使用...

    浅谈ORACLE中的SQL优化.pdf

    【SQL优化在ORACLE数据库中的重要性】 在数据库管理系统中,SQL(Structured Query Language)语句的性能直接影响着系统的管理效率。尤其是对于大型数据库管理系统,如ORACLE,SQL语句的优化是提升系统性能的关键...

    试谈优化Oracle库表设计的若干方法.docx

    在数据库设计中,Oracle 库表的优化是提升系统性能的关键环节。许多性能问题源于设计不合理,而非硬件或DBA的配置调整。本文主要探讨如何优化Oracle数据库的表设计,尤其是索引策略,并通过PowerDesigner 10这一流行...

    浅谈Oracle数据库性能的优化技术.pdf

    本文将探讨几种常见的优化策略,包括合理建立数据库、SQL语句优化、数据库对象存储方式优化以及内存优化。 首先,**合理建立数据库**是优化的基础。数据库设计不仅要满足数据存储需求,还要考虑数据访问的速度和...

    二次开发中,数据库分析方法谈

    下面我们将详细探讨在二次开发中进行数据库分析的一些方法和要点。 首先,理解数据库架构是基础。这包括了解数据库的设计模式(如关系型、非关系型、层次型等),表之间的关联关系(如一对一、一对多、多对多),...

    赢在起点-数据库设计规范 梁敬彬大牛的经验之谈

    《赢在起点-数据库设计规范》是梁敬彬大师关于数据库设计的一份宝贵经验分享,主要涵盖了Oracle、MySql和DB2这三种主流数据库系统。本文将深入解析该主题中的关键知识点,帮助读者理解并掌握数据库设计的核心原则。 ...

    面试题目已经数据库培训

    这份文档可能会详细解释SQL的查询语句(SELECT)、数据操作(INSERT、UPDATE、DELETE)、数据定义(CREATE、ALTER、DROP)以及JOIN操作等,这些都是面试中常问的问题。 "面试题.doc"可能是历年面试真题集合,包含了...

    数据库设计经验谈.doc

    例如,MySQL适合小型到中型企业,而Oracle则适用于大型企业级应用。同时,利用ER图(实体关系图)工具可以帮助可视化和理解数据之间的关系。 获取数据模式资源手册是另一个好习惯,它可以提供已验证的设计模式和...

    PostgreSQL+经验谈(德哥)-PostgreSQL2012-p72

    10. **外部数据源表**:支持通过多种方式连接外部数据源,如其他PostgreSQL数据库、文件系统、MySQL、Oracle、Sybase、ODBC接口、Redis、CouchDB等,并能对这些外部数据源执行JOIN操作以及收集统计信息,虽然目前...

    如何优化SQL语句的心得浅谈

    1. **选择最有效的表名顺序**:在Oracle中,FROM子句的顺序影响解析过程。基础表应为记录数最少的表,而交叉表(被其他表引用的表)在多表连接中应优先处理。这有助于减少数据处理量。 2. **WHERE子句的连接顺序**...

    收获不止SQL优化

    3.1.5 获取执行计划的方法(6种武器) 40 3.2 读懂执行计划的关键 48 3.2.1 解释经典执行计划方法 49 3.2.2 总结说明 55 3.3 从案例辨别低效SQL 55 3.3.1 从执行计划读出效率 56 3.3.2 执行计划效率总结 60 ...

Global site tag (gtag.js) - Google Analytics