开发者社区> 德哥> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

PostgreSQL 商用版本EPAS(阿里云ppas) 自定义custom plan次数

简介:
+关注继续查看

标签

PostgreSQL , 绑定变量 , custom plan , generic plan


背景

PostgreSQL 数据库与商用数据库Oracle一样,支持绑定变量,绑定变量的目的是降低SQL硬解析的性能开销。

使用绑定变量后,执行变成这样的流程,一次prepare,后面都只需要bind和execute:

prepare      
      
bind      
      
execute      

同时,prepare statement也降低了优化器的plan开销,流程这样:

前5次执行时,采样 custom plan(每次都需要根据SQL输入的变量,规划最佳plan tree),并增加custom plan次数计数,平均COST计数。

第六次开始,就会生成generic plan,也就是说后面不再主动重新规划最佳plan tree,而是使用plan cache,将变量代入plan cache,直接通过plan cache产生这次bind 变量计算得到的COST,这个COST与custom plan的平均COST对比,如果COST小于或等于custom plan COST的1.1倍,则使用这个plan tree执行。否则才会主动进行custom plan,并继续累加custom plan次数计数,平均COST计数。

原理详见:

《执行计划选择算法 与 绑定变量 - PostgreSQL prepared statement: SPI_prepare, prepare|execute COMMAND, PL/pgsql STYLE: custom & generic plan cache》

但是到底执行几次custom plan更好,这个不同的数据或和用户前几次调用有关,浙江直接导致后面的generic plan的选择和效率。

默认PostgreSQL是硬编码,5次,PostgreSQL 商用版本EPAS(阿里云ppas)允许用户自定义custom plan的次数。

PostgreSQL 商用版本EPAS(阿里云ppas),用户自定义custom plan的次数

edb_custom_plan_tries

你可以在会话层面设置edb_custom_plan_tries 参数,也可以在用户、库、实例 层面设置。

Parameter Type: Numeric

Default Value: 5

Range: {0 | 100}

Minimum Scope of Effect: Per session

When Value Changes Take Effect: Immediate

Required Authorization to Activate: Session User

This configuration parameter controls the number of custom execution plans considered by the planner before the planner settles on a generic execution plan.

When a client application repeatedly executes a prepared statement, the server may decide to evaluate several execution plans before deciding to choose a custom plan or a generic plan.

  • A custom plan is a plan built for a specific set of parameter values.

  • A generic plan is a plan that will work with any set of parameter values supplied by the client application.

By default, the optimizer will generate five custom plans before evaluating a generic plan. That means that if you execute a prepared statement six times, the optimizer will generate five custom plans, then one generic plan, and then decide whether to stick with the generic plan.

In certain workloads, this extra planning can have a negative impact on performance. You can adjust the edb_custom_plan_tries configuration parameter to decrease the number of custom plans considered before evaluating a generic plan. Setting edb_custom_plan_tries to 0 will effectively disable custom plan generation.

Consider the following query:

PREPARE custQuery AS SELECT * FROM customer WHERE salesman >= $1

The $1 token in this query is a parameter marker - the client application must provide a value for each parameter marker each time the statement executes.

If an index has been defined on customer.salesman, the optimizer may choose to execute this query using a sequential scan, or using an index scan. In some cases, an index is faster than a sequential scan; in other cases, the sequential scan will win. The optimal plan will depend on the distribution of salesman values in the table and on the search value (the value provided for the $1 parameter).

When the client application repeatedly executes the custQuery prepared statement, the optimizer will generate some number of parameter-value-specific execution plans (custom plans), followed by a generic plan (a plan that ignores the parameter values), and then decide whether to stick with the generic plan or to continue to generate custom plans for each execution. The decision process takes into account not only the cost of executing the plans, but the cost of generating custom plans as well.

参考

《执行计划选择算法 与 绑定变量 - PostgreSQL prepared statement: SPI_prepare, prepare|execute COMMAND, PL/pgsql STYLE: custom & generic plan cache》

《PostgreSQL 函数调试、诊断、优化 & auto_explain》

https://www.enterprisedb.com/docs/en/10.0/EPAS_Guide_v10/EDB_Postgres_Advanced_Server_Guide.1.27.html#pID0E0GNF0HA

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云数据库PolarDB for MySQL 接口调用指引
介绍使用阿里云OpenAPI调用方式实现对PolarDB数据库的集群管理功能的实现
28 0
阿里云DMS数据管理控制台通过钉钉机器人方式发送通知
本文简明介绍如何使用阿里云DMS数据管理控制台通过配置钉钉机器人方式发送通知。
153 0
阿里云ECS完美升级gcc版本基于CentOS8
阿里云ECS完美升级gcc版本基于CentOS8
726 0
自建MySQL和阿里云RDS的区别 有必要使用云数据库吗?
很多阿里云ECS用户都会考虑是使用ECS自建数据库还是使用阿里云的RDS云数据库,如何选择?有必要使用云数据库吗?云吞铺子告诉你使用阿里云RDS云数据库的理由: RDS的高可用性 RDS提供了主备双节点的实例,双节点可以在同一地域的不同可用区,MySQL实例的双节点还可以在不同地域,当主实例出现故障时可快速切换到备实例,保障了RDS的稳定性。
1817 0
自建MySQL和阿里云RDS的区别 有必要使用云数据库吗?
很多阿里云ECS用户都会考虑是使用ECS自建数据库还是使用阿里云的RDS云数据库,如何选择?有必要使用云数据库吗?云吞铺子告诉你使用阿里云RDS云数据库的理由: RDS的高可用性 RDS提供了主备双节点的实例,双节点可以在同一地域的不同可用区,MySQL实例的双节点还可以在不同地域,当主实例出现故障时可快速切换到备实例,保障了RDS的稳定性。
6077 0
阿里云大数据ACP认证知识点梳理3——产品特点(数据集成)
数据集成,是阿里集团对外提供的稳定高效、弹性伸缩的数据同步平台。致力于提供复杂网络环境下、丰富的异构数据源之间数据高速稳定的数据移动及同步能力。 数据集成提供丰富的数据源支持,如下所示: 文本存储(FTP / SFTP / OSS / 多媒体文件等)。
1611 0
+关注
德哥
公益是一辈子的事, I'm digoal, just do it.
2153
文章
245
问答
来源圈子
更多
让用户数据永远在线,让数据无缝的自由流动
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载