小编给大家分享一下PostgreSQL中结合实际的内存数据介绍相关数据结构,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

一、数据结构

/**EquivalenceClasses**WheneverwecandeterminethatamergejoinableequalityclauseA=Bis*notdelayedbyanyouterjoin,wecreateanEquivalenceClasscontaining*theexpressionsAandBtorecordthisknowledge.Ifwelaterfindanother*equivalenceB=C,weaddCtotheexistingEquivalenceClass;thismay*requiremergingtwoexistingEquivalenceClasses.Attheendofthequal*distributionprocess,wehavesetsofvaluesthatareknownalltransitively*equaltoeachother,where"equal"isaccordingtotherulesofthebtree*operatorfamily(s)showninec_opfamilies,aswellasthecollationshown*byec_collation.(WerestrictanECtocontainonlyequalitieswhose*operatorsbelongtothesamesetofopfamilies.Thiscouldprobablybe*relaxed,butfornowit'snotworththetrouble,sincenearlyallequality*operatorsbelongtoonlyonebtreeopclassanyway.Similarly,wesuppose*thatallornoneoftheinputdatatypesarecollatable,sothatasingle*collationvalueissufficient.)**WealsouseEquivalenceClassesasthebasestructureforPathKeys,letting*usrepresentknowledgeaboutdifferentsortorderingsbeingequivalent.*SinceeveryPathKeymustreferenceanEquivalenceClass,wewillendup*withsingle-memberEquivalenceClasseswheneverasortkeyexpressionhas*notbeenequivalencedtoanythingelse.Itisalsopossiblethatsuchan*EquivalenceClasswillcontainavolatileexpression("ORDERBYrandom()"),*whichisacasethatcan'tariseotherwisesinceclausescontaining*volatilefunctionsareneverconsideredmergejoinable.Wemarksuch*EquivalenceClassesspeciallytopreventthemfrombeingmergedwith*ordinaryEquivalenceClasses.Also,forvolatileexpressionswehave*tobecarefultomatchtheEquivalenceClasstothecorrecttargetlist*entry:considerSELECTrandom()ASa,random()ASb...ORDERBYb,a.*SowerecordtheSortGroupRefoftheoriginatingsortclause.**Weallowequalityclausesappearingbelowthenullablesideofanouterjoin*toformEquivalenceClasses,butthesehaveaslightlydifferentmeaning:*theincludedvaluesmightbeallNULLratherthanallthesamenon-null*values.Seesrc/backend/optimizer/READMEformoreonthatpoint.**NB:ifec_mergedisn'tNULL,thisclasshasbeenmergedintoanother,and*shouldbeignoredinfavorofusingthepointed-toclass.*/typedefstructEquivalenceClass{NodeTagtype;List*ec_opfamilies;/*btree操作符族(pg_opfamily)Oids,btreeoperatorfamilyOIDs*/Oidec_collation;/*主要用于排序的规则,collation,ifdatatypesarecollatable*/List*ec_members;/*等价类成员链表,listofEquivalenceMembers*/List*ec_sources;/*产生等价类的RestrictInfo链表,listofgeneratingRestrictInfos*/List*ec_derives;/*衍生的RestrictInfo链表,listofderivedRestrictInfos*/Relidsec_relids;/*出现在成员中的所有relids,allrelidsappearinginec_members,except*forchildmembers(seebelow)*/boolec_has_const;/*成员中是否存在常量?anypseudoconstantsinec_members?*/boolec_has_volatile;/*成员中是否存在易变表达式(如Random等),the(sole)memberisavolatileexpr*/boolec_below_outer_join;/*等价类是否应用于外连接下层?equivalenceappliesbelowanOJ*/boolec_broken;/*产生所需要的子句是否失败?failedtogenerateneededclauses?*/Indexec_sortref;/*源于排序子句的标志,originatingsortclauselabel,or0*/Indexec_min_security;/*最小安全等级,minimumsecurity_levelinec_sources*/Indexec_max_security;/*最大安全等级,maximumsecurity_levelinec_sources*/structEquivalenceClass*ec_merged;/*合并后的等价类,setifmergedintoanotherEC*/}EquivalenceClass;/**IfanECcontainsaconstandisn'tbelow-outer-join,anyPathKeydepending*onitmustberedundant,sincethere'sonlyonepossiblevalueofthekey.*/#defineEC_MUST_BE_REDUNDANT(eclass)\((eclass)->ec_has_const&&!(eclass)->ec_below_outer_join)/**EquivalenceMember-onememberexpressionofanEquivalenceClass**em_is_childsignifiesthatthiselementwasbuiltbytransposingamember*foranappendrelparentrelationtorepresentthecorrespondingexpression*foranappendrelchild.Thesemembersareusedfordeterminingthe*pathkeysofscansonthechildrelationandforexplicitlysortingthe*childwhennecessarytobuildaMergeAppendpathforthewholeappendrel*tree.Anem_is_childmemberhasnoimpactonthepropertiesoftheECasa*whole;inparticulartheEC'sec_relidsfielddoesNOTincludethechild*relation.Anem_is_childmembershouldneverbemarkedem_is_constnor*causeec_has_constorec_has_volatiletobeset,either.Thus,em_is_child*membersarenotreallyfull-fledgedmembersoftheEC,butjustreflections*ordoppelgangersofrealmembers.MostoperationsonEquivalenceClasses*shouldignoreem_is_childmembers,andthosethatdon'tshouldtest*em_relidstomakesuretheyonlyconsiderrelevantmembers.**em_datatypeisusuallythesameasexprType(em_expr),butcanbe*differentwhendealingwithabinary-compatibleopfamily;inparticular*anyarray_opswouldneverworkwithoutthis.Useem_datatypewhen*lookingupaspecificbtreeoperatortoworkwiththisexpression.*/typedefstructEquivalenceMember{NodeTagtype;Expr*em_expr;/*该成员所代表的表达式,theexpressionrepresented*/Relidsem_relids;/*出现在表达式中的relids,allrelidsappearinginem_expr*/Relidsem_nullable_relids;/*低层外连接nullable端的relids,nullablebylowerouterjoins*/boolem_is_const;/*常量?expressionispseudoconstant?*/boolem_is_child;/*子Relation的衍生版本?derivedversionforachildrelation?*/Oidem_datatype;/*操作族使用到的数据类型,the"nominaltype"usedbytheopfamily*/}EquivalenceMember;二、跟踪分析

