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

hash join

阅读更多

参考http://www.cnitblog.com/weitom1982/archive/2006/03/31/8378.html

 

一.       Hash Join 概述

Hash join 算法的一个基本思想就是根据小的 row sources( 称作 build input ,我们记较小的表为 S ,较大的表为 B) 建立一个可以存在于 hash area 内存中的 hash table ,然后用大的 row sources( 称作 probe input) 来探测前面所建的 hash table 。如果 hash area 内存不够大, hash table 就无法完全存放在 hash area 内存中。针对这种情况, Oracle 在连接键利用一个 hash 函数将 build input probe input 分割成多个不相连的分区(分别记作 Si Bi ),这个阶段叫做分区阶段;然后各自相应的分区,即 Si Bi 再做 Hash join ,这个阶段叫做 join 阶段。

如果在分区后,针对某个分区所建的 hash table 还是太大的话, oracle 就采用 nested-loops hash join 。所谓的 nested-loops hash join 就是对部分 Si 建立 hash table ,然后读取所有的 Bi 与所建的 hash table 做连接,然后再对剩余的 Si 建立 hash table ,再将所有的 Bi 与所建的 hash table 做连接,直至所有的 Si 都连接完了。

Hash Join 算法有一个限制,就是它是在假设两张表在连接键上是均匀的,也就是说每个分区拥有差不多的数据。但是实际当中数据都是不均匀的,为了很好地解决这个问题, oracle 引进了几种技术,位图向量过滤、角色互换、柱状图,这些术语的具体意义会在后面详细介绍。

 

二.       Hash Join 原理

我们用一个例子来解释 Hash Join 算法的原理,以及上述所提到的术语。

考虑以下两个数据集。

S={1,1,1,3,3,4,4,4,4,5,8,8,8,8,10}

B={0,0,1,1,1,1,2,2,2,2,2,2,3,8,9,9,9,10,10,11}

Hash Join 的第一步就是判定小表(即 build input )是否能完全存放在 hash area 内存中。如果能完全存放在内存中,则在内存中建立 hash table ,这是最简单的 hash join

如果不能全部存放在内存中,则 build input 必须分区。分区的个数叫做 fan-out Fan-out 是由 hash_area_size cluster size 来决定的。其中 cluster size 等于 db_block_size * hash_multiblock_io_count hash_multiblock_io_count oracle9i 中是隐含参数。这里需要注意的是 fan-out 并不是 build input 的大小 /hash_ara_size ,也就是说 oracle 决定的分区大小有可能还是不能完全存放在 hash area 内存中。大的 fan-out 导致许多小的分区,影响性能,而小的 fan-out 导致少数的大的分区,以至于每个分区不能全部存放在内存中,这也影响 hash join 的性能。

Oracle 采用内部一个 hash 函数作用于连接键上,将 S B 分割成多个分区,在这里我们假设这个 hash 函数为求余函数,即 Mod(join_column_value,10) 。这样产生十个分区,如下表。

 

 

 

分区

 

B0

B1

B2

B3

B4

B5

B6

B7

B8

B9

0,0,10,10

1,1,1,1,11

2,2,2,2,2,2

3

NULL

NULL

NULL

NULL

8

9,9,9

S0

10

 

 

 

 

 

 

 

 

 

S1

1,1,1

 

 

 

 

 

 

 

 

 

S2

Null

 

 

 

 

 

 

 

 

 

 

S3

3,3

 

 

 

 

 

 

 

 

 

S4

4,4,4,4

 

 

 

 

 

 

 

 

 

 

S5

5

 

 

 

 

 

 

 

 

 

 

S6

NULL

 

 

 

 

 

 

 

 

 

 

S7

NULL

 

 

 

 

 

 

 

 

 

 

S8

8,8,8,8

 

 

 

 

 

 

 

 

 

S9

NULL

 

 

 

 

 

 

 

 

 

 

经过这样的分区之后,只需要相应的分区之间做 join 即可(也就是所谓的 partition pairs ),如果有一个分区为 NULL 的话,则相应的分区 join 即可忽略。

在将 S 表读入内存分区时, oracle 即记录连接键的唯一值,构建成所谓的位图向量,它需要占 hash area 内存的 5% 左右。在这里即为 {1,3,4,5,8,10}

