PostgreSQL在执行逻辑优化中相关的数据结构有哪些
发表于:2025-11-11 作者:千家信息网编辑
千家信息网最后更新 2025年11月11日,这篇文章主要介绍"PostgreSQL在执行逻辑优化中相关的数据结构有哪些",在日常操作中,相信很多人在PostgreSQL在执行逻辑优化中相关的数据结构有哪些问题上存在疑惑,小编查阅了各式资料,整理
千家信息网最后更新 2025年11月11日PostgreSQL在执行逻辑优化中相关的数据结构有哪些
这篇文章主要介绍"PostgreSQL在执行逻辑优化中相关的数据结构有哪些",在日常操作中,相信很多人在PostgreSQL在执行逻辑优化中相关的数据结构有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"PostgreSQL在执行逻辑优化中相关的数据结构有哪些"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
PostgreSQL在执行逻辑优化中相关的数据结构包括RangeSubselect/Alias/RangeVar/ResTarget/ColumnRef.
一、数据结构
RangeSubselect
出现在FROM语句中的子查询
/* * RangeSubselect - subquery appearing in a FROM clause * 出现在FROM语句中的子查询 */typedef struct RangeSubselect{ NodeTag type; //是否有LATERAL? bool lateral; /* does it have LATERAL prefix? */ //未转换的子查询语句 Node *subquery; /* the untransformed sub-select clause */ //表别名和可选的列别名 Alias *alias; /* table alias & optional column aliases */} RangeSubselect;Alias
为RangeVar指定别名.别名可能同时重命名了表列.
/* * Alias - * specifies an alias for a range variable; the alias might also * specify renaming of columns within the table. * 为RangeVar指定别名.别名可能同时重命名了表列. * * Note: colnames is a list of Value nodes (always strings). In Alias structs * associated with RTEs, there may be entries corresponding to dropped * columns; these are normally empty strings (""). See parsenodes.h for info. * 注意:colnames是Value节点(通常是字符串)链表. * 在与RTEs相关的Alias结构体中,可能有跟已删除的列对应的条目. * 这些通常是空字符串("").详细可参考parsenodes.h */typedef struct Alias{ NodeTag type; //别名 char *aliasname; /* aliased rel name (never qualified) */ //列别名链表 List *colnames; /* optional list of column aliases */} Alias;RangeVar
range variable,用于FROM语句中.
/* * RangeVar - range variable, used in FROM clauses * range variable,用于FROM语句中. * * Also used to represent table names in utility statements; there, the alias * field is not used, and inh tells whether to apply the operation * recursively to child tables. In some contexts it is also useful to carry * a TEMP table indication here. * 在工具语句中,用于表示表名,这时alias字段没有使用. * inh用于判断是否在子表中递归应用相关的操作. */typedef struct RangeVar{ NodeTag type; char *catalogname; /* the catalog (database) name, or NULL */ char *schemaname; /* the schema name, or NULL */ char *relname; /* the relation/sequence name */ bool inh; /* expand rel by inheritance? recursively act * on children? */ char relpersistence; /* see RELPERSISTENCE_* in pg_class.h */ Alias *alias; /* table alias & optional column aliases */ int location; /* token location, or -1 if unknown */} RangeVar;ResTarget
结果目标列(用于先前已转换的解析树的目标链表中)
/* * ResTarget - * result target (used in target list of pre-transformed parse trees) * 结果目标列(用于先前已转换的解析树的目标链表中) * * In a SELECT target list, 'name' is the column label from an * 'AS ColumnLabel' clause, or NULL if there was none, and 'val' is the * value expression itself. The 'indirection' field is not used. * 在SELECT的目标链表中, * 'name'是'AS ColumnLabel'语句中的列标签,如无则为NULL, * 'val'是value表达式本身. * 'indirection'未使用. * * INSERT uses ResTarget in its target-column-names list. Here, 'name' is * the name of the destination column, 'indirection' stores any subscripts * attached to the destination, and 'val' is not used. * INSERT在target-column-names链表中使用ResTarget. * 这里'name'是目标列名称,'indirection'存储了所有与目标相关的子脚本,'val'未使用. * * In an UPDATE target list, 'name' is the name of the destination column, * 'indirection' stores any subscripts attached to the destination, and * 'val' is the expression to assign. * 在UPDATE目标链表中,'name'是目标列名称,'indirection'存储了所有与目标相关的子脚本, * 'val'是与赋值相关的表达式. * * See A_Indirection for more info about what can appear in 'indirection'. * 详细参见A_Indirection('indirection') */typedef struct ResTarget{ NodeTag type; //列名或NULL char *name; /* column name or NULL */ //子脚本,字段名称,'*'或NIL List *indirection; /* subscripts, field names, and '*', or NIL */ //需要计算或赋值的值表达式 Node *val; /* the value expression to compute or assign */ //token的位置,-1表示未知 int location; /* token location, or -1 if unknown */} ResTarget;ColumnRef
指定对列或整个元组的引用
/* * ColumnRef - specifies a reference to a column, or possibly a whole tuple * 指定对列或整个元组的引用 * * The "fields" list must be nonempty. It can contain string Value nodes * (representing names) and A_Star nodes (representing occurrence of a '*'). * Currently, A_Star must appear only as the last list element --- the grammar * is responsible for enforcing this! * "fields"链表不能为空.可能包含字符串Value节点和A_Star节点(表示出现了*). * 截止到目前为止,A_Star必须出现在最后一个链表元素中. * * Note: any container subscripting or selection of fields from composite columns * is represented by an A_Indirection node above the ColumnRef. However, * for simplicity in the normal case, initial field selection from a table * name is represented within ColumnRef and not by adding A_Indirection. */typedef struct ColumnRef{ NodeTag type; //字段名称(字符串值)链表或A_Star List *fields; /* field names (Value strings) or A_Star */ //token位置 int location; /* token location, or -1 if unknown */} ColumnRef;二、源码解读
N/A
三、跟踪分析
RangeSubselect/Alias
(gdb) p *(Node *)($stmt->fromClause->head.data->ptr_value)$15 = {type = T_RangeSubselect} #实际类型是范围子查询RangeSubselect(gdb) set $fromclause=(RangeSubselect *)($stmt->fromClause->head.data->ptr_value)(gdb) p *$fromclause$16 = {type = T_RangeSubselect, lateral = false, subquery = 0x1666c18, alias = 0x1666d40}(gdb) p *($fromclause->subquery) #subquery,子查询是SelectStmt类型的节点$17 = {type = T_SelectStmt}(gdb) p *($fromclause->alias) #alias,别名,实际值是字符串ret$18 = {type = T_Alias, aliasname = 0x1666d28 "ret", colnames = 0x0}RangeVar
...$43 = {type = T_RangeVar}(gdb) p *(RangeVar *)((JoinExpr *)($joinexpr->larg))->larg$44 = {type = T_RangeVar, catalogname = 0x0, schemaname = 0x0, relname = 0x1643380 "t_dwxx", inh = true, relpersistence = 112 'p', alias = 0x0, location = 82}...ResTarget
...(gdb) p *(Node *)($subquerylarg->targetList->head.data->ptr_value)$26 = {type = T_ResTarget}(gdb) set $subvar=(ResTarget *)($subquerylarg->targetList->head.data->ptr_value)(gdb) p *$subvar {type = T_ResTarget, name = 0x0, indirection = 0x0, val = 0x1642c70, location = 23}...ColumnRef
...(gdb) p *$restarget->val$25 = {type = T_ColumnRef}(gdb) p *(ColumnRef *)$restarget->val$26 = {type = T_ColumnRef, fields = 0x1a47a08, location = 7}(gdb) p *((ColumnRef *)$restarget->val)->fields$27 = {type = T_List, length = 2, head = 0x1a47a88, tail = 0x1a479e8}(gdb) p *(Node *)(((ColumnRef *)$restarget->val)->fields)->head.data->ptr_value$32 = {type = T_String}#fields链表的第1个元素是数据表,第2个元素是数据列(gdb) p *(Value *)(((ColumnRef *)$restarget->val)->fields)->head.data->ptr_value$37 = {type = T_String, val = {ival = 27556248, str = 0x1a47998 "t_dwxx"}}(gdb) p *(Value *)(((ColumnRef *)$restarget->val)->fields)->tail.data->ptr_value$38 = {type = T_String, val = {ival = 27556272, str = 0x1a479b0 "dwmc"}}...到此,关于"PostgreSQL在执行逻辑优化中相关的数据结构有哪些"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
目标
别名
数据
结构
语句
数据结构
逻辑
查询
名称
字符
字符串
节点
学习
元素
字段
脚本
表达式
位置
同时
实际
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
游戏服务器帧同步
php查询数据库为空
网络安全应急响应时间规定
高科技互联网团建活动产品
软件开发适合哪种招标方式6
软件找不到服务器数据库
深圳网络数据库维护怎么样
亚马逊上可以开店做软件开发吗
网络技术转让合同模板
数据库sysdate的字段长度
数据库创建表方法的优缺点
网络安全防止诈骗
网络安全法可以跨境使用吗
初中生可以学网络技术吗
中国权威文献数据库
安卓数据库数据修改
网络安全设备应用
久趣服务器
数据库对号怎么打
网络安全知识列举
局域网不显示连接到服务器
网络安全警告企业
达芬奇16数据库在哪里
永顺软件开发中职学校
怎么复制粘贴捏脸数据库
云南信息化网络安全工程介绍
软件开发工程师劳动合同
上网吧玩我的世界服务器
access调取数据库
微信公众号牛牛数据库