3.HashJoin 节点 postgres=# explain select a.*,b.* from test_dm a join test_dm2 b on a.xxx = b.xxx; QUERY PLAN -------------------------------------------------------------------------------- Hash Join (cost=34846.00..305803.23 rows=1000000 width=137) H…
接前文,我们继续说剩下的4个Materialization节点. 7.SetOp节点 SetOp节点用于处理集合操作,对应于SQL语句中的EXCEPT.INTERSECT两种集合操作,至于另一种集合操作UNION,可直接由Append节点来实现. 一个SetOp节点只能处理一个集合操作(由两个集合参与),如果有多个集合操作则需要组合多个SetOp节点来实现.SetOp节点仅有一个左子节点作为输人,其左子节点是一个Append节点或者是一个Sort节点(Sort节点的子节点是一个Append节点)…
5.ModifyTable节点 先看一个ModifyTable节点的例子: postgres=# explain update test_01 set id = 5 where name = 'xxx'; QUERY PLAN --------------------------------------------------------------- Update on test_01 (cost=0.00..23.75 rows=6 width=48) -> Seq Scan on test…
控制节点 控制节点用于完成一些特殊的流程执行方式.由于PostgreSQL为査询语句生成二叉树状的査询计划,其中大部分节点的执行过程需要两个以内的输入和一个输出.但有一些特殊的功能为了优化的需要,会含有特殊的执行方式和输人需求(例如对于update.INSERT和DELETE,在普通的SELECT基础上有一个ModifyTable节点,UNION操作在一个计划节点就执行多个表(大于2)的合并,Append节点并未把UNION涉及的多个表放在孩子节点中,而是将这些表组成一个链表放在Append节点…
接前文跟我一起读postgresql源码(九)--Executor(查询执行模块之--Scan节点(上)) ,本篇把剩下的七个Scan节点结束掉. T_SubqueryScanState, T_FunctionScanState, T_ValuesScanState, T_CteScanState, T_WorkTableScanState, T_ForeignScanState, T_CustomScanState, 8.SubqueryScan 节点 SubqueryScan节点的作用是以另…
Join节点 JOIN节点有以下三种: T_NestLoopState, T_MergeJoinState, T_HashJoinState, 连接类型节点对应于关系代数中的连接操作,PostgreSQL中定义了如下几种连接类型(以T1 JOIN T2 为例): 1)Inner Join:内连接,将T1的所有元组与T2中所有满足连接条件的元组进行连接操作. 2)Left Outer Join:左连接,在内连接的基础上,对于那些找不到可连接T2元组的T1元组,用一个空值元组与之连接. 3)Righ…
从前面介绍的可优化语句处理相关的背景知识.实现思想和执行流程,不难发现可优化语句执行的核心内容是对于各种计划节点的处理,由于使用了节点表示.递归调用.统一接口等设计,计划节点的功能相对独立.代码总体流程相似,下面介绍执行器中各种计划节点的相关执行过程. 在PostgreSQL中,计划节点分为四类,分别是控制节点(Control Node).扫描节点(ScanNode),物化节点(Materialization Node).连接节点(Join Node) . 控制节点:是一类用于处理特殊情况的节点…
物化节点 顾名思义,物化节点是一类可缓存元组的节点.在执行过程中,很多扩展的物理操作符需要首先获取所有的元组后才能进行操作(例如聚集函数操作.没有索引辅助的排序等),这时要用物化节点将元组缓存起来.下面列出了PostgreSQL中提供的物化节点. T_MaterialState, T_SortState, T_GroupState, T_AggState, T_WindowAggState, T_UniqueState, T_HashState, T_SetOpState, T_LockRows…
2.可优化语句的执行 可优化语句的共同特点是它们被查询编译器处理后都会生成査询计划树,这一类语句由执行器(Executor)处理.该模块对外提供了三个接口: ExecutorStart.ExecutorRun 和 ExecutorEnd,其输入是包含査询计划树的数据结构QueryDesc,输出则是相关执行信息或结果数据.如果希望执行某个计划树,仅需构造包含此计划树的QueryDesc,并依次调用ExecutorStart.ExecutorRun.ExecutorEnd 3个过程即能完成相应的处理…
上一篇我们介绍了查询规划模块的总体流程和预处理部分的源码.查询规划模块再执行完预处理之后,可以进入正式的查询规划处理流程了. 查询规划的主要工作由grouping_planner函数完成.在具体实现的时候,针对postgresql中独有的继承表,程序使用inheritance_planner函数来解决,该函数主要是先将继承表的继承关系变换为非继承表来处理,然后仍然调用的是grouping_planner函数来完成查询规划的工作. 因此,我们说查询规划的主要工作在于grouping_planner…