这篇文章主要介绍“PostgreSQL在执行逻辑优化中相关的数据结构是什么”,在日常操作中,相信很多人在PostgreSQL在执行逻辑优化中相关的数据结构是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PostgreSQL在执行逻辑优化中相关的数据结构是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、数据结构

FromExpr
表示FROM … WHERE结构

/*----------*FromExpr-representsaFROM...WHERE...construct*表示FROM...WHERE结构**ThisisbothmoreflexiblethanaJoinExpr(itcanhaveanynumberof*children,includingzero)andlessso---wedon'tneedtodealwith*aliasesandsoon.Theoutputcolumnsetisimplicitlyjusttheunion*oftheoutputsofthechildren.*该结构比JoinExpr(有0..n个子节点)更为灵活--不需要处理别名等.*输出列集合是子集输出的汇总.*----------*/typedefstructFromExpr{NodeTagtype;//连接子树链表List*fromlist;/*Listofjoinsubtrees*///join中的表达式Node*quals;/*qualifiersonjoin,ifany*/}FromExpr;

JoinExpr
用于SQL JOIN表达式.

/*----------*JoinExpr-forSQLJOINexpressions*用于SQLJOIN表达式.**isNatural,usingClause,andqualsareinterdependent.Theusercanwrite*onlyoneofNATURAL,USING(),orON()(thisisenforcedbythegrammar).*IfhewritesNATURALthenparseanalysisgeneratestheequivalentUSING()*list,andfromthatfillsin"quals"withtherightequalitycomparisons.*IfhewritesUSING()then"quals"isfilledwithequalitycomparisons.*IfhewritesON()thenonly"quals"isset.NotethatNATURAL/USING*arenotequivalenttoON()sincetheyalsoaffecttheoutputcolumnlist.*isNatural,usingClause,andquals是相互依赖的.*用户只可以使用NATURAL,USING(),orON()(语法限制).*如果是NATURAL,则解析器会产生相应的USING()链表,并使用正确的等值比较表达式填充quals.*如果是USING(),则使用正确的等值比较表达式填充quals.*如果是ON(),则只设置quals字段.*注意NATURAL/USING与ON()并不相同,因为它们同时影响了输出列链表.**aliasisanAliasnoderepresentingtheASalias-clauseattachedtothe*joinexpression,orNULLifnoclause.NB:presenceorabsenceofthe*aliashasacriticalimpactonsemantics,becauseajoinwithanalias*restrictsvisibilityofthetables/columnsinsideit.*alias表示与join表达式相关的AS别名子句,如无则为NULL.*注意:别名的存在与否对语义有很大影响,因此有别名的join限制了其中表/列的可见性.**Duringparseanalysis,anRTEiscreatedfortheJoin,anditsindex*isfilledintortindex.ThisRTEispresentmainlysothatVarscan*becreatedthatrefertotheoutputsofthejoin.Theplannersometimes*generatesJoinExprsinternally;thesecanhavertindex=0ifthereare*nojoinaliasvariablesreferencingsuchjoins.*在解析时,RTE在参与Join时解析,编号填充到rtindex中.*该RTE存在的目的主要是可以创建引用join输出的Vars.*计划器有时候会在内部生成JoinExprs;如没有join别名变量参考这样的连接,那么rtindex=0*----------*/typedefstructJoinExpr{NodeTagtype;//join类型JoinTypejointype;/*typeofjoin*///自然连接?boolisNatural;/*Naturaljoin?Willneedtoshapetable*///左树Node*larg;/*leftsubtree*///右树Node*rarg;/*rightsubtree*///USING语句(String链表)List*usingClause;/*USINGclause,ifany(listofString)*///join限定符Node*quals;/*qualifiersonjoin,ifany*///别名语句Alias*alias;/*user-writtenaliasclause,ifany*///分配给join的RT编号,或者为0intrtindex;/*RTindexassignedforjoin,or0*/}JoinExpr;二、源码解读

N/A

三、跟踪分析

...(gdb)p*(FromExpr*)($rte_sq_rte->subquery->jointree)$44={type=T_FromExpr,fromlist=0x16fda18,quals=0x16fe0f0}(gdb)set$rtesq2_jointree=(FromExpr*)($rte_sq_rte->subquery->jointree)(gdb)p*$rtesq2_jointree->fromlist$48={type=T_List,length=1,head=0x16fd9f8,tail=0x16fd9f8}(gdb)p*(Node*)$rtesq2_jointree->fromlist->head->data.ptr_value$49={type=T_JoinExpr}(gdb)set$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={type=T_JoinExpr,jointype=JOIN_INNER,isNatural=false,larg=0x2c1e848,rarg=0x2c1ebd8,usingClause=0x0,quals=0x2c20c48,alias=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,alias=0xda,rtindex=46274048}(gdb)p*(JoinExpr*)$tmpvar->quals$7={type=T_OpExpr,jointype=98,isNatural=67,larg=0x0,rarg=0x64,usingClause=0x2c27fb8,quals=0xa9,alias=0x0,rtindex=0}...

到此,关于“PostgreSQL在执行逻辑优化中相关的数据结构是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!