GPDB中的HASH JOIN解析

news2024/9/21 16:21:55

GPDB中的HASH JOIN机制

Hash Join是利用hash函数来实现和加速数据库中JOIN操作的一类算法。主要优势是hash函数可以只通过一次运算就将键值映射到固定大小的hash值,仅用作等值join中。由于HASH JOIN的算法复杂度在平均情况下是O(n),所以通常在大规模数据时做HASH JOIN是不错的选择。

下面我们看下GPDB是如何实现HASH JOIN的。

1、Hash join相关结构体关系

5592875c64b2f3cae282cae5a29b146e.png

HashJoin操作通过HashJoinState结构体管理执行状态及需要的一些结构。下面是HashJoinState结构体说明:

1)JoinState js

执行计划树节点,该结构主要包括PlanState ps、jointype和single_match。他的左右子节点由PlanState进行管理。如上图中,hash表的构建需要知道大小,这个大小值就是通过右节点也就是内表的执行计划节点预估表行数计算得到。右节点即HashState节点,比如简单inner join情况下:右节点是HashState,HashState的左节点是SeqScan即顺序扫描,表示内表扫描的数据构建hash表。

2)HashJoinTable hj_HashTable

Hash join需要的hash表,和HashState中的hashtable相同。

3)ExprState *hashclauses

Join条件的表达式。通过该表达式完成JOIN条件匹配。该表达式由HashJoin中的hashclauses链表初始化生成。

4)List *hj_OuterHashKeys

外表hash计算表达式链表。通过HashJoin中的hashkeys链表生成。

5)List *hj_HashOperators

Hash函数的OID链表,内外表相同

6)hj_CurHashValue

当前外表的hash值,用于探测阶段进行匹配。

7)hj_CurTuple

外表匹配的hash桶里的值。8)hj_JoinState

Join操作状态机。执行过程中,通过该状态机进行处理。

2、以inner join为例说明

理解上面的结构体关系后,对hash join处理机制的理解就方便多了。下面我们以inner join为例进行简单说明。

1)HASH join的执行入口函数为ExecHashJoin,调用ExecHashJoinImpl通过状态机进行操作

2)首先进入HJ_BUILD_HASHTABLE阶段,即构建HASH表阶段

  (1)先扫描外表,若外表是空,则无需继续,直接返回NULL

  (2)调用函数ExecHashTableCreate创建hash表,该函数会通过HashJoinState中的左子树的Hash Plan得到其左子树也就是SeqScan内表的Plan节点,利用plan_width和预估的plan_rows计算hash表大小,并创建hash表。

  (3)创建hash表过程中根据hj_HashOperators链表即OID链表,对每个hash key需要的hash函数进行初始化。内外表的hash函数相同,即hashtable->outer_hashfunctions[]和hashtable->inner_hashfunctions[]相同

(4)创建了hash表,接着就需要执行MultiExecProcNode->MultiExecHash-> MultiExecPrivateHash扫描内表,将扫描出的内表行通过ExecHashTableInsert函数计算出hash值并构建HashJoinTuple,将其插入hash表中

3)然后进入HJ_NEED_NEW_OUTER状态

  (1)通过函数ExecHashJoinOuterGetTuple获取外表一行数据outerTupleSlot并计算出hash值hashvalue

  (2)通过函数ExecHashGetBucketAndBatch根据获取的hashvalue得到哈希桶号及batch号:hj_CurBucketNo和batchno

4)接着进入HJ_SCAN_BUCKET状态

  (1)通过函数ExecScanHashBucket进行匹配探测:先判断外表值的hashvalue值是否对应,然后再判断join条件是否符合。将符合join条件的HashJoinTuple保存到hj_CurTuple中。

  (2)调用函数ExecProject对符合join条件的记录进行投影并输出

  (3)再次进入函数时,仍旧是HJ_SCAN_BUCKET状态,扫描外表下一条记录,并进行JOIN条件判断,直至外表数据join完。

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

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

相关文章

【K3s】第15篇 使用containerd容器部署k3s集群

目录 1、文件准备 2、安装master节点 3、安装agent节点 4、查看详情信息 5、遇到问题 1、文件准备 安装docker yum install -y dockersystemctl status docker 增加docker国内镜像源 vi /etc/docker/daemon.json 添加内容为: { "registry-mirrors":…

MySQL:为什么说应该优先选择普通索引,尽量避免使用唯一索引

前言 在使用MySQL的过程中,随着表数据的逐渐增多,为了更快的查询我们需要的数据,我们会在表中建立不同类型的索引。 今天我们来聊一聊,普通索引和唯一索引的使用场景, 以及为什么说推荐大家优先使用普通索引&#xf…

面试题(二十四)数据结构与算法

9.1哈希 请谈一谈,hashCode() 和equals() 方法的重要性体现在什么地方? 考察点:JAVA哈希表 参考回答: Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。…

【OJ】本土化

📚Description: 激动人心的时刻到了!我们开发的记账软件即将在欧美地区发布,但我希望能把本土化工作做得更好。所谓的本土化可不仅仅是把软件界面语言翻译成英语,还要根据当地的习俗来调整软件的使用方法。 比如我国在书写数字…

【yolov5】首次尝试目标检测利用prompt

1、打开prompt 2、切换到pytorch所在环境 conda activate freezing我的环境名是freezing,这里根据自己环境名去激活切换 3、进入到yolov5项目所在路径 激活完环境后立即执行指令当然是无效的,首先要进入到你的项目目录 首先看一下自己的项目在那个位…

MongoDB分片集群部署及实践

文章目录MongoDB分片集群部署及实践一、前言二、了解分片集群1.简介2.分片集群组件3.副本集模式三.安装部署1.分片集群环境2.安装1)CPU 检测2)修改机器名称3)配置 hosts 文件4)配置防火墙5)创建目录6)安装 …

