我的编程空间,编程开发者的网络收藏夹
学习永远不晚

PostgreSQL执行聚合函数所使用的数据结构有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

PostgreSQL执行聚合函数所使用的数据结构有哪些

这篇文章主要讲解了“PostgreSQL执行聚合函数所使用的数据结构有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PostgreSQL执行聚合函数所使用的数据结构有哪些”吧!

一、数据结构

AggState
聚合函数执行时状态结构体,内含AggStatePerAgg等结构体



//在nodeAgg.c中私有的结构体
typedef struct AggStatePerAggData *AggStatePerAgg;
typedef struct AggStatePerTransData *AggStatePerTrans;
typedef struct AggStatePerGroupData *AggStatePerGroup;
typedef struct AggStatePerPhaseData *AggStatePerPhase;
typedef struct AggStatePerHashData *AggStatePerHash;
typedef struct AggState
{
    //第一个字段是NodeTag(继承自ScanState)
    ScanState    ss;                
    //targetlist和quals中所有的Aggref
    List       *aggs;            
    //链表的大小(可以为0)
    int            numaggs;        
    //pertrans条目大小
    int            numtrans;        
    //Agg策略模式
    AggStrategy aggstrategy;    
    //agg-splitting模式,参见nodes.h
    AggSplit    aggsplit;        
    //指向当前步骤数据的指针
    AggStatePerPhase phase;        
    //步骤数(包括0)
    int            numphases;        
    //当前步骤
    int            current_phase;    
    //per-Aggref信息
    AggStatePerAgg peragg;        
    //per-Trans状态信息
    AggStatePerTrans pertrans;    
    //长生命周期数据的ExprContexts(hashtable)
    ExprContext *hashcontext;    
    ////长生命周期数据的ExprContexts(每一个GS使用)
    ExprContext **aggcontexts;    
    //输入表达式的ExprContext
    ExprContext *tmpcontext;    
#define FIELDNO_AGGSTATE_CURAGGCONTEXT 14
    //当前活跃的aggcontext
    ExprContext *curaggcontext; 
    //当前活跃的aggregate(如存在)
    AggStatePerAgg curperagg;    
#define FIELDNO_AGGSTATE_CURPERTRANS 16
    //当前活跃的trans state
    AggStatePerTrans curpertrans;    
    //输入结束?
    bool        input_done;        
    //Agg扫描结束?
    bool        agg_done;        
    //最后一个grouping set
    int            projected_set;    
#define FIELDNO_AGGSTATE_CURRENT_SET 20
    //将要解析的当前grouping set
    int            current_set;    
    //当前投影操作的分组列
    Bitmapset  *grouped_cols;    
    //倒序的分组列链表
    List       *all_grouped_cols;    
    
    //-------- 下面的列用于grouping set步骤数据
    //所有步骤中最大的sets大小
    int            maxsets;        
    //所有步骤的数组
    AggStatePerPhase phases;    
    //对于phases > 1,已排序的输入信息
    Tuplesortstate *sort_in;    
    //对于下一个步骤,输入已拷贝
    Tuplesortstate *sort_out;    
    //排序结果的slot
    TupleTableSlot *sort_slot;    
    
    //------- 下面的列用于AGG_PLAIN和AGG_SORTED模式:
    //per-group指针的grouping set编号数组
    AggStatePerGroup *pergroups;    
    //当前组的第一个元组拷贝
    HeapTuple    grp_firstTuple; 
    
    //--------- 下面的列用于AGG_HASHED和AGG_MIXED模式:
    //是否已填充hash表?
    bool        table_filled;    
    //hash桶数?
    int            num_hashes;
    //相应的哈希表数据数组
    AggStatePerHash perhash;    
    //per-group指针的grouping set编号数组
    AggStatePerGroup *hash_pergroup;    
    
    //---------- agg输入表达式解析支持
#define FIELDNO_AGGSTATE_ALL_PERGROUPS 34
    //首先是->pergroups,然后是hash_pergroup
    AggStatePerGroup *all_pergroups;    
    //投影实现机制
    ProjectionInfo *combinedproj;    
} AggState;

//nodeag .c支持的基本选项
#define AGGSPLITOP_COMBINE        0x01    
#define AGGSPLITOP_SKIPFINAL    0x02    
#define AGGSPLITOP_SERIALIZE    0x04    
#define AGGSPLITOP_DESERIALIZE    0x08    

//支持的操作模式
typedef enum AggSplit
{
    
    //基本 : 非split聚合
    AGGSPLIT_SIMPLE = 0,
    
    //部分聚合的初始步骤,序列化
    AGGSPLIT_INITIAL_SERIAL = AGGSPLITOP_SKIPFINAL | AGGSPLITOP_SERIALIZE,
    
    //部分聚合的最终步骤,反序列化
    AGGSPLIT_FINAL_DESERIAL = AGGSPLITOP_COMBINE | AGGSPLITOP_DESERIALIZE
} AggSplit;

