hash join的基本原理是怎样的?

news2025/1/10 3:26:08

我们知道数据库里面两表关联主要有三种常见的关联方式,即

  • nested loop join
  • hash join
  • merge join

nested loop join在OLTP交易场景占比是最多的,常用于关联字段为主键或索引字段的情况,通过主键或索引以及loop的方式,A表可以快速查找到匹配的B表中的数据。

merge join又称为sort merge,可想而知,如果被关联的两个数据集正好是有序的,那么采用这种方式是最高效的。

hash join则是把一个表(通常为小表)放在hash内存中,进行匹配关联。

虽然知道这点简单的理解,不过当别人问起来hash join具体怎么实现的时候,发现并不能说出个一二,看来还是应该我去熟悉一下底层的原理。参考网上关于hash join原理的一二之后,也用本篇文章稍作记录,作为一个学习的过程吧~

背景概念

所谓连接(join)是通过把多个表之间某列相等的元组提取出来组成新的表。两个表如果元数目过多,逐个遍历开销就很大(这里说的其实就是nested join),哈希连接(hash join)就是一种提高连接效率的方法。

自Oracle 7.3以来就实现了hash join的技术,MySQL则是在最新的8.0版本中实现了hash join。Hash join只能用于相等连接,相对于nested loop join,hash join更适合处理大型结果集。Hash join不需要在驱动表上存在索引。

基本概述

Hash join算法的基本思想是根据小表(记为S表)建立一个可以存在于hash area内存中的hash table,然后用大小(记为B表)来探测前面的hash table

如果hash area内存不够大,hash table就无法完全存放在hash area内存中。针对这种情况,Oracle在连接键上利用一个hash函数将S表和B表分割成多个不相连的分区(分别记为Si和Bi),这个阶段叫做分区阶段;然后各自相应的分区(即Si和Bi)再做Hash join,这个阶段叫做join阶段

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

Hash join算法有一个限制,它假设两表在连接键上是均匀的,不过实际情况是数据可能不均匀,为了应对这个问题,Oracle引进几种技术,包括位图向量过滤、角色互换、柱状图等。

主要过程

从上面描述可以发现,Hash join主要分为两个阶段:建立阶段(build phase)和探测阶段(probe phase)

Build Phase

选择一个表,通常是较小的那个表,以减少建立哈希表的时间和空间。然后对其中每个元组上的连接属性采用哈希函数得到哈希值,从而建立一个哈希表。

Probe Phase

对另一个表,扫描它的每一行并计算连接属性的哈希值,与Build Phase建立的哈希表对比,如果落在同一个bucket的,如果满足连接谓词则连接成新的表。

在内存足够大的情况下建立哈希表的过程时整个表都在内存中,完成连接操作后才放在磁盘里面。但这个过程会带来很多的IO操作。

另一种哈希连接Grace hash join,适用于内存不足的情况,也就是前面提到的先分区再join的过程。

基本原理

参考https://www.cnblogs.com/qlee/archive/2011/04/11/2012572.html
使用一个例子来解释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第一步是判定小表(S表)是否能完全存放在hash area内存中,如果能完全存放在内存中,则在内存中建立hash table,这是最简单的Hash join。

如果不能全部放在内存中,则将S表进行分区,分区的个数叫做fan-out。

Oracle采用内部一个hash函数作用于连接键上,将S和B分割成多个分区,假设产生10个分区,如下表。
在这里插入图片描述
经过以上分区之后,只需要相应的分区之间做join即可,如果有分区为NULL的话,则相应的分区Join即可忽略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1100332.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BricsCAD 23 for Mac:轻松驾驭CAD建模的强大工具

如果你正在寻找一款功能强大、操作简便的CAD建模软件,那么BricsCAD 23 for Mac绝对值得你考虑。这款软件将为你提供一套完整的2D和3D设计解决方案,让你在Mac上轻松创建、编辑和修改图形。 一、BricsCAD 23的功能特点 高效的2D和3D建模:Bric…

2652. 倍数求和

2652. 倍数求和 题目方法-【枚举】 & 题目特征-【求计算在给定范围内满足某种条件的整数之和】方法-【容斥原理】 & 题目特征-【计算满足多个条件的元素之和,并且需要避免重复计数】 题目 题目链接:https://leetcode.cn/problems/sum-multiples…

倾斜摄影三维模型的根节点合并的重要性分析

倾斜摄影三维模型的根节点合并的重要性分析 倾斜摄影三维模型的根节点合并是整个模型构建过程中的一个重要环节,具有重要的意义和作用。本文将对倾斜摄影三维模型的根节点合并的重要性进行详细分析。 一、定义和概述 在倾斜摄影三维模型的构建过程中,根…

概率神经网络分类问题程序

欢迎关注“电击小子程高兴的MATLAB小屋” %% 概率神经网络 %% 解决分类问题 clear all; close all; P[1:8]; Tc[2 3 1 2 3 2 1 1]; Tind2vec(Tc) %数据类型的转换 netnewpnn(P,T); Ysim(net,P); Ycvec2ind(Y) %转换回来

一文带你认识高速低侧栅极驱动器 FAN3111ESX 带你深入了解其特点及应用

