我们都知道pg在启动后会有一个管理后端的常驻进程,被称为"Postmaster",默认会监听5432端口,等待连接请求,前端可以通过libpq或者JDBC来与后端进行通信,每个客户端的连接请求进来的时候,Postmaster都会fork出如下一个postgres工作进程,也就是真正的后端处理进程,来与客户端进行直接交互。
 
 
下面介绍下postgres后端处理的整个流程:
1. 客户端发送过来查询请求(文本的sql语句)给postgres工作进程;
2. 计算机是没办法直接识别sql文本的,所以需要将sql文本根据scan.l和gram.y中预先定义的sql词法规则(Lexcial Rules)以及语法规则(Grammatic Rules)生成数据库查询引擎系统内部的查询语法树形式(AST),此阶段处理的入口函数为raw_parser(parser/parser.c)
3. 查询引擎会将2中得到的语法树进行预处理转换成查询引擎可处理的形式----查询树(Query Tree),这个阶段会将查询语句中的某些部分进行转换,例如“*”会被转换成对应表的所有列,会访问数据库,检查表是否存在,若存在,将表名字转成oid等等。这个阶段被称作分析处理,分析处理模块是analyzer,分析处理模块的入口是在parse_analyze ,主要由do_parse_analyze完成(parser/analyze.c)
4. 查询引擎使用pg_rewrite中所设定的规则进行所谓的基于规则的转换,重写模块的入口在QueryRewrite (rewrite/rewriteHandler.c)
5. 查询引擎进行查询优化,查询优化主要分为两步,生成路径(optimizer/path)和生成计划(optimizer/plan),此模块的入口在standard_planner (optimizer/plan/planner.c)
6. 将生成的最优执行计划发送给executor执行已达到查询的目的,这个模块被称作executor,执行器的入口为ExecutorRun (executor/execMain.c)
7. 将查询得到的结果返回给客户端
 
 

posted on 2019-06-29 21:07  LyndonYoung  阅读(472)  评论(0编辑  收藏  举报