iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >PostgreSQL中分区表查询相关的重要数据结构有哪些
  • 900
分享到

PostgreSQL中分区表查询相关的重要数据结构有哪些

2024-04-02 19:04:59 900人浏览 独家记忆
摘要

本篇内容介绍了“postgresql中分区表查询相关的重要数据结构有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能

本篇内容介绍了“postgresql中分区表查询相关的重要数据结构有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、数据结构

RelOptInfo
RelOptInfo是规划器/优化器使用的关系信息结构体
在规划过程中已存在的基表或者是在关系运算过程中产生的中间关系或者是最终产生的关系,都使用RelOptInfo结构体进行封装表示.
查询分区表时该结构体中的part_scheme存储分区的schema,nparts存储分区数,boundinfo是分区边界信息,partition_qual是分区约束条件,part_rels是分区表中每个分区的每个分区的RelOptInfo,partexprs是分区键表达式,partitioned_child_rels是关系中未修剪(unpruned)分区的RT索引.unpruned是指查询分区表时,涉及的相关分区,比如 where c1 = 1 OR c1 = 2涉及的分区只有t_hash_partition_1和t_hash_partition_3,则在partitioned_child_rels中只有这两个分区的信息.
如何pruned,下节介绍


typedef enum RelOptKind
{
    RELOPT_BASEREL,//基本关系(如基表/子查询等)
    RELOPT_JOINREL,//连接产生的关系,要注意的是通过连接等方式产生的结果亦可以视为关系
    RELOPT_OTHER_MEMBER_REL,
    RELOPT_OTHER_JOINREL,
    RELOPT_UPPER_REL,//上层的关系
    RELOPT_OTHER_UPPER_REL,
    RELOPT_DEADREL
} RelOptKind;


#define IS_SIMPLE_REL(rel) \
    ((rel)->reloptkind == RELOPT_BASEREL || \
     (rel)->reloptkind == RELOPT_OTHER_MEMBER_REL)


#define IS_JOIN_REL(rel)    \
    ((rel)->reloptkind == RELOPT_JOINREL || \
     (rel)->reloptkind == RELOPT_OTHER_JOINREL)


#define IS_UPPER_REL(rel)   \
    ((rel)->reloptkind == RELOPT_UPPER_REL || \
     (rel)->reloptkind == RELOPT_OTHER_UPPER_REL)


#define IS_OTHER_REL(rel) \
    ((rel)->reloptkind == RELOPT_OTHER_MEMBER_REL || \
     (rel)->reloptkind == RELOPT_OTHER_JOINREL || \
     (rel)->reloptkind == RELOPT_OTHER_UPPER_REL)

