今天我们要探讨的是custom执行计划和通用执行计划。这一技术在Oracle中被称为绑定变量窥视。但Postgresql中并没有这样的定义,更严格地说,Postgresql叫做custom执行计划和通用执行计划
当我们在PostgreSQL中分析一些历史的SQL问题时,往往看到的SQL都是带有绑定变量的。而对于pg,我们没法像Oracle一样通过例如dba_hist_sqlbind之类的视图去获取历史的绑定变量值。不仅如此,对于这些带有绑定变量的SQL,我们甚至没法像在Oracle中一样获取一个预估的执行计划。
在pg中使用explain去执行则会报错:
bill=# explain select * from t1 where id = $1 and info = $2;
ERROR: there is no parameter $1
LINE 1: explain select * from t1 where id = $1 and info = $2;
我们似乎只能去通过带入值去获取相应的执行计划了,这对于那些绑定变量很多的SQL来说无疑是十分繁琐的。那有没有什么方法能像Oracle中那样,即使是有绑定变量的SQL,在plsql developer中一个F5就显示了预估的执行计划呢?
我们可以使用prepare语句来实现想要的功能。
例如:
bill=# prepare p1 as select * from t1 where id = $1 and info = $2;
PREPARE
可以看到上面的SQL有两个变量,那么我们在不知道变量的情况下怎么去获取执行计划呢?
可以用null,因为这适用于任何数据类型。
但事实往往没有那么乐观:
bill=# explain execute p1(null,null);
QUERY PLAN
------------------------------------------
Result (cost=0.00..0.00 rows=0 width=0)
One-Time Filter: false
(2 rows)
可以看到优化器十分聪明,知道查询的结果中没有行,甚至都不去扫描表了。对于这种情况,我们只需要执行5次,让其生成generic plan。
bill=# explain execute p1(null,null);
QUERY PLAN
-------------------------------------------------------------------
Index Scan using t1_pkey on t1 (cost=0.15..2.77 rows=1 width=36)
Index Cond: (id = $1)
Filter: (info = $2)
(3 rows)
当然,如果你的版本是pg12之后的,那么就没必要这么麻烦了,直接设置plan_cache_mode来控制就好。
bill=# prepare p1 as select * from t1 where id =$1 and info = $2;
PREPARE
bill=# set plan_cache_mode = force_generic_plan;
SET
bill=# explain execute p1(null,null);
QUERY PLAN
-------------------------------------------------------------------
Index Scan using t1_pkey on t1 (cost=0.15..2.77 rows=1 width=36)
Index Cond: (id = $1)
Filter: (info = $2)
(3 rows)
如果你的版本是pg12之前的,那么只能执行5次然后等到第6次生成通用的执行计划了。当然还有点需要注意的,如果估计成本高于先前执行的平均成本时就不会选择通用计划了,所以我们可以人为的控制前5次的平均成本,让其达到一个很高的值,这一点我们可以增加cpu_operator_cost的值来实现。
bill=# prepare p1 as select * from t1 where id =$1 and info = $2;
bill=# set local cpu_operator_cost=999999; --设置成一个很大的值
bill=# explain execute p1(null,null);
bill=# explain execute p1(null,null);
bill=# explain execute p1(null,null);
bill=# explain execute p1(null,null);
bill=# explain execute p1(null,null);
bill=# explain execute p1(null,null); --生成通用执行计划
到此这篇关于PostgreSQL查看带有绑定变量SQL的通用方法详解的文章就介绍到这了,更多相关PostgreSQL绑定变量SQL内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:PostgreSQL查看带有绑定变量SQL的通用方法详解
- Numpy中如何创建矩阵并等间隔抽取数据 2023-07-28
- Oracle 删除大量表记录操作分析总结 2023-07-23
- redis清除数据 2023-09-13
- SQLSERVER调用C#的代码实现 2023-07-29
- Mongodb启动报错完美解决方案:about to fork child process,waiting until server is ready for connections. 2023-07-16
- 在阿里云CentOS 6.8上安装Redis 2023-09-12
- 基于Python制作一个简单的文章搜索工具 2023-07-28
- SQL Server 2022 AlwaysOn新特性之包含可用性组详解 2023-07-29
- 搭建单机Redis缓存服务的实现 2023-07-13
- MySQL8.0.28安装教程详细图解(windows 64位) 2023-07-26