`

NESTED LOOP、HASH JOIN、SORT MERGE JOIN

 
阅读更多

表连接方式及使用场合

NESTED LOOP

    对于被连接的数据子集较小的情况,nested loop连接是个较好的选择。nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查找,没有索引一般就不会是 nested loops。
一般在nested loop中, 驱动表满足条件结果集不大,被驱动表的连接字段要有索引,这样就走nstedloop。如果驱动表返回记录太多,就不适合nested loops了。如果连接字段没有索引,则适合走hash join,因为不需要索引。
可用ordered提示来改变CBO默认的驱动表,可用USE_NL(table_name1 table_name2)提示来强制使用nested loop。

HASH JOIN

   hash join是CBO 做大数据集连接时的常用方式。优化器扫描小表(或数据源),利用连接键(也就是根据连接字段计算hash 值)在内存中建立hash表,然后扫描大表,每读到一条记录就来探测hash表一次,找出与hash表匹配的行。
当 小表可以全部放入内存中,其成本接近全表扫描两个表的成本之和。如果表很大不能完全放入内存,这时优化器会将它分割成若干不同的分区,不能放入内存的部分 就把该分区写入磁盘的临时段,此时要有较大的临时段从而尽量提高I/O 的性能。临时段中的分区都需要换进内存做hash join。这时候成本接近于全表扫描小表+分区数*全表扫描大表的代价和。
    至于两个表都进行分区,其好处是可以使用parallel query,就是多个进程同时对不同的分区进行join,然后再合并。但是复杂。
使用hash join时,HASH_AREA_SIZE初始化参数必须足够的大,如果是9i,Oracle建议使用SQL工作区自动管理,设置WORKAREA_SIZE_POLICY 为AUTO,然后调整PGA_AGGREGATE_TARGET即可。
以下条件下hash join可能有优势:
两个巨大的表之间的连接。
在一个巨大的表和一个小表之间的连接。
可用ordered提示来改变CBO默认的驱动表,可用USE_HASH(table_name1 table_name2)提示来强制使用hash join。

SORT MERGE JOIN

    sort merge join的操作通常分三步:对连接的每个表做table access full;对table access full的结果进行排序;进行merge join对排序结果进行合并。sort merge join性能开销几乎都在前两步。一般是在没有索引的情况下,9i开始已经很少出现了,因为其排序成本高,大多为hash join替代了。
通常情况下hash join的效果都比sort merge join要好,然而如果行源已经被排过序,在执行sort merge join时不需要再排序了,这时sort merge join的性能会优于hash join。
在全表扫描比索引范围扫描再通过rowid进行表访问更可取的情况下,sort merge join会比nested loops性能更佳。
可用USE_MERGE(table_name1 table_name2)提示强制使用sort merge join。

分享到:
评论

相关推荐

    hash join 原理和算法

    如果Hash Join的成本低于其他类型的Join操作,比如Nested Loop或Sort Merge Join,那么CBO会选择Hash Join。 总结来说,Hash Join是一种高效的连接操作方法,尤其适用于大型数据集。它通过构建哈希表和分区策略来...

    oracle表的连接方式

    Oracle提供了三种主要的表连接方式:NESTED LOOP JOIN、HASH JOIN和SORT MERGE JOIN。每种方法都有其独特的应用场景和性能特点。 #### NESTED LOOP JOIN NESTED LOOP JOIN是一种简单的连接方式,适用于连接的数据...

    Oracle表连接方式

    根据不同的数据集和查询需求,Oracle提供了多种表连接方式,包括NESTED LOOP、HASH JOIN和SORT MERGE JOIN等。 NESTED LOOP NESTED LOOP是一种基本的表连接方式,适用于被连接的数据子集较小的情况。在nested loop...

    Oracle CBO 学习笔记之(1) : 深入理解Oracle Hash Join的代价模型及其执行流程

    同时,理解何时Hash Join比其他类型的JOIN(如Nested Loop Join或Sort Merge Join)更适合,也是提升SQL性能的重要一环。 总之,Oracle CBO的Hash Join是数据库优化的关键技术之一,通过深入理解其代价模型和执行...

    Oracle 表三种连接方式使用介绍(sql优化)

    Oracle数据库在处理表之间的连接操作时提供了三种主要的连接方式:Nested Loop Join、Hash Join以及Sort Merge Join。这些连接方式各有特点,适用于不同的情景,理解它们的工作原理和适用条件对于SQL查询优化至关...

    数据库管理系统概述英文版课件:12 Join Algorithm.ppt

    包括简单嵌套循环Join(Simple-Nested Loop Join)、块嵌套循环Join(Block-Nested Loop Join)、排序合并Join(Sort-Merge Join)、索引嵌套循环Join(Index-Nested Loop Join)以及哈希Join(Hash Join)。...

    chapter15 实践习题2

    该练习考察了不同类型的连接操作(Nested Loop Join, Block Nested Loop Join, Merge Join, Hash Join)在不同内存大小(M)条件下的磁盘访问次数。计算了每种连接方法所需的磁盘访问次数,并考虑了内外层关系的交换...

    Apache Flink 维表关联实战.pdf

    Streaming SQL Join 面向无界数据集的 SQL,无法缓存历史所有数据,因此像 Sort-Merge Join 需要对数据进行排序是无法做到的,Nested-loop Join 和 Hash Join 经过一定的改良则可以满足实时 SQL 的要求。 Flink 中...

    Oracle中hash join研究.pdf

    哈希连接(Hash Join)是Oracle数据库中的一种高效连接方法,主要针对等值连接操作,其引入旨在解决嵌套循环连接(Nested Loop Join)中的大量随机读取问题以及排序合并连接(Sort-Merge Join)中的排序成本过高问题...

    关于Oracle的SQL性能调整.pdf

    表连接的方式多样,如哈希连接(Hash Join)、嵌套循环连接(Nested Loop Join)和排序合并连接(Sort Merge Join),每种连接方式有其特定的适用场景。DBA需根据实际情况进行优化选择,这个过程可能较为耗时,因为...

    Oracle优化常用概念.pptx

    表连接主要有三种方式:Hash Join、Nested Loop和Sort Merge Join。Nested Loop适合有高选择性索引和限制性搜索的情况,但对大表和无索引的情况效率较低。Sort Merge Join在缺乏明确索引或进行不等值连接时较为有效...

    关于Oracle优化常用概念解析.pptx

    主要有三种连接方式:Hash Join、Nested Loop和Merge Join。Nested Loop适合小表连接大表,当有高选择性索引时效率较高,但对大表连接或无合适索引的情况,效率会下降。Sort Merge适合处理不等值连接,需要额外的...

    Oracle的三种表连接方式

    Oracle 的三种表连接方式是指在做表 join 的时候, Oracle 有三种方式,分别是:sort merge join(SMJ) ·nest loop(NL) ·hash join(HJ)。下面是对这三种策略的详细讲解: sort merge join(SMJ) sort merge join ...

    Oracle数据库3种主要表连接方式对比

    本文将详细介绍三种主要的表连接方式:嵌套循环连接(Nested Loop Join,简称NL Join)、排序合并连接(Sort Merge Join,简称SM Join)以及散列连接(Hash Join)。我们将探讨它们的特点、优势与劣势,以便于在实际...

    总体技术方案2.docx

    相比于Sort-Merge Join和Nested-Loop Join,Hash join通常更高效,尤其是在数据量大且内存充足的情况下。 这个总体技术方案旨在构建一个高效、可靠的大数据处理平台,通过优化的分布式数据管理和高性能查询技术,...

    Greenplum内核揭秘之查询优化.pptx.pdf

    连接节点包括Nested Loop、Hash Join、Merge Join等。聚集节点包括Group By、Aggregate等。排序节点包括Sort等。 例如,下面是一个简单的查询计划: ``` QUERY PLAN --------------------------------------------...

Global site tag (gtag.js) - Google Analytics