启动gdb,跟踪:

(gdb)bquery_plannerBreakpoint3at0x7693b5:fileplanmain.c,line57.

执行函数deconstruct_jointree,查看root结构

156joinlist=deconstruct_jointree(root);(gdb)163reconsider_outer_join_clauses(root);(gdb)p*root$4={type=T_PlannerInfo,parse=0x2c53ad0,glob=0x2c8bff8,query_level=1,parent_root=0x0,plan_params=0x0,outer_params=0x0,simple_rel_array=0x2c941f8,simple_rel_array_size=6,simple_rte_array=0x2c94248,all_baserels=0x0,nullable_baserels=0x0,join_rel_list=0x0,join_rel_hash=0x0,join_rel_level=0x0,join_cur_level=0,init_plans=0x0,cte_plan_ids=0x0,multiexpr_params=0x0,eq_classes=0x2c960b8,canon_pathkeys=0x0,left_join_clauses=0x0,right_join_clauses=0x0,full_join_clauses=0x0,join_info_list=0x0,append_rel_list=0x0,rowMarks=0x0,placeholder_list=0x0,fkey_list=0x0,query_pathkeys=0x0,group_pathkeys=0x0,window_pathkeys=0x0,distinct_pathkeys=0x0,sort_pathkeys=0x0,part_schemes=0x0,initial_rels=0x0,upper_rels={0x0,0x0,0x0,0x0,0x0,0x0,0x0},upper_targets={0x0,0x0,0x0,0x0,0x0,0x0,0x0},processed_tlist=0x2c8e3d0,grouping_map=0x0,minmax_aggs=0x0,planner_cxt=0x2b9fde0,total_table_pages=0,tuple_fraction=0,limit_tuples=-1,qual_security_level=0,inhTargetKind=INHKIND_NONE,hasJoinRTEs=true,hasLateralRTEs=true,hasDeletedRTEs=false,hasHavingQual=false,hasPseudoConstantQuals=false,hasRecursion=false,wt_param_id=-1,non_recursive_path=0x0,curOuterRels=0x0,curOuterParams=0x0,join_search_private=0x0,partColsUpdated=false}

root->eq_classes是等价类链表,其中的元素是等价类

