`

Oracle hash join

 
阅读更多

hash join是oracle里面一个非常强悍的功能,当做hash join时,oracle会选择一个表作为驱动表,先根据过滤条件排除不必要的数据,然后将结果集做成hash表,放入进程的hash area,接着扫描第二张表,将行的键值做hash运算,到内存的hash表里面去探测,如果探测成功,就返回数据,否则这行就丢弃掉这个是最基本的解 释,实际情况中,考虑到单个进程PGA的大小,oracle不会让进程任意的消耗OS内存,hash area是有一定限制的,所以在oracle中,hash也有三种模式:
optimal,onepass,multipass

optimal:当驱动结果集生成的hash表全部可以放入PGA的hash area时,称为optimal,大致过程如下:
1.先根据驱动表,得到驱动结果集
2.在hash area生成hash bulket,并将若干bulket分成一组,成为一个partition,还会生成一个bitmap的列表,每个bulket在上面占一位
3.对结果集的join键做hash运算,将数据分散到相应partition的bulket中,当运算完成后,如果键值唯一性较高的话,bulket里的数据会比较均匀,也有可能有的桶里面数据会是空的,这样bitmap上对应的标志位就是0,有数据的桶,标志位会是1
4.开始扫描第二张表,对jion键做hash运算,确定应该到某个partition的某个bulket去探测,探测之前,会看这个bulket的bitmap是否会1,如果为0,表示没数据,这行就直接丢弃掉
5.如果bitmap为1,则在桶内做精确匹配,判断OK后,返回数据

这个是最优的hash join,他的成本基本是两张表的full table scan,在加微量的hash运算

onepass
如果进程的pga很小,或者驱动表结果集很大,超过了hash area的大小,会怎么办?当然会用到临时表空间,此时oracle的处理方式稍微复杂点需奥注意上面提到的有个partition的概念,可以这么理 解,数据是经过两次hash运算的,先确定你的partition,再确定你的bulket,假设hash area小于整个hash table,但至少大于一个partition的size,这个时候走的就是onepass
当我们生成好hash表后,状况是部分partition留在内存中,其他的partition留在磁盘临时表空间中,当然也有可能某个partition一半在内存,一半在磁盘,剩下的步骤大致如下:
1.扫描第二张表,对join键做hash运算,确定好对应的partition和bulket
2.查看bitmap,确定bulket是否有数据,没有则直接丢弃
3.如果有数据,并且这个partition是在内存中的,就进入对应的桶去精确匹配,能匹配上,就返回这行数据,否则丢弃
4.如果partition是在磁盘上的,则将这行数据放入磁盘中暂存起来,保存的形式也是partition,bulket的方式
5.当第二张表被扫描完后,剩下的是驱动表和探测表生成的一大堆partition,保留在磁盘上
6.由于两边的数据都按照相同的hash算法做了partition和bulket,现在只要成对的比较两边partition数据即可,并且在比较的时 候,oracle也做了优化处理,没有严格的驱动与被驱动关系,他会在partition对中选较小的一个作为驱动来进行,直到磁盘上所有的 partition对都join完

可以发现,相比optimal,他多出的成本是对于无法放入内存的partition,重新读取了一次,所以称为onepass,只要你的内存保证能装下一个partition,oracle都会腾挪空间,每个磁盘partition做到onepass

multipass
这是最复杂,最糟糕的hash join,此时hash area小到连一个partition也容纳不下,当扫描好驱动表后,可能只有半个partition留在hash area中,另半个加其他的partition全在磁盘上,剩下的步骤和onepass比价类似,不同的是针对partition的处理
由于驱动表只有半个partition在内存中,探测表对应的partition数据做探测时,如果匹配不上,这行还不能直接丢弃,需要继续保留到磁盘, 和驱动表剩下的半个partition再做join,这里举例的是内存可以装下半个partition,如果装的更少的话,反复join的次数将更多,当 发生multipass时,partition物理读的次数会显著增加

分享到:
评论

相关推荐

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

    在这个学习笔记中,我们将深入探讨Oracle中的Hash Join操作,这是一种重要的联接(JOIN)类型,尤其在处理大数据量时能展现高效的性能。 Hash Join的基本原理是通过构建一个哈希表来实现两个表的连接。首先,Oracle...

    oracle性能优化技巧

    ### Oracle性能优化技巧详解 #### 一、Oracle优化器模式 在Oracle数据库中,优化器是决定查询执行计划的关键组件,其目标是最小化资源消耗并最大化查询性能。Oracle提供了三种主要的优化器模式:基于规则(RULE)...

    OracleHashJoin算法原理分享.pdf

    Oracle的Hash Join算法是一种高效的连接操作,尤其适用于处理大规模数据集。自Oracle 7.3开始,这种算法被引入,但仅在Cost-Based Optimizer (CBO)模式下可用。Hash Join主要应用于相等连接(equijoin),并且不依赖...

    hash join 原理和算法

    如果某个分区的哈希表仍然过大,Oracle会退化为Nested-Loops Hash Join,逐个对剩余的分区构建哈希表并与之连接。 **二、Hash Join原理** 在实际操作中,Oracle使用哈希函数对连接键进行运算,将数据分到不同的...

    hash join算法原理

    如果分区后仍然有Hash Table无法完全放入内存,Oracle会采取Nested Loops Hash Join,即对部分Si构建Hash Table,逐个与所有Bi执行连接操作,直到所有Si完成连接。 2. Join阶段:对于每个分区,进行Hash Join操作。...

    hash join算法

    Hash Join 算法是一种高效的连接算法,自 Oracle 7.3 开始,Oracle 提供了这种新型的 Join 技术。 Hash Join 只能用于相等连接,且只能在 CBO 优化器模式下。相对于 Nested Loop Join,Hash Join 更适合处理大型结果...

    转--一次HASH JOIN 临时表空间不足的分析和优化思路

    在数据库管理领域,Hash JOIN是一种常见的SQL查询执行策略,尤其在处理大数据量的关联操作时。本文将深入探讨一次Hash JOIN过程中遇到的临时表空间不足的问题,并提供相应的分析和优化思路。 首先,我们需要理解...

    Hash join算法原理

    Hash Join 算法是 Oracle 数据库中一种高效的连接操作方法,特别适用于处理大数据量的查询。自从 Oracle 7.3 版本开始引入,它主要用于处理相等连接,并且只在 Cost-Based Optimizer (CBO) 模式下运行。相比Nested ...

    Oracle中hash join研究.pdf

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

    Oracle表连接方式

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

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

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

    oracle9i的查询优化

    ### Oracle9i的查询优化深度解析 #### 引言 Oracle9i的查询优化是数据库管理系统中的关键组件,它能够显著提升SQL查询的执行效率,从而优化整个数据库系统的性能。查询优化器通过智能分析和调整SQL语句的执行计划...

    oracle表的连接方式

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

    Oracle的三种表连接方式

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

    oracle join on 数据过滤问题

    在Oracle数据库中,JOIN操作是连接两个或多个表以获取跨表的数据。在这个特定的问题中,用户遇到了在使用JOIN ON进行数据过滤时遇到的问题。原始的SQL查询未能返回期望的所有结果,但通过调整查询结构,用户成功地...

    Oracle临时表空间不足和批处理缓慢问题探讨.pdf

    6. Hash Join 的作用:Hash Join 可以提高 SQL 语句的执行效率,但其也可能会消耗大量的临时表空间。 7. Oracle 数据库的性能优化:Oracle 数据库的性能优化需要从多方面入手,包括服务器硬件性能、操作系统设置、...

    Oracle 执行计划

    HASH JOIN 2 HASH JOIN TABLE ACCESS FULL ( PRODUCTS ) 3 TABLE ACCESS FULL PARTITION RANGE ALL 4 PARTITION RANGE ALL TABLE ACCESS FULL ( SALES ) 5 TABLE ACCESS FULL ``` 以上表格中的ID表示操作符的编号,...

    怎样看懂Oracle的执行计划

    在这个示例中,执行计划的根操作是SELECT语句,它依赖于HASH JOIN操作,而HASH JOIN操作又依赖于两个TABLE ACCESS操作。执行顺序是:SELECT STATEMENT -> HASH JOIN -> TABLE ACCESS (FULL) OF 'DEPT' -> TABLE ...

    hash_join.pdf

    主要内容包括嵌套循环连接(Nested Loops Join, NLJ)、排序合并连接(Sort Merge Join, SMJ)、并行哈希连接、反连接与外连接、哈希连接算法、成本计算、内存中哈希连接、磁盘上哈希连接以及哈希连接的性能调优等...

Global site tag (gtag.js) - Google Analytics