FAN3111ESX一款低端驱动器产品,是外部 DC 2 至 5 V 参考输入、单通道同相输出、1.4 A 峰值灌电流、1.4 A 源电流低端栅极驱动器。 FAN3111ESX 1A栅极驱动器为驱动一个在低侧开关应用中的 N沟道增强型 MOSFET 而设计。 对于使用低压控制器和其它和驱动器相比使用更…

二维码智慧门牌管理系统:地址管理的现代革命

文章目录 前言一、标准地址的革新二、广泛的应用前景 前言 在科技不断发展和社会进步的背景下,高效、精准、智能的管理系统已经成为当今社会的迫切需求。传统的门牌管理系统在应对这一需求方面已显得力不从心,因此,二维码智慧门牌管理系统的…

力扣每日一题43:字符串相乘

题目描述: 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。 注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 "2"…

强化学习基础(1)- 理论和算法

目录 1.基本概念 1.1组成部分 1.2 马尔可夫决策过程 2 有模型强化学习 2.1状态值函数 2.2动作值函数 2.3二者关系 2.4 探索和利用 2.5动态规划(DP)(有模型求解方法) 2.5.1预测任务 2.5.1控制任务 3.无模型强化学习 3.1 Valu…

AI全栈大模型工程师(四)OpenAI API初探

五、它是怎么生成结果的? 其实,它只是根据上文,猜下一个词(的概率)…… OpenAI 的接口名就叫「completion」,也证明了其只会「生成」的本质。 下面用程序演示「生成下一个字」。你可以自己修改 prompt 试试。还可以使用相同的 prompt 运行多次。 import openai import…

哪个牌子的电容笔好用?ipad触控笔推荐平价

有哪些电容笔适合学生党入手?苹果Pencil虽然与普通的电容笔,不同的是,这款电容笔同时具有重力传感器和倾斜传感器,而平替电容笔,只有一种倾斜传感器,但在书写方面的体验很不错,可以用来写字&…

JAMA | 多中心临床试验也用RCS方法分析,卒中患者强化血压管理更有利用康复

郑老师统计课程,欢迎点击报名:临床设计与数据分析 课程 2023年9月,外国学者在《JAMA》(一区,IF120.7)发表题为:" Intensive vs Conventional Blood Pressure Lowering After Endovascular …

MySQL初级之战

华子目录 什么是数据库?数据库管理系统(DBMS)数据库系统与文件系统的区别数据库的发展史常见数据库关系性数据库关系型数据库的4大特性关系型数据库的优缺点非关系型数据库非关系数据库的优点和缺点 DBMS支持的数据模型MySQL体系架构连接层SQ…

学生用什么样的台灯比较好?分享最合适学生使用的台灯

随着现在生活水平的提高,越来越多人重视健康的问题。尤其是对于孩子,很多家长对其可谓是百般担心、千般呵护,害怕出现什么问题,其中最主要的就是近视。而如今,我国青少年儿童的近视率可不低的,达到了52.7%&…

qt中的对象树与生命期

1.为什么要使用对象树: GUI 程序通常是存在父子关系的,比如一个对话框之中含有按钮、列表等部件,按钮、列表、对话框等部件其实就是一个类的对象(注意是类的对象,而非类),很明显这些对象之间是存在父子关系的&#xff…

四、多线程服务器

1.进程的缺陷和线程的优点 1.进程的缺陷 创建进程(复制)的工作本身会给操作系统带来相当沉重的负担。 而且,每个进程具有独立的内存空间,所以进程间通信的实现难度也会随之提高。 同时,上下文切换(Cont…

cmd:读取电脑硬件序列号

一、读取电脑硬件序列号 1.cmd 在没有使用第三方库的情况下,要读取电脑的硬件序列号通常需要使用操作系统提供的工具或命令行。以下是一个示例,展示如何使用Windows操作系统的命令行工具 wmic 来获取硬件序列号: 打开命令提示符&#xff0…

尚硅谷Flink(三)时间、窗口

1 🎰🎲🕹️ 🎰时间、窗口 🎲窗口 🕹️是啥 Flink 是一种流式计算引擎,主要是来处理无界数据流的,数据源源不断、无穷无尽。想要更加方便高效地处理无界流,一种方式就…

【Linux学习笔记】代码编辑工具vim

1. vim工具基本模式的转换2. vim命令模式下的各种编辑命令2.1. 光标行定位2.2. 光标自由定位2.3. 复制粘贴2.4. 删除2.5. 文本的大小写替换2.6. 文本的替换2.7. 文本的前删后删2.8. 撤销操作 3. vim底行模式下的命令3.1. 设置行号与取消设置行号3.2. 分屏操作3.3. 在不退出vim的…

Postman简单使用

文章目录 一.接口测试流程二、Postman接口测试工具三、接口关联四、全局变量和环境变量 一.接口测试流程 拿到API接口文档(从开发拿或者抓包获取),熟悉接口业务,接口地址,错误码等等 编写接口的测试用例以及评审 编写…

SSL证书续费要如何操作

SSL证书一旦到期,网站会立即无法访问,而且会提出不安全警告,如果是电商或者品牌网站影响还是很大的。 SSL证书和域名续费有很大区别,域名续费只要交钱就可以了,SSL证书续费还需要认证和更新服务器SSL证书文件才算收工…