(gdb)p*root->eq_classes$1={type=T_List,length=2,head=0x2c6daf8,tail=0x2c6ddf8}(gdb)set$ec1=(EquivalenceClass*)root->eq_classes->head->data.ptr_value(gdb)set$ec2=(EquivalenceClass*)root->eq_classes->head->next->data.ptr_value(gdb)p*$ec1$4={type=T_EquivalenceClass,ec_opfamilies=0x2c6d980,ec_collation=100,ec_members=0x2c6da58,ec_sources=0x2c6d9f0,ec_derives=0x0,ec_relids=0x2c6da20,ec_has_const=false,ec_has_volatile=false,ec_below_outer_join=false,ec_broken=false,ec_sortref=0,ec_min_security=0,ec_max_security=0,ec_merged=0x0}(gdb)p*$ec2$5={type=T_EquivalenceClass,ec_opfamilies=0x2c6dc30,ec_collation=100,ec_members=0x2c6dd58,ec_sources=0x2c6dca0,ec_derives=0x0,ec_relids=0x2c6dd20,ec_has_const=true,ec_has_volatile=false,ec_below_outer_join=false,ec_broken=false,ec_sortref=0,ec_min_security=0,ec_max_security=0,ec_merged=0x0}(gdb)

第1个等价类信息
ec_opfamilies

(gdb)p*$ec1->ec_opfamilies$6={type=T_OidList,length=2,head=0x2c6d960,tail=0x2c6d9b0}(gdb)p$ec1->ec_opfamilies->head->data.oid_value$7=1994(gdb)p$ec1->ec_opfamilies->head->next->data.oid_value$8=2095(gdb)

数据字典中相应的记录:

testdb=#select*frompg_opfamilywhereoid=2095;opfmethod|opfname|opfnamespace|opfowner-----------+------------------+--------------+----------403|text_pattern_ops|11|10(1row)testdb=#select*frompg_opfamilywhereoid=1994;opfmethod|opfname|opfnamespace|opfowner-----------+----------+--------------+----------403|text_ops|11|10(1row)

ec_members,共有2个元素
第1个元素,是rtindex=3的RTE,属性编号为2的字段,即t_grxx.grbh

(gdb)p*$ec1->ec_members$10={type=T_List,length=2,head=0x2c6da38,tail=0x2c6dad8}(gdb)set$ec1_em1=(EquivalenceMember*)$ec1->ec_members->head->data.ptr_value(gdb)set$ec1_em2=(EquivalenceMember*)$ec1->ec_members->head->next->data.ptr_value(gdb)p*$ec1_em1$13={type=T_EquivalenceMember,em_expr=0x2c69f88,em_relids=0x2c6d770,em_nullable_relids=0x0,em_is_const=false,em_is_child=false,em_datatype=25}(gdb)p*$ec1_em1$13={type=T_EquivalenceMember,em_expr=0x2c69f88,em_relids=0x2c6d770,em_nullable_relids=0x0,em_is_const=false,em_is_child=false,em_datatype=25}(gdb)p*$ec1_em1->em_expr$14={type=T_RelabelType}(gdb)p*(RelabelType*)$ec1_em1->em_expr$15={xpr={type=T_RelabelType},arg=0x2c69f38,resulttype=25,resulttypmod=-1,resultcollid=100,relabelformat=COERCE_IMPLICIT_CAST,location=-1}(gdb)p*((RelabelType*)$ec1_em1->em_expr)->arg$16={type=T_Var}(gdb)p*(Var*)((RelabelType*)$ec1_em1->em_expr)->arg$17={xpr={type=T_Var},varno=3,varattno=2,vartype=1043,vartypmod=14,varcollid=100,varlevelsup=0,varnoold=3,varoattno=2,location=136}

第2个元素,是rtindex=4的RTE,属性编号为1的字段,即t_jfxx.grbh

(gdb)p*$ec1_em2->em_expr$28={type=T_RelabelType}(gdb)p*(RelabelType*)$ec1_em2->em_expr$29={xpr={type=T_RelabelType},arg=0x2c69fd8,resulttype=25,resulttypmod=-1,resultcollid=100,relabelformat=COERCE_IMPLICIT_CAST,location=-1}(gdb)p*((RelabelType*)$ec1_em2->em_expr)->arg$30={type=T_Var}(gdb)p*(Var*)((RelabelType*)$ec1_em2->em_expr)->arg$31={xpr={type=T_Var},varno=4,varattno=1,vartype=1043,vartypmod=14,varcollid=100,varlevelsup=0,varnoold=4,varoattno=1,location=146}

其他信息

