PostgreSQL进行逻辑优化的相关数据结构有哪些?

分类:编程技术 时间:2024-02-20 15:51 浏览:0 评论:0
0
本文主要介绍“PostgreSQL执行逻辑优化时相关的数据结构有哪些”。在日常操作中,相信很多人都对PostgreSQL在执行逻辑优化时的相关数据结构有哪些存在疑问。小编查了一下。整理了各种材料和简单易用的操作方法。希望能帮助大家解答“PostgreSQL执行逻辑优化时相关数据结构有哪些?”的疑惑!接下来就请跟随小编一起来学习吧!

1.数据结构

FromExpr
表示FROM ... WHERE结构

/*---------- * FromExpr -表示 FROM ... WHERE ... 构造 * 表示 FROM ... WHERE 结构 * * 这比 JoinExpr 更灵活(它可以有任意数量的 * 子级,包括零),但也比 JoinExpr 更灵活 --- 我们不这样做不需要处理 * 别名 a等等。输出列集隐式只是子级输出的并集*。 *这种结构比JoinExpr(有0..n个子节点)更灵活——不需要处理别名等。 *输出列集是子集输出的摘要。 *--------- */typedef struct FromExpr{ NodeTag 类型; //加入子树列表List *fromlist; /* 连接子树列表 */ //连接节点中的表达式 *quals; /* 连接限定符(如果有)*/} FromExpr;

JoinExpr
对于 SQL JOIN 表达式。

/*---- ------ * JoinExpr - 用于 SQL JOIN 表达式 * 用于 SQL JOIN 表达式。 * * isNatural、usingClause 和 quals 是相互依赖的。用户只能编写 * NATURAL、USING() 或 ON() 之一(这是由语法强制执行的)。 * 如果他写的是 NATURAL,则解析分析会生成等效的 USING() * 列表,并从中填充“quals”并进行正确的相等比较。 * 如果他写 USING(),那么“quals”将充满相等比较。 *如果他写 ON() 则仅设置“quals”。请注意,NATURAL/USING * 不等于 ON(),因为它们也会影响输出列列表。 * isNatural、usingClause 和 quals 是相互依赖的。 * 仅限用户 您可以使用 NATURAL、USING() 或 ON()(语法限制)。 * 如果是NATURAL,解析器将生成相应的USING()链表,并用正确的相等比较表达式填充quals。 * 如果是USING(),则使用正确的相等比较表达式来填充quals。 * 如果是ON(),则只设置quals字段。 * 注意注意NATURAL/USING与ON()不同,因为它们也会影响输出列列表。 * * alias 是一个 Alias 节点,表示附加到 * join 表达式的 AS alias-clause,如果没有子句则为 NULL。注意:* 别名的存在或不存在对语义有至关重要的影响,因为带有别名 * 的联接限制了其中表/列的可见性。 * alias 表示与 join 表达式相关的 AS 别名子句sion,如果没有则为 NULL。 * 注意:别名的存在与否对语义有很大影响,因此带有别名的连接会限制其中表/列的可见性。 * * 在解析分析时,会为Join创建一个RTE,并将其索引 * 填充到rtindex中。此 RTE 的存在主要是为了可以创建引用连接输出的变量。规划器有时会在内部生成JoinExprs;如果没有引用此类连接的连接别名变量,则这些连接的 rtindex = 0。 * 解析时,RTE参与Join时解析,没有。填写rtindex。 * 此 RTE 的主要目的是创建引用连接输出的变量。 * 规划器有时会在内部生成JoinExprs;如果没有连接别名变量来引用此类连接,则 rtindex = 0 *--- ------- */typedef struct JoinExpr{ NodeTag type; //连接类型 JoinType jointype; /* 连接类型 */ //自然连接? bool isNatural; /* 自然连接?需要塑造表格*/ //左树节点 *large; /* 左子树 */ //右树节点 *rarg; /* 右子树 */ //USING 语句(字符串链表) List *usingClause; /* USING 子句,如果有(字符串列表)*/ //加入限制限定符节点 *quals; /* join 上的限定符,如果有的话 */ //别名声明 Alias ​​*alias; /* 用户编写的别名子句,如果有的话 */ //分配给 join 的 RT 编号,或 0 int rtindex; /* 为连接分配的 RT 索引,或 0 */} JoinExpr;

2. 来源代码解释

N/A

3.跟踪分析
...(gdb) p *(FromExpr *)( $rte_sq_rte->subquery->jointree)$44 = {type = T_FromExpr, fromlist = 0x16fda18, quals = 0x16fe0f0}(gdb) set $rtesq2_jointree=(FromExpr *)($rte_sq_rte->子查询->jointree)(gdb) p * $rtesq2_jointree->fromlist$48 = {类型 = T_List,长度 = 1,头 = 0x16fd9f8,尾 = 0x16fd9f8}(gdb) p *(节点 *)$rtesq2_jointree->fromlist->head->data.ptr_value$49 = {type = T_JoinExpr}(gdb) 设置 $tmpvar=(JoinExpr *)$rtesq2_jointree->fromlist->head->data.ptr_value(gdb) p *$tmpvar$3 = {type = T_JoinExpr, jointype = JOIN_INNER、isNatural = false、larg = 0x2b68730、rarg = 0x2c215e8、usingClause = 0x0、quals = 0x2c28130、alias = 0x0、rtindex = 5}(gdb) p *$tmpvar->larg$4 = {type = T_JoinExpr}(gdb) p *(JoinExpr *)$tmpvar->larg$5 = { 类型 = T_JoinExpr、jointype = JOIN_INNER、isNatural = false、larg = 0x2c1e848、rarg = 0x2c1ebd8、usingClause = 0x0、quals = 0x2c20c48、别名 = 0x0、rtindex = 3} (gdb) p *(JoinExpr *)$tmpvar->rarg $6 = {type = T_RangeTblRef,jointype = JOIN_SEMI,isNatural = 8,larg = 0x2b66de0,rarg = 0x636d7764,usingClause = 0x10,quals = 0x2b66de0,别名 = 0xda,rtindex = 4 6274048}(gdb) p *(JoinExpr *)$tmpvar ->quals$7 = {type = T_OpExpr,jointype = 98,isNatural = 67,larg = 0x0,rarg = 0x64,usingClause = 0x2c27fb8,quals = 0xa9,别名= 0x0, rtindex = 0}...

至此结束了“WhaPostgreSQL执行逻辑优化相关的数据结构有哪些吗?希望能够解决大家的疑惑,理论与实践结合能够更好的帮助大家学习,快去尝试吧!如果你还想继续学习更多相关知识,请继续关注网站,小编会继续努力,给大家带来更多实用的文章!

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > PostgreSQL进行逻辑优化的相关数据结构有哪些?

用户评论