当对 B 表进行分区时,将每一个连接键上的值与位图向量相比较,如果不在其中,则将其记录丢弃。在我们这个例子中, B 表中以下数据将被丢弃

{0,0,2,2,2,2,2,2,9,9,9,9,9} 。这个过程就是位图向量过滤。

S1,B1 做完连接后,接着对 Si,Bi 进行连接,这里 oracle 将比较两个分区,选取小的那个做 build input ,就是动态角色互换,这个动态角色互换发生在除第一对分区以外的分区上面。

 

三.       Hash Join 算法

1 步:判定小表是否能够全部存放在 hash area 内存中,如果可以,则做内存 hash join 。如果不行,转第二步。

2 步:决定 fan-out 数。

       (Number of Partitions) * C<= Favm *M

        其中 C Cluster size

其值为 DB_BLOCK_SIZE*HASH_MULTIBLOCK_IO_COUNT Favm hash area 内存可以使用的百分比,一般为 0.8 左右; M Hash_area_size 的大小。

 

3 步:读取部分小表 S ,采用内部 hash 函数 ( 这里称为 hash_fun_1) ,将连接键值映射至某个分区,同时采用 <span styl

分享到:
评论

相关推荐

    hash join 原理和算法

    Hash Join是一种数据库查询优化策略,尤其适用于处理大数据集的相等连接操作。它自Oracle 7.3版本开始引入,并且只在Cost-Based Optimizer (CBO)模式下可用。相比Nested Loop Join,Hash Join在处理大规模数据时更为...

    hash join算法原理

    Hash Join 算法是一种高效的数据库连接操作,尤其在处理大数据量的相等连接时表现优越。它在Oracle 7.3版本引入,只适用于相等连接,并且必须在Cost-Based Optimizer (CBO)模式下运行。不同于Nested Loop Join,Hash...

    hash join算法

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

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

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

    Hash join算法原理

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

    Hash Join功能设计文档1

    《哈希连接(Hash Join)功能设计详解》 哈希连接(Hash Join)是一种在数据库系统中用于执行多表连接查询的高效算法,尤其适用于处理大规模数据。在Cedar数据库系统中,为了优化多表连接的性能,0.3版本引入了Hash...

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

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

    Hash Join功能开发文档1

    【哈希连接(Hash Join)技术详解】 哈希连接(Hash Join)是一种在数据库系统中用于执行多表连接查询的优化方法,尤其适用于处理大数据量的场景。在Cedar数据库系统中,为了应对大规模数据连接操作带来的计算资源...

    tud-db:我自己在 Java 中实现 SortMergeJoin 和 HashJoin(来自 SQL 的著名 INNER JOIN)

    本篇文章将重点讨论如何在Java中实现两种常见的JOIN算法:SortMergeJoin和HashJoin。 一、SortMergeJoin SortMergeJoin是一种基于排序的JOIN算法,它的基本思想是首先对参与JOIN的两个关系(即表)按照JOIN条件...

    Oracle中hash join研究.pdf

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

    Mysql 8.0.18 hash join测试(推荐)

    MySQL 8.0.18 引入了 Hash Join,这是一种新的联接算法,它无需依赖索引,但在很多情况下比传统的Block Nested Loop (BNL) 算法更为高效。Hash Join 的工作原理是通过将一个表的数据构建成哈希表,然后使用另一个表...

    Design Trade-offs for a Robust Dynamic Hybrid Hash Join (Extende

    其中,混合哈希连接(Hybrid Hash Join,HHJ)因其高效性与广泛应用而备受瞩目。然而,在现实世界中,由于缺乏输入数据的准确统计信息,优化HHJ算法存在诸多挑战。本文将深入探讨《健壮的动态混合哈希连接(扩展版)...

    MySQL 8.0.18 Hash Join不支持left/right join左右连接问题

    在MySQL 8.0.18中,增加了Hash Join新功能,它适用于未创建索引的字段,做等值关联查询。在之前的版本里,如果连接的字段没有创建索引,查询速度会是非常慢的,优化器会采用BNL(块嵌套)算法。 Hash Join算法是把...

    OracleHashJoin算法原理分享.pdf

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

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

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

    hashjoin.java

    第一次作业

Global site tag (gtag.js) - Google Analytics