//测试AggSplit选择了哪些基本选项
#define DO_AGGSPLIT_COMBINE(as)        (((as) & AGGSPLITOP_COMBINE) != 0)
#define DO_AGGSPLIT_SKIPFINAL(as)    (((as) & AGGSPLITOP_SKIPFINAL) != 0)
#define DO_AGGSPLIT_SERIALIZE(as)    (((as) & AGGSPLITOP_SERIALIZE) != 0)
#define DO_AGGSPLIT_DESERIALIZE(as) (((as) & AGGSPLITOP_DESERIALIZE) != 0)

AggStatePerAggData
per-aggregate信息,这个结构体包含了调用最终函数的信息,用以从状态值中产生一个最终的聚合结果.如果查询中有多个相同的Aggrefs,共享相同的per-agg数据.


typedef struct AggStatePerAggData
{
    
    Aggref       *aggref;
    
    //该agg应使用的状态值索引
    int            transno;
    
    //final function函数的Oid(可以是InvalidOid)
    Oid            finalfn_oid;
    
    FmgrInfo    finalfn;
    
    int            numFinalArgs;
    
    //所有直接参数表达式的ExprStates
    List       *aggdirectargs;
    
    int16        resulttypeLen;
    bool        resulttypeByVal;
    
    bool        shareable;
}            AggStatePerAggData;

AggStatePerTransData
聚合状态值信息(per aggregate state value information), 通过输入行调用转换函数更新聚合状态值的工作状态.该结构体不会存储从转换状态而来的用于产生最终聚合结果的相关信息,这些信息会存储在AggStatePerAggData中.


typedef struct AggStatePerTransData
{
    
    
    Aggref       *aggref;
    
    bool        aggshared;
    
    int            numInputs;
    
    int            numTransInputs;
    
    //转换或组合函数Oid
    Oid            transfn_oid;
    
    //序列化函数Oid或InvalidOid
    Oid            serialfn_oid;
    
    //反序列化函数Oid或InvalidOid
    Oid            deserialfn_oid;
    
    //状态值数据类型Oid
    Oid            aggtranstype;
    
    FmgrInfo    transfn;
    
    //序列化函数fmgr
    FmgrInfo    serialfn;
    
    //反序列化函数fmgr
    FmgrInfo    deserialfn;
    
    //派生于聚合的输入排序规则
    Oid            aggCollation;
    
    //排序列个数
    int            numSortCols;
    
    
    //在DISTINCT比较时需考虑的排序列数
    int            numDistinctCols;
    
    //重组排序信息
    AttrNumber *sortColIdx;
    Oid           *sortOperators;
    Oid           *sortCollations;
    bool       *sortNullsFirst;
    
    FmgrInfo    equalfnOne;
    ExprState  *equalfnMulti;
    
    Datum        initValue;
    bool        initValueIsNull;
    
    int16        inputtypeLen,
                transtypeLen;
    bool        inputtypeByVal,
                transtypeByVal;
    
    //当前输入的tuple
    TupleTableSlot *sortslot;    
    //用于多列DISTINCT
    TupleTableSlot *uniqslot;    
    //输入元组描述符
    TupleDesc    sortdesc;        
    
    //排序对象,仅用于DISTINCT/ORDER BY
    Tuplesortstate **sortstates;    
    
    FunctionCallInfoData transfn_fcinfo;
    
    //序列化和反序列化函数信息
    FunctionCallInfoData serialfn_fcinfo;
    FunctionCallInfoData deserialfn_fcinfo;
}            AggStatePerTransData;

AggStatePerGroupData
per-aggregate-per-group工作状态,这些工作状态值在第一个输入tuple group时初始化,后续在处理每个输入tuple时更新.


typedef struct AggStatePerGroupData
{
#define FIELDNO_AGGSTATEPERGROUPDATA_TRANSVALUE 0
    //当前转换值
    Datum        transValue;        
#define FIELDNO_AGGSTATEPERGROUPDATA_TRANSVALUEISNULL 1
    bool        transValueIsNull;
#define FIELDNO_AGGSTATEPERGROUPDATA_NOTRANSVALUE 2
    //如transValue尚未设置,则为T
    bool        noTransValue;    
    
}            AggStatePerGroupData;

AggStatePerPhaseData
per-grouping-set-phase状态.Grouping sets会被分拆为多个”步骤”,每一个单独的步骤在输入上都会完成一轮处理.


