当我们在PostgreSQL中分析一些历史的SQL问题时,常常看到的SQL都是带有绑定变量的。而对pg,我们没法像Oracle一样通过例如dba_hist_sqlbind之类的视图去获得历史的绑定变量值。不但如此,对这些带有绑定变量的SQL,我们乃至没法像在Oracle中一样获得一个预估的履行计划。
在pg中使用explain去履行则会报错:
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语句来实现想要的功能。
例如:
PREPARE
可以看到上面的SQL有两个变量,那末我们在不知道变量的情况下怎样去获得履行计划呢?
可以用null,由于这适用于任何数据类型。
但事实常常没有那末乐观:
QUERY PLAN
——————————————
Result (cost=0.00..0.00 rows=0 width=0)
One-Time Filter: false
(2 rows)
可以看到优化器十分聪明,知道查询的结果中没有行,乃至都不去扫描表了。对这类情况,我们只需要履行5次,让其生成generic plan。
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来控制就好。
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=# 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内容请搜索之前的文章或继续浏览下面的相关文章希望大家以后多多支持!
本文来源:https://www.yuntue.com/post/152491.html | 云服务器网,转载请注明出处!

微信扫一扫打赏
支付宝扫一扫打赏