postgresql之整体查询大致过程

news/2024/7/9 22:42:27 标签: postgresql

客户端通过pg服务器查询的大致过程如下

在这里插入图片描述

一、 建立连接

客户端首先需要连接上pg服务器,服务器在和客户端建立连接后fork一个子进程处理后续客户端的请求,服务器然后等待下一个客户端的连接。

二、发送请求

客户端发送请求数据给pg服务器,pg子进程读取请求。

  • 客户端发送请求
    比如命令行,读取用户输入,发送给服务器
    src/bin/psql/mainloop.c
int
MainLoop(FILE *source)
{
    ...
	SendQuery(query_buf->data);
    ...
}
  • 服务器接收请求
void
PostgresMain(int argc, char *argv[],
			 const char *dbname,
			 const char *username)
{
    ...
    for (;;)
	{
    	...
        firstchar = ReadCommand(&input_message);    
    	...
    }
}

三、解析

以简单查询为例子。服务器接收到的是一串字符串,需要解析理解这个数据才能执行。

src/backend/tcop/postgres.c

static void
exec_simple_query(const char *query_string)
{
    ...
    parsetree_list = pg_parse_query(query_string);
    ...
}

通过词法以及语法解析,构建一个原始的语法树。

四、优化

static void
exec_simple_query(const char *query_string)
{
    ...
    querytree_list = pg_analyze_and_rewrite(parsetree, query_string,
                                            NULL, 0, NULL);

    plantree_list = pg_plan_queries(querytree_list, query_string,
                                    CURSOR_OPT_PARALLEL_OK, NULL);

     ..
}

将原始的语法树转化为一个查询树,并且对查询树进行优化以及重写,提升执行速度。

五、执行

static void
exec_simple_query(const char *query_string)
{
    ...
    (void) PortalRun(portal,
                     FETCH_ALL,
                     true,	/* always top level */
                     true,
                     receiver,
                     receiver,
                     &qc);
    ...
}

六、返回结果

具体函数还为找到 😦


http://www.niftyadmin.cn/n/1829982.html

相关文章

FB引擎系列-之CloudSand

CloudSand,欲打破之前的集中版本制作的模式, http://code.taobao.org/p/cloudsand包含服务器端代码(php)和客户端代码(unity) EasyDown的时候,是采用一种经典的模式准备原始资源-》打包制作版本…

杭电1465--不容易系列之一

不容易系列之一 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 16634 Accepted Submission(s): 6928 Problem Description大家常常感慨,要做好一件事情真的不容易,确实,失败…

【转】Nginx中upstream有以下几种方式:

1、轮询(weight1) 默认选项,当weight不指定时,各服务器weight相同, 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。upstream bakend {server 192.168.1.10;server 192.168.1.11;}2、…

基于海康威视SDK javaB/S

基于海康威视SDK javaB/S 下载NetVideoActiveX23.cab文件,放在webRoot下面的codebase文件夹里 //全局变量定义 var m_iNowChanNo -1; //当前通道号 var m_iLoginUserId -1; //注册设备用户ID var m_iChannelNum -1; //模拟通道总数 var m_bDVRControl null; //O…

having——至少被订购过两回的订单

此篇介绍having的用法 一、表:订单表,产品表 说明:订单表order ,包含prodectid 二、查询至少被订购过两回的订单productid SQL: select prodectid from orders group by prodectid having count(prodectid)>1分析:此…

postgresql之语法解析 浅析

一、pg语法简介 1.1 语法文件结构 语法.y文件和词法.l文件结构差不多,也是通过 %%分成了三个部分: 声明部分、语法规则部分、C代码部分。 src/backend/parser/gram.y #### 声明部分%{C代码 头文件,变量声明等(此范围内的内容原样输出到文…

传统MySQL+ Memcached架构遇到的问题

实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题: MySQ…