PowerBI的使用和基本效果

1. 什么是PowerBI Power BI 是一套商业分析工具,用于在组织中提供见解。可连接数百个数据源、简化数据准备并提供即席分析。生成美观的报表并进行发布,供组织在 Web 和移动设备上使用。每个人都可创建个性化仪表板,获取针对其业务的全方位独…

加一-力扣66-java高效方案

一、题目描述给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。示例 1:输入:di…

PostgreSQL的下载安装教程(macOS、Windows)

postgresql是GIS服务端几乎不可避免要打交道的数据库。因为mysql的空间扩展真是不尽人意。所以想要学会GIS服务端知识,postgresql(下文简称pg)你是必须要会的。 首先要知道,pg是一个空间数据库,和普通数据库不同的是pg支持空间数据的存储与操作。这里所谓的空间数据一般指…

1、为什么要经常对数据做特征归一化

前言: feature scaling 即为特征归一化、标准化,是数据预处理中的重要技术。在实际运用中,使用梯度下降算法的模型都需要归一化,包括线性回归、逻辑回归、支持向量机、神经网络等模型。但对决策树模型并不适用,因为信…

【LeetCode】每日一题(3)

目录 题目:1234. 替换子串得到平衡字符串 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 写在最后: 题目:1234. 替换子串得到平衡…

handler解析(3)-同步消息、异步消息、同步屏障

Message分为3种:普通消息(同步消息)、屏障消息(同步屏障)和异步消息。我们通常使用的都是普通消息,而屏障消息就是在消息队列中插入一个屏障,在屏障之后的所有普通消息都会被挡着,不…

使用继承与派生的6大要点

概述 面向对象编程技术非常看重软件的可重用性,在C中,可重用性是通过继承机制来实现的。继承机制允许程序员在保持原有类的数据和功能的基础上进行扩展,增加新的数据和功能,从而构成一个新的类,也称为派生类。原有类&a…

分销系统逻辑

相关概念 主营商户: 提供分销商品和佣金的商户分销商: 拥有自己的销售渠道,能够帮助推动产品销售的个人或商户消费者: 购买分销商品的人。佣金: 主营商户返还给经销商的比例抽成 分销功能设计 (1)分销商准入规则设计 无规则: 没有分销商的准入门槛限制&#xf…

七大设计原则之依赖倒置原则应用

目录1 依赖倒置原则2 依赖倒置应用1 依赖倒置原则 依赖倒置原则(Dependence Inversion Principle,DIP)是指设计代码结构时,高层模块不应该依赖底层模块,二者都应该依赖其抽象。抽象不应该依赖细节;细节应该依赖抽象。…

VHDL语言基础-Testbech

目录 VHDL仿真概述: 基本结构: VHDL一般仿真过程: 仿真测试平台文件: 编写测试平台文件的语言: 一个测试平台文件的基本结构如下: 测试平台文件包含的基本语句: 产生激励信号的方式: 时钟信号: 复位信号: 周期信性信号: 使用延迟DELAYD: 一般的激励信号…

算法leetcode|36. 有效的数独(rust重拳出击)

文章目录36. 有效的数独:样例 1:样例 2:提示:分析:题解:rustgoccpythonjava36. 有效的数独: 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效…

【C++】类和对象---需掌握的功能

目录1.初始化列表1.1构造函数赋值1.2初始化列表格式:编译器执行的顺序:特性:1.3explicit关键字类型替换过程多参数构造函数类型替换(C11)2.static成员编程题3.匿名对象4.友元4.1友元函数4.2友元类5.内部类6.拷贝对象时…

linux高级命令之获取管理员权限的相关命令

获取管理员权限的相关命令学习目标能够知道切换到管理员用户的命令1. sudo命令的使用命令说明sudo -s切换到root用户,获取管理员权限sudo某个命令的执行需要获取管理员权限可以在执行命令前面加上sudosudo -s效果图:sudo 命令效果图:说明:如果只是某次操作需要使用管…

面向对象与面向过程编程

从语言角度来讲: C是面向过程编程; C一半是面向过程编程,一半是面向对象编程; Java是面向对象编程。 一、什么是面向对象编程与面向过程编程? 面向过程(Procedure Oriented 简称 PO)&#xff1…