PostgreSQL的prepare 和 execute 动作背后

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介:

我给PostgreSQL的源代码加入了调试信息以后,会有如下表现:

我执行Prepare:

postgres=# prepare s(int) as select * from tst01 t where id < $1;
PREPARE
postgres=# 

背后的反应:

复制代码
** In PostgresMain 
In exec_simple_query loop for parsetree_list++++++++++++++++++++++++++Before pg_plan_queries
***************In pg_plan_queries -------start
................In pg_plan_queries...query->commandType == CMD_UTILITY
***************In pg_plan_queries -------end
In exec_simple_query loop for parsetree_list++++++++++++++++++++++++++After pg_plan_queries

...In exec_simple_query....Before PortalRun
.....In PortalRun ------------start
.......In PortalRunUtility ---------------start
.........In ProcessUtility----Start
.........In ProcessUtility----End
.......In PortalRunUtility ---------------end
.....In PortalRun ------------end
...In exec_simple_query....After PortalRun
复制代码

接着执行 Execute:

复制代码
postgres=# execute s(2);
 id 
----
1
(1 row)

postgres=# 
复制代码

背后的反应:

复制代码
In exec_simple_query loop for parsetree_list++++++++++++++++++++++++++Before pg_plan_queries
***************In pg_plan_queries -------start
................In pg_plan_queries...query->commandType == CMD_UTILITY
***************In pg_plan_queries -------end
In exec_simple_query loop for parsetree_list++++++++++++++++++++++++++After pg_plan_queries


...In exec_simple_query....Before PortalRun
.....In PortalRun ------------start
xxxxxxIn FillPortalStore ...........start
.......In PortalRunUtility ---------------start
.........In ProcessUtility----Start
..........In standard_ProcessUtility ... Before ExecuteQuery 
xxxxxxxxxxxIn ExecuteQuery--------start
++++++++++++In GetCachedPlan ........start
.............In BuildCachedPlan, Before pg_plan_queries 
***************In pg_plan_queries -------start
................In pg_plan_queries...query->commandType != CMD_UTILITY
..................In pg_plan_query........start
*******************In planner ........start
___________________In standard_planner........start
********************In subquery_planner........start
++++++++++++++++++++++In grouping_planner......start
************************In query_planner......start
........................In make_one_rel......start
...........................In set_base_rel_pathlists......start
-----------------------------In set_rel_pathlist......start
******************************In set_plain_rel_pathlist......start
-------------------------------Before add_path of seqscan
-------------------------------After add_path of seqscan

-------------------------------Before create_index_paths
-------------------------------After create_index_path

-------------------------------Before create_tidscan_paths
-------------------------------After create_tidscan_paths

-------------------------------Before set_cheapest
-------------------------------After set_cheapest

******************************In set_plain_rel_pathlist......end
-----------------------------In set_rel_pathlist......end
...........................In set_base_rel_pathlists......end
........................In make_one_rel......end
************************In query_planner......end
++++++++++++++++++++++In grouping_planner......end
********************In subquery_planner........end
___________________In standard_planner........end
*******************In planner ........end
..................In pg_plan_query........end
***************In pg_plan_queries -------end
.............In BuildCachedPlan, After pg_plan_queries 
++++++++++++In GetCachedPlan ........end

.....In PortalRun ------------start
.....In PortalRun ------------end
xxxxxxxxxxxIn ExecuteQuery--------end
..........In standard_ProcessUtility ... After ExecuteQuery 
.........In ProcessUtility----End
.......In PortalRunUtility ---------------end
xxxxxxIn FillPortalStore ...........end
.....In PortalRun ------------end
...In exec_simple_query....After PortalRun
复制代码

按照对过去版本的认识,应当是PortalRun的时候单纯执行计划。

但是preapre....execute 方式,把它破坏了。

可以看到,prepare时候,不进行path的生成。

execute 的时候,在PortalRun的阶段,通过 ExecuteQuery->GetCachedPlan->BuildCachedPlan,

来生成path和确定plan。

不过要注意到一点是,我所执行的上述的例子中,并没有导致 param_info 非空。

可以说,这种针对单一表的preapre execute,是把执行计划的生成推后了,但是并不等于它就是 Parameterized Path。






本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/p/3144475.html,如需转载请自行联系原作者


相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
2月前
|
SQL 存储 关系型数据库
MySQL(终结篇二)- SQL 语句分析与优化
MySQL(终结篇二)- SQL 语句分析与优化
87 0
|
SQL
SQLServer 学习笔记之超详细基础SQL语句 Part 12(The End)
SQLServer 学习笔记之超详细基础SQL语句 Part 12(The End)
41 0
|
存储 SQL 缓存
MySQL逻辑架构 - SQL语句的执行都经历了哪些步骤
大体来说,MySQL 可以分为 Server层 和 存储引擎层两部分。 Server 层包括连接器、查询缓存、分析器、优化器、执行器,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能也在这一层实现,包括 存储过程、触发器、视图等。 存储引擎层负责数据的存储和提取。包括 MySQL 常见的存储引擎,包括 MyISAM、InnoDB 和 Memory 等,最常用的是 InnoDB,也是现在 MySQL 的默认存储引擎。 存储引擎也可以在创建表的时候手动指定,使用如下语句:
MySQL逻辑架构 - SQL语句的执行都经历了哪些步骤
|
SQL 存储 缓存
MySQL的SQL执行背后隐藏了什么
MySQL的SQL执行背后隐藏了什么
129 0
|
存储 SQL 缓存
一条SQL执行的完整流程解析 - 《从0到1-全面深刻理解MySQL系列-第四篇》
一条SQL执行的完整流程解析 - 《从0到1-全面深刻理解MySQL系列-第四篇》
221 0
一条SQL执行的完整流程解析 - 《从0到1-全面深刻理解MySQL系列-第四篇》
|
SQL Java 关系型数据库
PolarDB-X 1.0-SQL 手册-Prepare SQL-Prepare 协议使用说明
Prepare 协议介绍 PolarDB-X提供对服务器端预处理语句的支持,支持利用高效的客户端/服务器二进制协议。使用准备好的语句和占位符来获取参数值具有以下好处: 每次执行时解析语句的开销都较小。通常情况下,数据库应用程序处理大量几乎相同的语句,只改变 Prepare 语句中的变量值,这样可以大幅度提升 SQL 执行效率。 防止 SQL 注入攻击。
188 0
|
SQL 消息中间件 存储
【DB吐槽大会】第33期 - PG 逻辑复制不支持DDL
大家好,这里是DB吐槽大会,第33期 - PG 逻辑复制不支持DDL
|
SQL 分布式计算 并行计算
PostgreSQL 并行计算解说 之7 - parallel create index
标签 PostgreSQL , cpu 并行 , smp 并行 , 并行计算 , gpu 并行 , 并行过程支持 背景 PostgreSQL 11 优化器已经支持了非常多场合的并行。简单估计,已支持27余种场景的并行计算。 parallel seq scan parallel index scan
398 0
|
SQL 关系型数据库 PostgreSQL
PostgreSQL技术周刊第13期:PSQL新增变量记录SQL语句的执行情况和错误
PostgreSQL(简称PG)的开发者们:云栖社区已有5000位PG开发者,发布了3000+PG文章(文章列表),沉淀了700+的PG精品问答(问答列表)。 PostgreSQL技术周刊会为大家介绍最新的PG技术与动态、预告活动、最热问答、直播教程等,欢迎大家订阅PostgreSQL技术周刊。
2874 0