typedef struct AggStatePerPhaseData
{
    //该步骤使用的策略
    AggStrategy aggstrategy;    
    //grouping sets个数,如无则为0
    int            numsets;        
    //grouping sets的大小
    int           *gset_lengths;    
    //rollup(上卷)列组
    Bitmapset **grouped_cols;    
    //返回等价的表达式,比较列序号作为索引
    ExprState **eqfunctions;    
    //对应步骤数据的Agg节点
    Agg           *aggnode;        
    //该步骤的输入排序Sort节点
    Sort       *sortnode;        
    //转换函数解析
    ExprState  *evaltrans;        
}            AggStatePerPhaseData;

AggStatePerHashData
per-hashtable状态.使用哈希进行grouping set,每一个grouping set都会有一个这样的结构体.


typedef struct AggStatePerHashData
{
    //每一个group都有一个条目的哈希表
    TupleHashTable hashtable;    
    //访问哈希表的迭代器
    TupleHashIterator hashiter; 
    //装载哈希表的slot
    TupleTableSlot *hashslot;    
    //per-grouping-field哈希函数
    FmgrInfo   *hashfunctions;    
    //per-grouping-field等价函数
    Oid           *eqfuncoids;        
    //哈希键列个数
    int            numCols;        
    //哈希表中的列数
    int            numhashGrpCols; 
    //请求哈希最大的列
    int            largestGrpColIdx;    
    //输入slot中的hash col索引数组
    AttrNumber *hashGrpColIdxInput; 
    //hashtbl元组索引数组
    AttrNumber *hashGrpColIdxHash;    
    //元素的Agg节点,用于numGroups等等
    Agg           *aggnode;        
}            AggStatePerHashData;

感谢各位的阅读,以上就是“PostgreSQL执行聚合函数所使用的数据结构有哪些”的内容了,经过本文的学习后,相信大家对PostgreSQL执行聚合函数所使用的数据结构有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

PostgreSQL执行聚合函数所使用的数据结构有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

sql中常用的聚合函数有哪些

sql 中的聚合函数用于合并多个值,常用函数有:sum() 求和、avg() 求平均值、min() 求最小值、max() 求最大值、count() 求计数、distinct count() 求不重复计数、total() 求分区内总和、ave
sql中常用的聚合函数有哪些
2024-05-07

Pureftpd中MYSQL数据库所使用的函数有哪些

小编给大家分享一下Pureftpd中MYSQL数据库所使用的函数有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!MYSQLGetPW SELECT Passw
2023-06-16

C++ 函数库中有哪些常见的数据结构?

c++++ 标准函数库提供了以下常用数据结构:数组:连续内存块,通过索引访问元素。向量:动态大小的数组,可自动增长/缩小,提供高效插入/删除/随机访问。链表:线性数据结构,元素存储在动态分配的节点中,每个节点包含数据和指向下一个节点的指针。
C++ 函数库中有哪些常见的数据结构?
2024-04-18

Python中的常用数据结构有哪些?

Python是一种高级编程语言,广泛应用于数据分析、机器学习、Web开发等领域。在Python中,有许多常用的数据结构,用于存储和处理数据。本文将介绍几种常见的数据结构,并提供相应的代码示例。列表(List):列表是Python中最常用的数
2023-10-22

java集合框架及背后的数据结构有哪些

今天小编给大家分享一下java集合框架及背后的数据结构有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 介绍Java
2023-07-05

常用的Java数据结构知识点有哪些

小编给大家分享一下常用的Java数据结构知识点有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1. 数据结构分类按照线性和非线性可以将Java数据结构分为两大类:①线性数据结构:数组、链表、栈、队列②非线性数据结构:树
2023-06-29

Python的字符串和常用数据结构有哪些

本篇内容介绍了“Python的字符串和常用数据结构有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用字符串第二次世界大战促使了现代电子
2023-06-01

你知道常用数据的结构都有哪些吗?

  本篇文章给大家带来的就是关于数据结构的一些分析,这篇文章会给大家带来一些关于数据结构的一些讲解,希望本篇文章能帮助到你,对你有所收获,数据结构就是计算机存储和组织数据的方式,希望大家仔细阅读文章。  数组  在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合
你知道常用数据的结构都有哪些吗?
2024-04-18

PHP中构造函数的使用原则有哪些

PHP中构造函数的使用原则有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。构造函数是PHP中总要的基本语法,什么是构造函数呢?我们这里就一起来看看PHP构造函数。如果你
2023-06-17

适合Linux用户使用的数据库管理工具有哪些

这篇文章主要介绍适合Linux用户使用的数据库管理工具有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. AutotablaAutotabla是一个你的程序的SQL数据表的CGI管理界面。只需要提供你数据库架构
2023-06-16

编程热搜

目录