PostgreSQL在执行逻辑优化中相关的数据结构有哪些
发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇文章主要介绍"PostgreSQL在执行逻辑优化中相关的数据结构有哪些",在日常操作中,相信很多人在PostgreSQL在执行逻辑优化中相关的数据结构有哪些问题上存在疑惑,小编查阅了各式资料,整理
千家信息网最后更新 2025年02月02日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安全错误
数据库的锁怎样保障安全
关于网络安全学习内容
大的金融软件开发公司
使用excel制作数据库教程
网络安全素描画图片大全
数据库语言学习
网络安全法未通过测评处罚
陌声交友软件开发
软件开发边做边改模型
网络安全等级保护测评代理
上海大师网络技术有限公司
国家电网网络技术研究院
福建新一代网络技术创新服务
长沙卓杰网络技术
上海翎慕网络技术有限公司
网络技术弊大于利咨询稿
为什么要有数据库驱动
潮讯网络安全怎么样登录
方舟手游自己的服务器怎么改模式
我的世界1.17怎么开服务器
张掖家政服务app软件开发
舟山什么是软件开发计划
软件开发的版权归属
在培训中心的数据库系统
软件开发英语学习
安卓电话数据库查询
数据库事务的多个性质
服务器直连
上海挑选软件开发模型
进口手机网络安全
创建数据库ABC的命令是