加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询梗概

发布时间:2020-12-13 17:42:46 所属栏目:百科 来源:网络整理
导读:话说客户端发起请求,pg服务器为该请求启动一个postgres访问进程为该客户端通过访问,建立了连接。这个postgres访问进程进入无限循环,等待客户端请求并为其通过服务,直到进程终止,连接断口。这节就看客户端向postgres服务进程发出请求的处理过程。 1 Post

话说客户端发起请求,pg服务器为该请求启动一个postgres访问进程为该客户端通过访问,建立了连接。这个postgres访问进程进入无限循环,等待客户端请求并为其通过服务,直到进程终止,连接断口。这节就看客户端向postgres服务进程发出请求的处理过程。

1

Postgres服务进程处理请求的无限循环调用序列图

上图大红色方框中显示了postgres服务进程处理客户端访问的无限循环调用序列。我以一个简单的例子来展现处理简单查询的过程,就是走了上图中小红色方框中方法execu_simple_query。使用的例子如下:

先准备试验环境:创建数据库TEST,在里面创建表TEST1TEST2。建这两个表的语句在下面。

create table test1 (IDnumeric(10),cname varchar(30));

create table test2 (IDnumeric(10),comp varchar(30));

试验内容就是在这两个表上做连接查询,查询语句如下:

select cname,comp from test1,test2 where test1.id=test2.id;

当客户端给服务器端发出查询SQL后,建立连接时已经启动且进入无限循环的服务器端的postgres服务进程处理步骤如下:

(1)调用MemoryContextSwitchTo切换内存上下文到"MessageContext"

(2)调用MemoryContextResetAndDeleteChildren清理上次为相同连接服务时"MessageContext"内存上下文里遗留的对象。

(3)调用ReadCommand读取客户端的请求。

(4)根据客户端请求判断要提供何种服务,进入相应分支(参见《pg服务过程中的那些事一:启动postgres服务进程二:建立连接完成》)。根据例子里发的请求“select cname,test2 wheretest1.id=test2.id”进入简单查询分支处理方法execu_simple_query。

2

进入后的处理基本上涵盖了《数据库系统实现》这本书里的内容。处理量相当大,先根据流程图概览一下处理过程。为了减小图的大小,把PostgresMain以前的调用流程省略了。在以后的讨论中PostgresMain以前的调用流程也省略了,要回顾可以看上面的“Postgres服务进程处理请求的无限循环调用序列图”。



处理简单查询方法调用序列图

主要的处理过程是先调用start_xact_command方法开启一个事务,再用pg_parse_query方法用词法语法解析工具把查询命令解析为解析树parsetree,根据需要调用PushActiveSnapshot方法搞一个快照,调用pg_analyze_and_rewrite方法分析、根据规则重写解析树为查询树querytree,调用pg_plan_queries方法把查询树转换到执行计划树plantree,在调用相应方法创建portal和在postal中执行执行计划树并给客户端发回结果。然后退出当前事务,清理内存。


------------ 转载请著明出处,来自博客: blog.csdn.net/beiigang beigang.iteye.com

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读