(gdb)p*$ec1->ec_sources$34={type=T_List,length=1,head=0x2c6d9d0,tail=0x2c6d9d0}(gdb)p*(Node*)$ec1->ec_sources->head->data.ptr_value$35={type=T_RestrictInfo}(gdb)p*(RestrictInfo*)$ec1->ec_sources->head->data.ptr_value$36={type=T_RestrictInfo,clause=0x2c6a098,is_pushed_down=true,outerjoin_delayed=false,can_join=true,pseudoconstant=false,leakproof=false,security_level=0,clause_relids=0x2c6d7a0,required_relids=0x2c6d758,outer_relids=0x0,nullable_relids=0x0,left_relids=0x2c6d770,right_relids=0x2c6d788,orclause=0x0,parent_ec=0x0,eval_cost={startup=-1,per_tuple=0},norm_selec=-1,outer_selec=-1,mergeopfamilies=0x2c6d980,left_ec=0x2c6ce68,right_ec=0x2c6ce68,left_em=0x2c6d890,right_em=0x2c6da88,scansel_cache=0x0,outer_is_left=false,hashjoinoperator=0,left_bucketsize=-1,right_bucketsize=-1,left_mcvfreq=-1,right_mcvfreq=-1}(gdb)p*$ec1->ec_relids$38={nwords=1,words=0x2c6da24}#即3号和4号RTE(gdb)p$ec1->ec_relids->words[0]$39=24

第2个等价类信息

(gdb)p*$ec2$41={type=T_EquivalenceClass,ec_opfamilies=0x2c6dc30,ec_collation=100,ec_members=0x2c6dd58,ec_sources=0x2c6dca0,ec_derives=0x0,ec_relids=0x2c6dd20,ec_has_const=true,ec_has_volatile=false,ec_below_outer_join=false,ec_broken=false,ec_sortref=0,ec_min_security=0,ec_max_security=0,ec_merged=0x0}

ec_opfamilies,与第1个等价类的信息一致

(gdb)p*$ec2->ec_opfamilies$42={type=T_OidList,length=2,head=0x2c6dc60,tail=0x2c6dc10}(gdb)p$ec2->ec_opfamilies->head->data.oid_value$43=1994(gdb)p$ec2->ec_opfamilies->head->next->data.oid_value$44=2095

ec_members,有3个元素

(gdb)p*$ec2->ec_members$46={type=T_List,length=3,head=0x2c6dd38,tail=0x2c6df20}(gdb)set$ec2_em1=(EquivalenceMember*)$ec2->ec_members->head->data.ptr_value(gdb)set$ec2_em2=(EquivalenceMember*)$ec2->ec_members->head->next->data.ptr_value(gdb)set$ec2_em3=(EquivalenceMember*)$ec2->ec_members->head->next->next->data.ptr_value

第1个元素,3号RTE,属性编号为1的字段,即t_grxx.dwbh

(gdb)p*$ec2_em1$47={type=T_EquivalenceMember,em_expr=0x2c69d58,em_relids=0x2c6dbc8,em_nullable_relids=0x0,em_is_const=false,em_is_child=false,em_datatype=25}(gdb)p*$ec2_em1->em_expr$48={type=T_RelabelType}(gdb)p*(RelabelType*)$ec2_em1->em_expr$49={xpr={type=T_RelabelType},arg=0x2c69d08,resulttype=25,resulttypmod=-1,resultcollid=100,relabelformat=COERCE_IMPLICIT_CAST,location=-1}(gdb)p*(Var*)((RelabelType*)$ec2_em1->em_expr)->arg$50={xpr={type=T_Var},varno=3,varattno=1,vartype=1043,vartypmod=14,varcollid=100,varlevelsup=0,varnoold=3,varoattno=1,location=115}

第2个元素

(gdb)p*$ec2_em2,1号RTE,属性编号为2的字段,即t_dwxx.dwbh$52={type=T_EquivalenceMember,em_expr=0x2c69e28,em_relids=0x2c6dbe0,em_nullable_relids=0x0,em_is_const=false,em_is_child=false,em_datatype=25}(gdb)p*$ec2_em2->em_expr$53={type=T_RelabelType}(gdb)p*(Var*)((RelabelType*)$ec2_em2->em_expr)->arg$54={xpr={type=T_Var},varno=1,varattno=2,vartype=1043,vartypmod=14,varcollid=100,varlevelsup=0,varnoold=1,varoattno=2,location=125}

第3个元素,是一个常量,即'1001'

(gdb)p*$ec2_em3$55={type=T_EquivalenceMember,em_expr=0x2c6a498,em_relids=0x0,em_nullable_relids=0x0,em_is_const=true,em_is_child=false,em_datatype=25}(gdb)p*$ec2_em3->em_expr$56={type=T_Const}(gdb)p*((Const*)$ec2_em2->em_expr)->arg(gdb)p*(Const*)$ec2_em3->em_expr$58={xpr={type=T_Const},consttype=25,consttypmod=-1,constcollid=100,constlen=-1,constvalue=46517720,constisnull=false,constbyval=false,location=172}

看完了这篇文章,相信你对“PostgreSQL中结合实际的内存数据介绍相关数据结构”有了一定的了解,如果想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!