Postgresql的HashJoin状态机流程图整理

状态机

可以放大观看。
在这里插入图片描述

HashJoinState

Hash Join运行期状态结构体

typedef struct HashJoinState
{JoinState   js;             /* 基类;its first field is NodeTag */ExprState  *hashclauses;//hash连接条件List       *hj_OuterHashKeys;   /* 外表条件链表;list of ExprState nodes */List       *hj_InnerHashKeys;   /* 内表连接条件;list of ExprState nodes */List       *hj_HashOperators;   /* 操作符OIDs链表;list of operator OIDs */HashJoinTable hj_HashTable;//Hash表uint32      hj_CurHashValue;//当前的Hash值int         hj_CurBucketNo;//当前的bucket编号int         hj_CurSkewBucketNo;//行倾斜bucket编号HashJoinTuple hj_CurTuple;//当前元组TupleTableSlot *hj_OuterTupleSlot;//outer relation slotTupleTableSlot *hj_HashTupleSlot;//Hash tuple slotTupleTableSlot *hj_NullOuterTupleSlot;//用于外连接的outer虚拟slotTupleTableSlot *hj_NullInnerTupleSlot;//用于外连接的inner虚拟slotTupleTableSlot *hj_FirstOuterTupleSlot;//int         hj_JoinState;//JoinState状态bool        hj_MatchedOuter;//是否匹配bool        hj_OuterNotEmpty;//outer relation是否为空
} HashJoinState;

HashJoinTable

typedef struct HashJoinTableData
{int         nbuckets;       /* 内存中的hash桶数;# buckets in the in-memory hash table */int         log2_nbuckets;  /* 2的对数(nbuckets必须是2的幂);its log2 (nbuckets must be a power of 2) */int         nbuckets_original;  /* 首次hash时的桶数;# buckets when starting the first hash */int         nbuckets_optimal;   /* 优化后的桶数(每个批次);optimal # buckets (per batch) */int         log2_nbuckets_optimal;  /* 2的对数;log2(nbuckets_optimal) *//* buckets[i] is head of list of tuples in i'th in-memory bucket *///bucket [i]是内存中第i个桶中的元组链表的head itemunion{/* unshared array is per-batch storage, as are all the tuples *///未共享数组是按批处理存储的,所有元组均如此struct HashJoinTupleData **unshared;/* shared array is per-query DSA area, as are all the tuples *///共享数组是每个查询的DSA区域,所有元组均如此dsa_pointer_atomic *shared;}buckets;bool        keepNulls;      /*如不匹配则存储NULL元组,该值为T;true to store unmatchable NULL tuples *///关于skew优化的变量bool        skewEnabled;    /*是否使用倾斜优化?;are we using skew optimization? */HashSkewBucket **skewBucket;    /* 倾斜的hash表桶数;hashtable of skew buckets */int         skewBucketLen;  /* skewBucket数组大小;size of skewBucket array (a power of 2!) */int         nSkewBuckets;   /* 活动的倾斜桶数;number of active skew buckets */int        *skewBucketNums; /* 活动倾斜桶数组索引;array indexes of active skew buckets */int         nbatch;         /* 批次数;number of batches */int         curbatch;       /* 当前批次,第一轮为0;current batch #; 0 during 1st pass */int         nbatch_original;    /* 在开始inner扫描时的批次;nbatch when we started inner scan */int         nbatch_outstart;    /* 在开始outer扫描时的批次;nbatch when we started outer scan */bool        growEnabled;    /* 关闭nbatch增加的标记;flag to shut off nbatch increases */double      totalTuples;    /* 从inner plan获得的元组数;# tuples obtained from inner plan */double      partialTuples;  /* 通过hashjoin获得的inner元组数;# tuples obtained from inner plan by me */double      skewTuples;     /* 倾斜元组数;# tuples inserted into skew tuples *//** 这些数组在散列连接的生命周期内分配,但仅当nbatch > 1时分配。* 只有当第一次将元组写入文件时,文件才会打开(否则它的指针将保持NULL)。* 注意,第0个数组元素永远不会被使用,因为批次0的元组永远不会转储.*/BufFile   **innerBatchFile; /* 每个批次的inner虚拟临时文件缓存;buffered virtual temp file per batch */BufFile   **outerBatchFile; /* 每个批次的outer虚拟临时文件缓存;buffered virtual temp file per batch *//** 有关正在散列的数据类型的特定于数据类型的散列函数的信息。* 这些数组的长度与散列连接子句(散列键)的数量相同。*/FmgrInfo   *outer_hashfunctions;    /* outer hash函数FmgrInfo结构体;lookup data for hash functions */FmgrInfo   *inner_hashfunctions;    /* inner hash函数FmgrInfo结构体;lookup data for hash functions */bool       *hashStrict;     /* 每个hash操作符是严格?is each hash join operator strict? */Size        spaceUsed;      /* 元组使用的当前内存空间大小;memory space currently used by tuples */Size        spaceAllowed;   /* 空间使用上限;upper limit for space used */Size        spacePeak;      /* 峰值的空间使用;peak space used */Size        spaceUsedSkew;  /* 倾斜哈希表的当前空间使用情况;skew hash table's current space usage */Size        spaceAllowedSkew;   /* 倾斜哈希表的使用上限;upper limit for skew hashtable */MemoryContext hashCxt;      /* 整个散列连接存储的上下文;context for whole-hash-join storage */MemoryContext batchCxt;     /* 该批次存储的上下文;context for this-batch-only storage *//* used for dense allocation of tuples (into linked chunks) *///用于密集分配元组(到链接块中)HashMemoryChunk chunks;     /* 整个批次使用一个链表;one list for the whole batch *//* Shared and private state for Parallel Hash. *///并行hash使用的共享和私有状态HashMemoryChunk current_chunk;  /* 后台进程的当前chunk;this backend's current chunk */dsa_area   *area;           /* 用于分配内存的DSA区域;DSA area to allocate memory from */ParallelHashJoinState *parallel_state;//并行执行状态ParallelHashJoinBatchAccessor *batches;//并行访问器dsa_pointer current_chunk_shared;//当前chunk的开始指针
} HashJoinTableData;

