入口函数为ExplainOnePlan,他会创建一个查询描述结构queryDesc,然后进入执行器执行ExecutorStart、ExecutorRun、ExecutorFinish、ExecutorEnd。当然执行explain时可以添加analyze参数,当添加这个参数时才会执行ExecutorRun即真正执行该查询。
打印执行计划是由函数ExplainPrintPlan完成,该函数调用ExplainNode,由入参PlanState结构传递Plan tree。该PlanState有initPlan(非相关子查询)、lefttree、righttree、subPlan等。遍历计划树就是对这几个节点链进行递归遍历。可以看到,他打印完本节点信息后,若有左右子树则递归进行ExplainNode,然后对特殊节点进行特殊处理,使用ExplainMemberNodes、ExplainNode和ExplainCustomChildren函数进行处理。最后若有子计划则递归遍历subPlan。
详细打印信息可通过上面图的流程框架进入每个函数深入阅读理解。
GreenPlum的GPCC可以动态以树的形式打印执行计划,显示执行计划执行的进度。理解explain如何打印执行计划及这些节点怎么遍历后,可以更加方便理解推测GPCC打印执行计划的机制(因为gpcc还未开源)。
同时执行计划的执行时间从什么时候开始,到什么时候结束,也可以通过函数ExplainOnePlan看INSTR_TIME_SET_CURRENT(starttime);类似的时间。