typedef struct RelOptInfo
{
    //节点标识
    nodeTag     type;
    //RelOpt类型
    RelOptKind  reloptkind;

    
    //所有关系都有的属性
    //Relids(rtindex)集合
    Relids      relids;         

    
    //规划器生成的大小估算
    //结果元组的估算数量
    double      rows;           

    
    //规划器使用的每个关系的控制标记
    //是否考虑启动成本?是,需要保留启动成本低的路径
    bool        consider_startup;   
    //是否考虑参数化?的路径 
    bool        consider_param_startup; 
    //是否考虑并行处理路径
    bool        consider_parallel;  

    
    //扫描该Relation时默认的结果投影列
    //Vars/Exprs,成本,行平均大小链表
    struct PathTarget *reltarget;   

    
    //物化信息
    //访问路径链表
    List       *pathlist;       
    //路径链表中的ParamPathInfos链表
    List       *ppilist;        
    //并行部分路径
    List       *partial_pathlist;   
    //启动代价最低的路径
    struct Path *cheapest_startup_path;
    //整体代价最低的路径
    struct Path *cheapest_total_path;
    //获取唯一值代价最低的路径
    struct Path *cheapest_unique_path;
    //参数化代价最低的路径
    List       *cheapest_parameterized_paths;

    
    
    //基本通道和连接通道都需要参数化信息
    //(参考lateral_vars和lateral_referencers)
    //使用lateral语法,需依赖的Relids
    Relids      direct_lateral_relids;  
    //rel的最小化参数信息
    Relids      lateral_relids; 

    
    //reloptkind=RELOPT_BASEREL时使用的数据结构
    //relid
    Index       relid;           
    //表空间
    Oid         reltablespace;  
    //类型:基表?子查询?还是函数等等?
    RTEKind     rtekind;        
    //最小的属性编号
    AttrNumber  min_attr;       
    //最大的属性编号
    AttrNumber  max_attr;       
    //属性数组
    Relids     *attr_needed;    
    //属性宽度
    int32      *attr_widths;    
    //关系依赖的LATERAL Vars/PHVs
    List       *lateral_vars;   
    //依赖该关系的Relids
    Relids      lateral_referencers;    
    //该关系的IndexOptInfo链表
    List       *indexlist;      
    //统计信息链表
    List       *statlist;       
    //块数
    BlockNumber pages;          
    //元组数
    double      tuples;      
    //
    double      allvisfrac;  
    //如为子查询,存储子查询的root
    PlannerInfo *subroot;       
    //如为子查询,存储子查询的参数
    List       *subplan_params; 
    //并行执行,需要多少个workers?
    int         rel_parallel_workers;   

    
    //FWD相关信息
    //表或连接的服务器标识符
    Oid         serverid;       
    //用户id标识
    Oid         userid;         
    //对于当前用户来说,连接才是有效的
    bool        useridiscurrent;    
    
    //使用结构体FdwRoutine,避免包含头文件fdwapi.h
    struct FdwRoutine *fdwroutine;
    void       *fdw_private;

    
    //如果已证明该关系是唯一的,那么这些是用于缓存这些信息的字段
    //已知的,可保证唯一的Relids链表
    List       *unique_for_rels;    
    //已知的,不唯一的Relids链表
    List       *non_unique_for_rels;    

    
    //用于各种扫描和连接
    //如为基本关系,存储约束条件链表
    List       *baserestrictinfo;   
    //解析约束表达式的成本?
    QualCost    baserestrictcost;   
    //最低安全等级
    Index       baserestrict_min_security;  
    //连接语句的约束条件信息
    List       *joininfo;       
    //是否存在等价类连接?
    bool        has_eclass_joins;   

    
    //partitionwise连接使用的字段
    //是否考虑使用partitionwise join?
    bool        consider_partitionwise_join;    
    //最高层的父关系Relids
    Relids      top_parent_relids;  

    
     //分区表使用
    //分区的schema 
    PartitionScheme part_scheme;    
    //分区数 
    int         nparts;         
    //分区边界信息 
    struct PartitionBoundInfoData *boundinfo;   
    //分区约束
    List       *partition_qual; 
    //分区的RelOptInfo数组 
    struct RelOptInfo **part_rels;  
    //非空分区键表达式链表
    List      **partexprs;      
    //可为空的分区键表达式 
    List      **nullable_partexprs; 
    // 分区子表RT Indexes链表 
    List       *partitioned_child_rels; 
} RelOptInfo;

AppendRelInfo
Append-relation信息.
当我们将可继承表(分区表)或UNION-ALL子查询展开为“追加关系”(本质上是子RTE的链表)时,为每个子RTE构建一个AppendRelInfo。
AppendRelInfos链表指示在展开父节点时必须包含哪些子rte,每个节点具有将引用父节点的Vars转换为引用该子节点的Vars所需的所有信息。



typedef struct AppendRelInfo
{
    NodeTag     type;

    
    Index       parent_relid;   
    Index       child_relid;    

    
    Oid         parent_reltype; 
    Oid         child_reltype;  

    
    //child's Vars中的表达式
    List       *translated_vars;    

    
    Oid         parent_reloid;  
} AppendRelInfo;

PlannerInfo
该数据结构用于存储查询语句在规划/优化过程中的相关信息


struct AppendRelInfo;