其他

在inner join第一次扫描中,可以从执行器得到tuple。
如果batch数目 > 1,那么不属于第一批的tuple将被保存在batch的inner的临时文件中。
在outer join中同理,不过我们将tuple写入batch的outer临时文件中
完成第一次扫描后,堆每批剩余的tuple做如下操作:
1、从inner 批处理文件中读取元组,加载到hash table中的bucket
2、从outer 批处理文件中读取元组,匹配hash bucket,然后输出结果。

参考

postgresql-13源码

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

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

相关文章

Ajax和Jsonp实践

之前一直使用jQuery的ajax方法,导致自己对浏览器原生的XMLHttpRequest对象不是很熟悉,于是决定自己写下,以下是个人写的deom,发表一下,聊表纪念。 Ajax 和 jsonp 的javascript 实现: /*! * ajax.js * …

得到前i-1个数中比A[i]小的最大值,使用set,然后二分查找

题目 有一个长度为 n 的序列 A&#xff0c;A[i] 表示序列中第 i 个数(1<i<n)。她定义序列中第 i 个数的 prev[i] 值 为前 i-1 个数中比 A[i] 小的最大的值&#xff0c;即满足 1<j<i 且 A[j]<A[i] 中最大的 A[j]&#xff0c;若不存在这样的数&#xff0c;则 pre…

学习语言贵在坚持

学习语言贵在坚持 转自&#xff1a;http://zhidao.baidu.com/link?urlr2W_TfnRwipvCDLrhZkATQxdrfghXFpZhkLxqH1oUapLOr8jXW4tScbyOKRLEPVGCx0dUfIr-30n9XV75pWYfK给大家介绍几本书和别处COPY来的学习C50个观点 《Thinking In C》&#xff1a;《C编程思想》&#xff1b; 《The…

stl vector 函数_在C ++ STL中使用vector :: begin()和vector :: end()函数打印矢量的所有元素...

stl vector 函数打印向量的所有元素 (Printing all elements of a vector) To print all elements of a vector, we can use two functions 1) vector::begin() and vector::end() functions. 要打印矢量的所有元素&#xff0c;我们可以使用两个函数&#xff1a;1) vector :: b…

JqueryUI入门

Jquery UI 是一套开源免费的、基于Jquery的插件&#xff0c;在这里记录下Jquery UI 的初步使用。 第一、下载安装 下载Jquery,官网&#xff1a;http://jquery.com;  下载Jquery UI&#xff0c;官网&#xff1a;http://jqueryui.com/ Jquery的部署就不说了&#xff0c;说下Jqu…

gp的分布、分区策略(概述)

对于大规模并行处理数据库来说&#xff0c;一般由单master与多segment组成。 那么数据表的单行会被分配到一个或多个segment上&#xff0c;此时需要想一想分布策略 分布 在gp6中&#xff0c;共有三个策略&#xff1a; 哈希分布 随机分布 复制分布 哈希分布 就是对分布键进行…

[ Java4Android ] Java基本概念

视频来自&#xff1a;http://www.marschen.com/ 1.什么是环境变量 2.JDK里面有些什么&#xff1f; 3.什么是JRE&#xff1f; 什么是环境变量&#xff1f; 1.环境变量通常是指在操作系统当中&#xff0c;用来指定操作系统运行时需要的一些参数; 2.环境变量通常为一系列的键值对&…

_thread_in_vm_Java Thread类的静态void sleep(long time_in_ms,int time_in_ns)方法,带示例

_thread_in_vm线程类静态无效睡眠(long time_in_ms&#xff0c;int time_in_ns) (Thread Class static void sleep(long time_in_ms, int time_in_ns)) This method is available in package java.lang.Thread.sleep(long time_in_ms, int time_in_ns). 软件包java.lang.Thread…

大规模web服务开发技术(转)

前段时间趁空把《大规模web服务开发技术》这本书看完了&#xff0c;今天用一下午时间重新翻了一遍&#xff0c;把其中的要点记了下来&#xff0c;权当复习和备忘。由于自己对数据压缩、全文检索等还算比较熟&#xff0c;所以笔记内容主要涉及前5章内容&#xff0c;后面的零星记…

IO多路复用的三种机制Select,Poll,Epoll

IO多路复用的本质是通过系统内核缓冲IO数据让单个进程可以监视多个文件描述符&#xff0c;一旦某个进程描述符就绪(读/写就绪)&#xff0c;就能够通知程序进行相应的读写操作。 select poll epoll都是Linux提供的IO复用方式&#xff0c;它们本质上都是同步IO&#xff0c;因为它…

qt中按钮贴图

一.QT之QPushButton按钮贴图 二.QT之QToolButton按钮贴图 一.QT之QPushButton按钮贴图具体操作流程 1. Qt Designer中拖入一Tool Button 2. 选择图标的图片放入工程目录下&#xff0c;如放在Resources内 3. 双击工程的Resource Files下的qrc文件&#xff0c;如图 4. 在弹出的窗…

Ubuntu手动编译gVim7.3修复终端启动时与ibus的冲突

个bug伴随着Ubuntu/ibus的升级苦憋已久&#xff0c;症状为终端启动gvim时卡死&#xff0c;gvim -f可以缓解此问题&#xff0c;但偶尔还是要发作&#xff0c;况且每次末尾托个&也不方便。其实新版gvim已经修复此bug&#xff0c;不过ubuntu安装包一直没更新&#xff0c;那我们…

Android Activity类讲解(一)

--by CY[kotomifigmail.com] &#xff11;&#xff0e;protected void onCreate(Bundle savedInstanceState) { throw new RuntimeException("Stub!");   } 当创建一个Activity时&#xff0c;系统会自动调用onCreate方法来完成创建工作&#xff0e;该创建工作包括布…

Mysql的undo、redo、bin log分析

目录关于undo log关于redolog关于binlog一个事务的提交流程undo log :记录数据被修改之前的样子 redo log&#xff1a;记录数据被修改之后的样子 bin log&#xff1a;记录整个操作。 关于undo log 关于undo log&#xff1a; 在执行一条涉及数据变更的sql时&#xff0c;在数据…

typedef 字符串_typedef在C中使用字符数组(定义别名来声明字符串)的示例

typedef 字符串Here, we have to define an alias for a character array with a given number of maximum characters length to read strings? 在这里&#xff0c;我们必须为具有给定最大字符长度数的字符数组定义别名&#xff0c;以读取字符串 &#xff1f; In the below-…

最小堆实现代码

参考算法导论、数据结构相关书籍&#xff0c;写得最小堆实现的源代码如下&#xff1a; 1 //2 //--最小堆实例3 //4 5 #include <iostream>6 #include <vector>7 #include <string>8 using namespace std;9 10 template<typename Comparable>11 class m…

非常好的在网页中显示pdf的方法

今天有一需求&#xff0c;要在网页中显示pdf&#xff0c;于是立马开始搜索解决方案&#xff0c;无意中发现一个非常好的解决方法&#xff0c;详见http://blogs.adobe.com/pdfdevjunkie/web_designers_guide。 其实就光看这个网站也足够了&#xff0c;http://www.pdfobject.com/…

Redis字典实现、Hash键冲突以及渐进式rehash

本笔记参考《Redis设计与实现》 P24~ 37 目录Redis字典实现哈希表节点结构哈希表结构字典哈希算法解决hash冲突rehash渐进式hashRedis字典实现 哈希表节点结构 typedef struct dictEntry {// 键void *key;// 值 : 可以是一个指针&#xff0c;或者是一个uint64/int64 的整数un…

Java线程类void setContextClassLoader(ClassLoader loader)方法,带示例

线程类void setContextClassLoader(ClassLoader loader) (Thread Class void setContextClassLoader(ClassLoader loader)) This method is available in package java.lang.Thread.setContextClassLoader(ClassLoader loader). 软件包java.lang.Thread.setContextClassLoader(…

JPA概要

本文最新版已更新至&#xff1a;http://thinkinside.tk/2012/12/30/JPA.html JPA定义了Java ORM及实体操作API的标准。本文摘录了JPA的一些关键信息以备查阅。 如果有hibernate的基础&#xff0c;通过本文也可以快速掌握JPA的基本概念及使用。 Table of Contents 1 JPA概述2 实…