【postgreSQL学习笔记】postgreSQL简单查询的执行流程

一、编译器

        编译器是主流程中的第一个模块,她的作用是扫描用户输入的字符串形式的命令,检查其合法性,并将其转换为Postgres定义的内部数据结构。Postgres为每一条SQL命令都定义了相应的C语言结构体,用来存放命令中的各种参数。其入口参数为pg_parse_query函数。代码位置:src/backend/paser目录下的sacn.l和gram.y文件中。

        词法器在文件scan.l里定义,负责识别标识符,SQL关键字等,对于发现的每个关键字或者标识符都会生成一个标记并且传递给分析器;

        分析器在文件gram.y里定义,包含一套语法规则和处罚规则时执行的动作。动作代码实际上是C代码,用于建立分析树。

二、分析器

        分析器接受编译器传递过来的各种命令数据结构(语法树),对他们进行相应的处理,最终转换为统一的数据结构Query。如果是查询命令,在生成Query后进行规则重写(rewrite)。重写部分的入口是QueryRewrite函数,代码位置:src/backend/rewrite目录下。分析器的入口是parse_analyze函数,其代码位于src/backend/paser目录下。

        重写系统是一个存在于分析器阶段和规划期/优化器之间的一个模块,输入和输出都是查询树。

三、优化器

        优化器接受分析器输出的Query结构体,进行优化处理后,输出执行器可移植性的计划(Plan)。一个特定的SQL查询可以以多种不同的方式执行,优化器将检查每个可能的查询计划,最终选择运行最快的查询计划。优化器的入口是pg_plan_query函数,代码位置:src/backend/optimizer。

四、执行器

        执行费查询命令的入口函数是ProcessUtility,代码位于src/backend/tcop/utility.c中,该函数的主体结构是一个switch语句,根据输入的命令类型调用相应的执行函数。执行查询命令的入口函数是ProcessQuery,代码位置:src/backend/executor目录下。

【postgreSQL学习笔记】postgreSQL简单查询的执行流程

图片参考:http://www.2cto.com/database/201307/225805.html



你可能感兴趣的:(【postgreSQL学习笔记】postgreSQL简单查询的执行流程)