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

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

  • 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.mzph.cn/news/107908.shtml

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

相关文章

【特纳斯电子】基于单片机的火灾监测报警系统-仿真设计

视频及资料链接:基于单片机的火灾监测报警系统-仿真设计 - 电子校园网 (mcude.com) 编号: T0152203M-FZ 设计简介: 本设计是基于单片机的火灾监测报警系统,主要实现以下功能: 1.通过OLED显示温度、烟雾、是否有火…

摩尔信使MThings的设备高级参数

摩尔信使MThings支持三级参数管理方案,依次为:数据级、设备级、通道级。 设备级参数不仅包含设备名称、设备地址等常用信息,同时提供了诸多高级参数,其同样是为了满足不同用户应用场景中所面临的差异化需求,以更加灵活…

JAVAEE初阶相关内容第十四弹--网络初识

写在前: 这一部分开启网络部分的相关知识,这一弹内容初始网络将主要进行网络相关知识的简单介绍,以及着重介绍协议、协议分层、OSI七层模型、TCP/IP五层模型、封装和分用。 需要认识协议,并知道协议的效果是什么;知道…

word如何设置页码?教你快速提升文档颜值!

在创建文档时,为了更好地组织内容,页码是一个必不可少的元素。但是很多人不知道word如何设置页码,其实word提供了多种设置页码的方法,以满足不同文档的需求。本文将详细介绍3种设置页码的方法,无论您是初学者还是有经验…

LMI FocalSpec 3D线共焦传感器 使用笔记1

一.硬件介绍 以上特别注意: 屏蔽线必须接地,因为在现场实际调试中,使用软件调试发现经常 弹窗 传感器丢失警告!! 以上 Position LED 的灯被钣金挡住,无法查看异常现象,能否将指示灯设置在软件界面上? 需要确认是软触发还是硬触发,理论上 硬触发比软触发速度要快.(我们目前使用…

LinkedList集合

LinkedList集合 底层数据结构是双链表,查询慢,增删快,但如果操做的是首元素,速度也是极快的 本身多了很多直接操做首尾元素的特有API 这些特有方法不常用,了解即可 LinkedList源码分析 迭代器的源码分析 iterator():生成一个迭代器对象,默认指向集合的0索引处hasNext():判…

sqlserver系统存储过程添加用户学习

sqlserver有一个系统存储过程sp_adduser;从名字看是添加用户的;操作一下, 从错误提示看还需要先添加一个登录名,再执行一个系统过程sp_addlogin看一下, 执行完之后看一下,安全性-登录名下面有了rabbit&…

【JavaEE】初识网络

网络初识 文章目录 网络初识网络发展史独立模式网络互连局域网LAN广域网 网络通信基础IP地址端口号格式 协议五元组协议分层OSI七层模型TCP/IP五(四)层协议1.物理层2.数据链路层3.网络层4.传输层5.应用程序 网络设备所在的分层封装和分用例子发送方接收方…

ERP系统供应商协同:优化企业供应链管理

一、ERP系统供应商协同的概念和功能 供应商协同是指在供应链中,企业与供应商之间通过ERP系统进行紧密合作和信息共享,实现供应链各个环节的协调和优化。ERP系统供应商协同功能涉及以下方面: 1. 供应商管理:ERP系统提供完善的供应…

el-table添加fixed属性后底部滚动条添加小手

0 效果 1 样式 /deep/ .el-table--scrollable-x {cursor: pointer; } /deep/ .el-table__empty-block {cursor: auto; } /deep/ .el-table__row {cursor: auto; }

深入剖析 深度学习中 __init()__函数和forward()函数

目录 前言1. __init()__函数2. forward()函数3. 两者关系 前言 再看代码时,发现init函数和forward函数都有参数,具体是怎么传参的呢? 为了更方便的讲解,会举简单的代码例子结合讲解。 forward() 和 __init__() 是神经网络模型类…

13-k8s-ingress网络

文章目录 一、ingress介绍二、创建nginx和tomcat供测试三、创建ingress-http四、yaml方式安装ingress五、helm方式安装ingress(推荐)六、Ingress的HTTPS代理 一、ingress介绍 Service对集群之外暴露服务的主要方式有两种:NotePort和LoadBalan…

VulnHub Alice

一、信息收集 发现开发了22、80 2.访问ip,右击查看源代码 发现需要利用X-Forwarded-For 火狐插件:X-Forwarded-For Header 挂上代理后: 出现以下页面: 先注册一个账户,然后再登录 发现有参数进行传参 发现传参&a…

从Flink的Kafka消费者看算子联合列表状态的使用

背景 算子的联合列表状态是平时使用的比较少的一种状态,本文通过kafka的消费者实现来看一下怎么使用算子列表联合状态 算子联合列表状态 首先我们看一下算子联合列表状态的在进行故障恢复或者从某个保存点进行扩缩容启动应用时状态的恢复情况 算子联合列表状态主…

用建筑中智能消防应急照明系统的应用

【摘要】:火灾应急照明是火灾安全疏散、保障消防人员生命安全的关键。对电气设计人员来说,火灾紧急照明系统的设计非常必要,消防紧急照明系统启动与其正常工作状态有直接的关系,但由于其存在的问题通常不能被及时发现,…

C#,数值计算——分类与推理Gaumixmod的计算方法与源程序

1 文本格式 using System; using System.Collections.Generic; namespace Legalsoft.Truffer { public class Gaumixmod { private int nn { get; set; } private int kk { get; set; } private int mm { get; set; } private double…

CEC2013(MATLAB):墨西哥蝾螈优化算法(Mexican Axolotl Optimization,MAO)求解CEC2013

一、墨西哥蝾螈优化算法MAO 墨西哥蝾螈优化算法(Mexican Axolotl Optimization,MAO)由Yenny Villuendas-Rey 1等人于2021年提出,该算法具有较强的平衡全局搜索与局部搜索能力。 参考文献: [1]Villuendas-Rey, Yenny,…

opencv定位图片中的图案?

使用opencv模板匹配方式。 这种方式针对从原始图片中直接扣小图情况比较好。 import cv2 as cv2def find_positions(image_path, small_image_path):# 读取大图和小图large_image cv2.imread(image_path)small_image cv2.imread(small_image_path)# 小图规格small_image_h, …

07-ConfigurationClassPostProces的解析

文章目录 如何解析Component,Service,Configurationd,Bean,Import等注解1. 源码描述2. 类继承结构图3. 解析流程4. 具体的注解解析 如何解析Component,Service,Configurationd,Bean,Import等注解 1. 源码描述 BeanFactoryPostProcessor used for bootstrapping processing of…

Android Fragment 基本概念和基本使用

Android Fragment 基本概念和基本使用 一、基本概念 Fragment,简称碎片,是Android 3.0(API 11)提出的,为了兼容低版本,support-v4库中也开发了一套Fragment API,最低兼容Android 1.6。 过去s…