首页 > 数据库 >Greenplum数据库数据分片策略Hash分布——执行器行为

Greenplum数据库数据分片策略Hash分布——执行器行为

时间:2022-10-09 16:39:51浏览次数:41  
标签:执行器 Hash tuple -- Greenplum seg hash econtext


Greenplum数据库Hash分布执行器部分主要涉及Motion、Result和SplictUpdate节点。以使用CdbHash *makeCdbHash(int numsegs, int natts, Oid *hashfuncs)创建一个 CdbHash 结构体、cdbhashinit()执行初始化操作,仅仅是初始化hash初始值、cdbhash()函数会调用hashDatum()针对不同类型做不同的预处理,最后将处理后的列值添加到哈希计算中、cdbhashreduce() 映射哈希值到某个 segment为脉络学习以下执行器对Hash分布的处理。

Motion

只有当Motion类型为MOTIONTYPE_HASH且执行发送任务(MOTIONSTATE_SEND)的后端才可能涉及Hash分布处理(​​motionstate->mstype == MOTIONSTATE_SEND && node->motionType == MOTIONTYPE_HASH​​)。也就是说后端进程需要将处理的数据直接发送给其他后端进程,且这个接收后端可以通过分布键数据进行计算哈希值、映射segment后定位到。其执行堆栈为ExecInitNode --> ExecInitMotion --> makeCdbHash。

Greenplum数据库数据分片策略Hash分布——执行器行为_散列表


涉及hash的motion执行流程堆栈如下ExecMotion --> execMotionSender --> doSendTuple --> eval(nodeMotion.c) --> cdbhashinit和cdbhash。调用doSendTuple发送tuple的情况下,当motion类型为MOTIONTYPE_HASH,就需要计算出该segment的index,然后设置到targetRoute变量中。计算的函数就是eval(232, 232, 232); background: rgb(249, 249, 249);">

uint32 eval(ExprContext *econtext, List *hashkeys, CdbHash * h) {
ListCell *hk; unsigned int target_seg;
ResetExprContext(econtext);
MemoryContext oldContext = MemoryContextSwitchTo(econtext->ecxt_per_tuple_memory); // 切换到ecxt_per_tuple_memory

if (list_length(hashkeys) > 0){ /* If we have 1 or more distribution keys for this relation, hash them. However, If this happens to be a relation with an empty policy (partitioning policy with a NULL distribution key list) then we have no hash key value to feed in, so use cdbhashrandomseg() to pick a segment at random. */
int i = 0;
cdbhashinit(h);
foreach(hk, hashkeys){
ExprState *keyexpr = (ExprState *) lfirst(hk);
Datum keyval; bool isNull;
keyval = ExecEvalExpr(keyexpr, econtext, &isNull); /* Get the attribute value of the tuple */
cdbhash(h, i + 1, keyval, isNull); /* Compute the hash function */
i++;
}
target_seg = cdbhashreduce(h);
}else {
target_seg = cdbhashrandomseg(h->numsegs);
}
MemoryContextSwitchTo(oldContext);
return target_seg;
}

标签:执行器,Hash,tuple,--,Greenplum,seg,hash,econtext
From: https://blog.51cto.com/feishujun/5740687

相关文章

  • 面试官:Hash 碰撞是什么?如何解决?被问懵了……
    Hash如何存数据hash表的本质其实就是数组,hash表中通常存放的是键值对Entry。如下图:这里的学号是个key,哈希表就是根据key值来通过哈希函数计算得到一个值,这个值就是下......
  • JDK 1.8 HashMap 扩容源码详解
     作为开发人员,千万不能停留在实现功能上,一定要提升到性能方面上。这需要我们不断的实践,学习源码, 根据底层实现原理,来做出最好的操作。 就HashMap而言,一定是我们常用的......
  • redis的hash数据类型的基本操作
    1、首先连上你的redis以下一些命令很简单,或者执行命令后效果也无法体现的就没有进行截图展示2、hash相关操作说明:redis的hash键值对集合,特别适合存储对象,类似于java中......
  • 【Java基础】HashMap集合案例、集合嵌套及统计字符串每个字符出现的次数
    目录​​一、HashMap集合练习:键是String值是Student​​​​二、HashMap集合练习:键是Student值是String​​​​三、集合嵌套:ArrayList嵌套HashMap​​​​四、集合嵌套:Hash......
  • 【Java基础】Set集合、HashSet集合、LinkedHashSet集合的概述和特点及哈希值
    目录​​一、Set集合概述和特点​​​​二、哈希值​​​​三、HashSet集合的概述和特点​​​​HashSet集合保证元素唯一性的原理​​​​四、LinkedHashSet集合概述和特点......
  • Hashicorp Consul Service API远程命令执行漏洞
    Preface简介Consul是HashiCorp公司推出的一款开源工具,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案相比,Consul提供的方案更为“一站式”。Con......
  • 简述HashSet的扩容机制以及我们在重写equals()的时候为何会重写hashcode()
    简述HashSet的扩容机制以及我们在重写equals()的时候为何会重写hashcode()  摘要:在背面试知识点的时候存在这样一条著名的面试题:我们重写equals()的时候为什么要重写has......
  • Vue Hash模式和History模式
    首先,这两个模式都是在单页前端应用下的概念Hash模式的url后面会有一个“#”号(这个看起来会有点奇怪)。当改变#后面的部分是不会去请求后端的,仅在前端进行切换,所以在对一个H......
  • MyBatis的执行器
    Mybatis执行器种类Mybatis的执行器Executor分为三类简单执行器:SimpleExcutor可重用执行器:ReuseExcutor批量执行器:BatchExcutor配置:在Mybatis配置文件中配置执行器......
  • IPMI v2.0 Password Hash Disclosure漏洞
    漏洞描述:远程主机支持IPMIv2.0智能平台,由于支持RMCP+认证密钥交换协议(RAKP)认证,管理接口(IPMI)协议受到信息泄露漏洞的影响。远程攻击者可以通过HMAC从BMC的RAKPmessage2响......