时间一晃周末就过完了,时间过得太快,不由得让人倍加珍惜。时间真是不够用哈~

好的不废话,这次我们开始看查询规划模块的源码吧。

查询规划部分的在整个查询处理模块应该是在一个非常重要的地位上,这一步直接决定了查询的方式与路径,很大程度上影响了数据库查询的查询性能。因此这一块代码量也很大,我也会花较多的笔墨来分析这个模块的代码。在篇幅上,可能查询规划这一模块我会用2到3篇文章来细细的说明下。今天这一篇先总体概述下查询规划模块的全貌,在介绍该模块的一个重要的子模块(总共三个主要模块)就结束吧,剩下的交给第二篇吧。

1.查询规划模块总体概况

废话不多说,我先上图。下图大概的刻画了查询规划模块里主要的函数调用关系,当然啦,最下层只画到主处理函数,主处理函数内部的调用关系在介绍每个主处理函数的时候再细细的说吧。

我简单介绍下吧。exec_simple_query函数是负责查询处理的主函数,在进行查询规划之前,它已经调用了查询分析和查询重写模块。还记得上一篇博文的查询重写模块么?该模块返回的是重写后的查询树链表。这里exec_simple_query函数将重写后的查询树链表交给查询规划模块进一步处理。查询规划模块的入口函数是pg_plan_queries函数。

pg_plan_queries函数调用pg_plan_query函数对每一个查询进行处理并返回PlannedStmt(执行计划)结构体链表。这里要注意,查询规划模块只会对非UTILITY命令进行处理。

而在pg_plan_query函数里,实际是调用planner函数负责查询计划的生成。

planner函数调用standard_planner函数进入标准的查询规划处理流程。该函数接受查询树以及相关参数,返回PlannedStmt结构体,详细的结构如下:

typedef struct PlannedStmt
{
    NodeTag type;
    CmdType     commandType; /* select|insert|update|delete */ uint32 queryId; 
        		

网友评论