关于PostgreSQL的简单查询和扩展查询协议

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 简单查询和扩展查询是PG前端和后端交互的时候,2种不同交互方法。简单查询时,前端发一个包含SQL的包过去,后端执行后返回结果。扩展查询则是把简单查询切分成Parse,Bind,Describe,Execute,Close等几个步骤,以达到执行计划复用的目的。
简单查询和扩展查询是PG前端和后端交互的时候,2种不同交互方法。简单查询时,前端发一个包含SQL的包过去,后端执行后返回结果。扩展查询则是把简单查询切分成Parse,Bind,Describe,Execute,Close等几个步骤,以达到执行计划复用的目的。扩展查询还有防止SQL注入,减少通信数据量(使用binary形式传参)的效果。

更详细的描述,可参考手册:
http://58.58.27.50:8079/doc/html/9.3.1_zh/protocol-flow.html#AEN98678


下面是服务端处理简单查询和扩展查询的代码概要

1.简单查询

点击( 此处 )折叠或打开
  1. exec_simple_query(const char *query_string)
  2.  ->parsetree_list = pg_parse_query(query_string);
  3.  ->foreach(parsetree_item, parsetree_list)
  4.       ->querytree_list = pg_analyze_and_rewrite(parsetree, query_string,NULL, 0);
  5.       ->plantree_list = pg_plan_queries(querytree_list, 0, NULL);
  6.       ->portal = CreatePortal("", true, true);
  7.       ->PortalDefineQuery(portal,NULL,query_string,commandTag,plantree_list,NULL);
  8.       ->PortalStart(portal, NULL, 0, InvalidSnapshot);
  9.       ->PortalRun(portal,FETCH_ALL,isTopLevel,receiver,receiver,completionTag);
  10.       ->PortalDrop(portal, false);

2.扩展查询

parse消息的处理(命名语句):

点击(此处)折叠或打开

  1. exec_parse_message(const char *query_string,const char *stmt_name,Oid *paramTypes,int numParams)
  2.       ->parsetree_list = pg_parse_query(query_string);
  3.       ->raw_parse_tree = (Node *) linitial(parsetree_list);
  4.       ->psrc = CreateCachedPlan(raw_parse_tree, query_string, commandTag);
  5.       ->query = parse_analyze_varparams(raw_parse_tree,query_string,&paramTypes,&numParams);
  6.       ->querytree_list = pg_rewrite_query(query);
  7.       ->CompleteCachedPlan(psrc,querytree_list,unnamed_stmt_context,paramTypes,numParams,NULL,NULL,0,true);
  8.       ->StorePreparedStatement(stmt_name, psrc, false);

bind消息的处理:

点击(此处)折叠或打开

  1. exec_bind_message(StringInfo input_message)
  2.       ->portal_name = pq_getmsgstring(input_message);
  3.       ->stmt_name = pq_getmsgstring(input_message);
  4.       ->pstmt = FetchPreparedStatement(stmt_name, true);
  5.       ->psrc = pstmt->plansource;
  6.       ->cplan = GetCachedPlan(psrc, params, false);
  7.       ->portal = CreatePortal(portal_name, true, true);
  8.       ->PortalDefineQuery(portal,saved_stmt_name,query_string,psrc->commandTag,cplan->stmt_list,cplan);
  9.       ->PortalStart(portal, params, 0, InvalidSnapshot);
GetCachedPlan()会决定新创建一个定制的执行计划还是使用之前保存的通用的执行计划。

execute消息的处理:

点击(此处)折叠或打开

  1. exec_execute_message(const char *portal_name, long max_rows)
  2.       ->portal = GetPortalByName(portal_name);
  3.       ->completed = PortalRun(portal,max_rows,true,receiver,receiver,completionTag);

close消息的处理:

点击(此处)折叠或打开

  1. PostgresMain(int argc, char *argv[],const char *dbname,const char *username)
  2.   case 'C':
  3.       ->DropPreparedStatement(close_target, false);
  4.       or
  5.       ->PortalDrop(portal, false);

3.参考

http://58.58.27.50:8079/doc/html/9.3.1_zh/protocol-flow.html#AEN98678
http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=20726500&id=4150218
src/backend/tcop/postgres.c

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
7月前
|
存储 关系型数据库 数据库
postgresql|数据库|提升查询性能的物化视图解析
postgresql|数据库|提升查询性能的物化视图解析
743 0
|
1月前
|
SQL 关系型数据库 数据库
PostgreSQL性能飙升的秘密:这几个调优技巧让你的数据库查询速度翻倍!
【10月更文挑战第25天】本文介绍了几种有效提升 PostgreSQL 数据库查询效率的方法,包括索引优化、查询优化、配置优化和硬件优化。通过合理设计索引、编写高效 SQL 查询、调整配置参数和选择合适硬件,可以显著提高数据库性能。
364 1
|
3月前
|
SQL 关系型数据库 C语言
PostgreSQL SQL扩展 ---- C语言函数(三)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
|
4月前
|
缓存 关系型数据库 数据库
PostgreSQL 查询性能
【8月更文挑战第5天】PostgreSQL 查询性能
88 8
|
6月前
|
SQL 关系型数据库 数据库
Python执行PostgreSQL数据库查询语句,并打印查询结果
本文介绍了如何使用Python连接和查询PostgreSQL数据库。首先,确保安装了`psycopg2`库,然后创建数据库连接函数。接着,展示如何编写SQL查询并执行,例如从`employees`表中选取所有记录。此外,还讨论了处理查询结果、格式化输出和异常处理的方法。最后,提到了参数化查询和事务处理以增强安全性及确保数据一致性。
Python执行PostgreSQL数据库查询语句,并打印查询结果
|
5月前
|
Java 关系型数据库 API
使用Spring Boot和PostgreSQL构建高级查询
使用Spring Boot和PostgreSQL构建高级查询
|
关系型数据库 PostgreSQL
PostgreSQL pg_orphaned扩展
由于种种原因,PostgreSQL可能会产生一些孤儿文件,这些文件会占用磁盘空间,手工查找费时费力还容易出错,pg_orphaned扩展很好的解决了这个问题。
|
6月前
|
SQL 关系型数据库 数据库
Python查询PostgreSQL数据库
木头左教你如何用Python连接PostgreSQL数据库:安装`psycopg2`库,建立连接,执行SQL脚本如创建表、插入数据,同时掌握错误处理和事务管理。别忘了性能优化,利用索引、批量操作提升效率。下期更精彩!💡 csvfile
Python查询PostgreSQL数据库
|
7月前
|
SQL 人工智能 Oracle
PostgreSQL 递归查询(含层级和结构)
PostgreSQL 递归查询(含层级和结构)
|
7月前
|
SQL 关系型数据库 数据库
SQL 42501: Postgresql查询中的权限不足错误
SQL 42501: Postgresql查询中的权限不足错误
491 0