2.6.7 简单查询的执行流程

一般的数据操作语言(DML)命令都是作为简单查询来处理的,系统调用exec_simple_query函数来执行简单查询,该函数的执行流程如图2-16所示。

图2-16 简单查询流程图

exec_simple_query函数是Postgres后台实际执行DML语句的函数。它解读用户输入的字符串形式的命令并检查合法性,最终执行并返回结果。《数据库系统实现》中所提到的各个主要的数据库模块都是在这个函数中调用的,包括编译器、分析器、优化器和执行器,它们相互协作完成各种实际的处理工作,构成了服务进程的主体。这些模块的内部都十分复杂,下面大致说明它们的主要功能和代码位置。

该书由机械工业出版社于2010年引进出版。——编辑注编译器:编译器是主流程中的第一个模块。它的作用是扫描用户输入的字符串形式的命令,检查其合法性,并将其转换为Postgres定义的内部数据结构。Postgres为每一条SQL命令都定义了相应的C语言结构体,用来存放命令中的各种参数。编译器是利用著名的lex和yacc工具编写的,其入口为pg_parse_query函数。它的代码位于src/backend/paser目录下的scan.l和gram.y文件中。

分析器:分析器接收编译器传递过来的各种命令数据结构(语法树),对它们进行相应的的处理,最终转换为统一的数据结构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目录下。

Postgres进程在系统中扮演着一个工作执行者的角色,在单用户或者多用户模式下,客户端请求通过认证后将直接与服务进程Postgres进程通信,而无须守护进程干预,只在客户端对应的后台进程出现问题时由守护进程执行容错恢复工作。Postgres和用户进行交互,执行客户端提交的查询请求和命令,并将执行结果通过网络返回给用户。Postgres后台进程的运行即实现了PostgreSQL的多任务并发执行。

results matching ""

    No results matching ""