GPDB中的HASH JOIN解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: GPDB中的HASH JOIN解析

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


1、Hash join相关结构体关系


HashJoin操作通过HashJoinState结构体管理执行状态及需要的一些结构。下面是HashJoinState结构体说明:1)JoinState js执行计划树节点,该结构主要包括PlanState ps、jointype和single_match。他的左右子节点由PlanState进行管理。如上图中,hash表的构建需要知道大小,这个大小值就是通过右节点也就是内表的执行计划节点预估表行数计算得到。右节点即HashState节点,比如简单inner join情况下:右节点是HashState,HashState的左节点是SeqScan即顺序扫描,表示内表扫描的数据构建hash表。2)HashJoinTable hj_HashTableHash join需要的hash表,和HashState中的hashtable相同。3)ExprState *hashclausesJoin条件的表达式。通过该表达式完成JOIN条件匹配。该表达式由HashJoin中的hashclauses链表初始化生成。4)List *hj_OuterHashKeys外表hash计算表达式链表。通过HashJoin中的hashkeys链表生成。5)List *hj_HashOperatorsHash函数的OID链表,内外表相同6)hj_CurHashValue当前外表的hash值,用于探测阶段进行匹配。7)hj_CurTuple外表匹配的hash桶里的值。8)hj_JoinStateJoin操作状态机。执行过程中,通过该状态机进行处理。


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和batchno4)接着进入HJ_SCAN_BUCKET状态  (1)通过函数ExecScanHashBucket进行匹配探测:先判断外表值的hashvalue值是否对应,然后再判断join条件是否符合。将符合join条件的HashJoinTuple保存到hj_CurTuple中。  (2)调用函数ExecProject对符合join条件的记录进行投影并输出  (3)再次进入函数时,仍旧是HJ_SCAN_BUCKET状态,扫描外表下一条记录,并进行JOIN条件判断,直至外表数据join完。

目录
相关文章
|
7月前
|
关系型数据库 MySQL 索引
【MySQL 解析】Hash索引和B+树索引对比分析
【1月更文挑战第11天】【MySQL 解析】Hash索引和B+树索引对比分析
|
2月前
|
关系型数据库 数据挖掘 数据库
解析数据库联结:应用与实践中的 INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN 与 CROSS JOIN
解析数据库联结:应用与实践中的 INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN 与 CROSS JOIN
72 1
|
7月前
|
并行计算 算法 Java
探索Java并发编程:Fork/Join框架的深度解析
【5月更文挑战第29天】在多核处理器普及的时代,有效利用并发编程以提升程序性能已经成为开发者必须面对的挑战。Java语言提供的Fork/Join框架是一个强大的工具,它旨在利用多线程执行分而治之的任务。本文将通过深入分析Fork/Join框架的工作原理、关键特性以及与传统线程池技术的差异,帮助开发者更好地掌握这一高效处理并发任务的技术手段。
|
4月前
|
索引 容器
容器镜像解析问题之获取 Image 的 ConfigFile 的 hash 值如何解决
容器镜像解析问题之获取 Image 的 ConfigFile 的 hash 值如何解决
22 0
|
5月前
|
消息中间件 JSON NoSQL
Redis深度解析:核心数据类型之hash、list、set
Redis深度解析:核心数据类型之hash、list、set
|
6月前
|
SQL 算法 数据挖掘
深入解析力扣183题:从不订购的客户(LEFT JOIN与子查询方法详解)
深入解析力扣183题:从不订购的客户(LEFT JOIN与子查询方法详解)
|
7月前
|
Java 开发者
探索Java并发编程:Fork/Join框架的深度解析
【5月更文挑战第25天】在多核处理器日益普及的今天,并发编程成为了提升应用性能的关键。Java语言提供了多种并发工具,其中Fork/Join框架是一个高效且强大的工具,用于处理分而治之的任务。本文将深入探讨Fork/Join框架的原理、使用及其在实际应用中的优化策略,旨在帮助开发者更好地利用这一框架以解决复杂的并发问题。
|
6月前
|
算法
[白话解析] 深入浅出一致性Hash原理
[白话解析] 深入浅出一致性Hash原理
|
7月前
|
存储 缓存 NoSQL
Redis 命令全解析之 Hash类型
Redis 命令全解析之 Hash类型
82 1
|
7月前
|
算法 Java API
探索Java并发编程:Fork/Join框架的深度解析
【2月更文挑战第26天】随着多核处理器的普及,并发编程在软件开发中的重要性日益凸显。Java语言提供了多种并发工具,其中Fork/Join框架是处理分而治之问题的一个强大工具。本文将深入探讨Fork/Join框架的设计原理、使用场景及与传统线程池的区别,并通过实例演示如何有效利用该框架提升程序性能。

推荐镜像

更多