typedef struct PlannerInfo
{
    NodeTag     type;//Node标识
    //查询树
    Query      *parse;          
    //当前的planner全局信息
    PlannerGlobal *glob;        
    //查询层次,1标识最高层
    Index       query_level;    
    // 如为子计划,则这里存储父计划器指针,NULL标识最高层
    struct PlannerInfo *parent_root;    

    
    List       *plan_params;    
    Bitmapset  *outer_params;

    
    //RelOptInfo数组,存储"base rels",比如基表/子查询等.
    //该数组与RTE的顺序一一对应,而且是从1开始,因此[0]无用 */
    struct RelOptInfo **simple_rel_array;   
    int         simple_rel_array_size;  

    
    //RTE数组
    RangeTblEntry **simple_rte_array;   

    
    //处理集合操作如UNION ALL时使用和分区表时使用
    struct AppendRelInfo **append_rel_array;

    
    Relids      all_baserels;//"base rels"

    
    //Nullable-side端的"base rels"
    Relids      nullable_baserels;

    
    //参与连接的Relation的RelOptInfo链表
    List       *join_rel_list;  
    //可加快链表访问的hash表
    struct HTAB *join_rel_hash; 

    
    //RelOptInfo指针链表数组,k层的join存储在[k]中
    List      **join_rel_level; 
    //当前的join层次
    int         join_cur_level; 
    //查询的初始化计划链表
    List       *init_plans;     
    //CTE子计划ID链表
    List       *cte_plan_ids;   
    //MULTIEXPR子查询输出的参数链表的链表
    List       *multiexpr_params;   
    //活动的等价类链表
    List       *eq_classes;     
    //规范化的PathKey链表
    List       *canon_pathkeys; 
    //外连接约束条件链表(左)
    List       *left_join_clauses;  
    //外连接约束条件链表(右)
    List       *right_join_clauses; 
    //全连接约束条件链表
    List       *full_join_clauses;  
    //特殊连接信息链表
    List       *join_info_list; 
    //AppendRelInfo链表
    List       *append_rel_list;    
    //PlanRowMarks链表
    List       *rowMarks;       
    //PHI链表
    List       *placeholder_list;   
    // 外键信息链表
    List       *fkey_list;      
    //query_planner()要求的PathKeys链表
    List       *query_pathkeys; 
    //分组子句路径键
    List       *group_pathkeys; 
    //窗口函数路径键
    List       *window_pathkeys;    
    //distinctClause路径键
    List       *distinct_pathkeys;  
    //排序路径键
    List       *sort_pathkeys;  
    //已规范化的分区Schema
    List       *part_schemes;   
    //尝试连接的RelOptInfo链表
    List       *initial_rels;   

    
    //上层的RelOptInfo链表
    List       *upper_rels[UPPERREL_FINAL + 1]; 

    
    //grouping_planner为上层处理选择的结果tlists
    struct PathTarget *upper_targets[UPPERREL_FINAL + 1];//

    
    ////最后需处理的投影列
    List       *processed_tlist;

    
    //setrefs.c中在create_plan()函数调用期间填充的字段
    //分组函数属性映射
    AttrNumber *grouping_map;   
    //MinMaxAggInfos链表
    List       *minmax_aggs;    
    //内存上下文
    MemoryContext planner_cxt;  
    //关系的page计数
    double      total_table_pages;  
    //query_planner输入参数:元组处理比例
    double      tuple_fraction; 
    //query_planner输入参数:limit_tuple
    double      limit_tuples;   
    //表达式的最小安全等级
    Index       qual_security_level;    
    
    //注意:如果没有securityQuals, 则qual_security_level是NULL(0)

    //如目标relation是分区表的child/partition/分区表,则通过此字段标记
    InheritanceKind inhTargetKind;  
    //是否存在RTE_JOIN的RTE
    bool        hasJoinRTEs;    
    //是否存在标记为LATERAL的RTE
    bool        hasLateralRTEs; 
    //是否存在已在jointree删除的RTE
    bool        hasDeletedRTEs; 
    //是否存在Having子句
    bool        hasHavingQual;  
    //如约束条件中存在pseudoconstant = true,则此字段为T
    bool        hasPseudoConstantQuals; 
    //是否存在递归语句
    bool        hasRecursion;   

    
    //这些字段仅在hasRecursion为T时使用:
    //工作表的PARAM_EXEC ID
    int         wt_param_id;    
    //非递归模式的访问路径
    struct Path *non_recursive_path;    

    
    //这些字段用于createplan.c
    //当前节点之上的外部rels
    Relids      curOuterRels;   
    //未赋值的NestLoopParams参数
    List       *curOuterParams; 

    
    //可选的join_search_hook私有数据,例如GEQO
    void       *join_search_private;

    
    //该查询是否更新分区键列?
    bool        partColsUpdated;
} PlannerInfo;

“Postgresql中分区表查询相关的重要数据结构有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

您可能感兴趣的文档:

--结束END--

本文标题: PostgreSQL中分区表查询相关的重要数据结构有哪些

