本篇内容介绍了“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文档到电脑,方便收藏和打印~
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-14
2024-05-14
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0