本文链接: https://www.lsjlt.com/news/64758.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • PostgreSQL中分区表查询相关的重要数据结构有哪些
    本篇内容介绍了“PostgreSQL中分区表查询相关的重要数据结构有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能...
    99+
    2024-04-02
  • PostgreSQL在执行逻辑优化中相关的数据结构有哪些
    这篇文章主要介绍“PostgreSQL在执行逻辑优化中相关的数据结构有哪些”,在日常操作中,相信很多人在PostgreSQL在执行逻辑优化中相关的数据结构有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单...
    99+
    2024-04-02
  • Oracle中查询表结构的方法有哪些
    今天小编给大家分享一下Oracle中查询表结构的方法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。方法一:在【命令窗口...
    99+
    2023-07-06
  • PostgreSQL统计信息中相关的数据字典表有哪些
    本篇内容介绍了“PostgreSQL统计信息中相关的数据字典表有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学...
    99+
    2024-04-02
  • 查询json数据结构的方式有哪些
    这篇文章主要介绍“查询json数据结构的方式有哪些”,在日常操作中,相信很多人在查询json数据结构的方式有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”查询json数据...
    99+
    2024-04-02
  • Mysql 5.7中Gtid相关内部数据结构有哪些
    本篇内容介绍了“Mysql 5.7中Gtid相关内部数据结构有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有...
    99+
    2024-04-02
  • PostgreSQL中结合实际的内存数据介绍相关数据结构
    小编给大家分享一下PostgreSQL中结合实际的内存数据介绍相关数据结构,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、数据结构   typedef st...
    99+
    2024-04-02
  • 数据库表中关系模型结构有哪些
    这篇文章主要介绍了数据库表中关系模型结构有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一个关系数据库表中的各条记录前后顺序可以任意颠倒...
    99+
    2024-04-02
  • oracle数据库怎么查询几个结构相同的表
    要查询多个结构相同的表,可以使用 union 运算符将每个表的 select 语句连接起来,确保列数和类型匹配。具体步骤包括:1. 确定要查询的列;2. 编写 uni...
    99+
    2024-04-18
    oracle
  • SqlServer关于分区表的相关知识点有哪些
    这篇文章主要讲解了“SqlServer关于分区表的相关知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SqlServer关于分区表的相关知识点有哪...
    99+
    2024-04-02
  • Nginx配置相关结构划分的技巧有哪些
    这期内容当中小编将会给大家带来有关Nginx配置相关结构划分的技巧有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Nginx配置需要一定的技巧,我们在不断的使用和维护...
    99+
    2024-04-02
  • SQLServer中如何查询表的结构和元数据
    要查询表的结构和元数据,可以使用以下SQL语句: SELECT COLUMN_NAME, DATA_TY...
    99+
    2024-04-09
    SQLServer
  • C++数据结构中链表有哪些操作
    这篇文章主要为大家展示了“C++数据结构中链表有哪些操作”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C++数据结构中链表有哪些操作”这篇文章吧。首先创建好一个节点typedef st...
    99+
    2023-06-25
  • java中的数据结构有哪些
    java中的数据结构有哪些?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java中有几种常用的数据结构,主要分为Collection和map两个主要接口(接口只...
    99+
    2023-06-14
  • PostgreSQL在执行逻辑优化中相关的数据结构是什么
    这篇文章主要介绍“PostgreSQL在执行逻辑优化中相关的数据结构是什么”,在日常操作中,相信很多人在PostgreSQL在执行逻辑优化中相关的数据结构是什么问题上存在疑惑,小编查阅了各式资料,整理出简单...
    99+
    2024-04-02
  • HTML5中SVG的文档结构及相关元素有哪些
    HTML5中SVG的文档结构及相关元素有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。结构相关的组合和重用元素,这里先对SVG的文档结...
    99+
    2024-04-02
  • PostgreSQL执行聚合函数所使用的数据结构有哪些
    这篇文章主要讲解了“PostgreSQL执行聚合函数所使用的数据结构有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PostgreSQL执行聚合函数所使...
    99+
    2024-04-02
  • PostgreSQL中不同数据类型对查询性能的影响有哪些
    本篇内容主要讲解“PostgreSQL中不同数据类型对查询性能的影响有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PostgreSQL中不同数据类型对查询...
    99+
    2024-04-02
  • MSSql中怎么查询出数据表的所有重复数据
    MSSql中怎么查询出数据表的所有重复数据,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。这里直接给出下面的例子:SELECT&nb...
    99+
    2024-04-02
  • 数据库表分区的作用有哪些
    数据库表分区的作用主要有以下几点:1. 提高查询性能:通过将大表分割为多个小表,可以减少查询所需扫描的数据量,从而提高查询效率。2....
    99+
    2023-10-12
    数据库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作