PostgreSQL查看带有绑定变量SQL的通用方法详解

 更新时间:2022年09月16日 10:12:27   作者:foucus、  
今天我们要探讨的是 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数据添加两个字段联合唯一的操作

    postgresql数据添加两个字段联合唯一的操作

    这篇文章主要介绍了postgresql数据添加两个字段联合唯一的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • PostgreSQL查询修改max_connections(最大连接数)及其它配置详解

    PostgreSQL查询修改max_connections(最大连接数)及其它配置详解

    postgresql数据库最大连接数是系统允许的最大连接数,当数据库并发用户超过该连接数后,会导致新连接无法建立或者连接超时,这篇文章主要给大家介绍了关于PostgreSQL查询修改max_connections(最大连接数)及其它配置的相关资料,需要的朋友可以参考下
    2024-01-01
  • 详解如何在Ubuntu 18.04上安装和使用PostgreSQL

    详解如何在Ubuntu 18.04上安装和使用PostgreSQL

    关系数据库管理系统是许多网站和应用程序的关键组件,它们提供了一种结构化的方式来存储、组织和访问信息,本文演示了如何在 Ubuntu 18.04 VPS 实例上安装 Postgres,并提供了基本数据库管理的说明,需要的朋友可以参考下
    2024-07-07
  • postgreSQL 非count方法算记录数操作

    postgreSQL 非count方法算记录数操作

    这篇文章主要介绍了postgreSQL 非count方法算记录数操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • PostgreSQL 重复数据处理的操作方法

    PostgreSQL 重复数据处理的操作方法

    这篇文章主要介绍了PostgreSQL 重复数据处理的操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • postgresql影子用户实践场景分析

    postgresql影子用户实践场景分析

    这篇文章主要介绍了postgresql影子用户实践场景分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • PostgreSQL之INDEX 索引详解

    PostgreSQL之INDEX 索引详解

    这篇文章主要介绍了PostgreSQL之INDEX 索引详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • PostgreSQL处理时间段、时长转为秒、分、小时代码示例

    PostgreSQL处理时间段、时长转为秒、分、小时代码示例

    最近在操作数据库时,遇到频繁的时间操作,每次弄完了就忘了,今天痛定思痛,下定决心对postgres的时间操作进行一下总结,这篇文章主要给大家介绍了关于PostgreSQL处理时间段、时长转为秒、分、小时的相关资料,需要的朋友可以参考下
    2023-10-10
  • Windows 系统 PostgreSQL 手工安装配置方法

    Windows 系统 PostgreSQL 手工安装配置方法

    这篇文章主要介绍了Windows 系统 PostgreSQL 手工安装配置方法,本文主要说一下在 Windows 系统中安装 PostgreSQL 的方法,我这里没有采用 exe 安装包的形式去安装,EDB 发布的那个 exe 安装包形式的对于中文环境数据库的排序规则设定有问题,需要的朋友可以参考下
    2022-09-09
  • postgresql13主从搭建Ubuntu

    postgresql13主从搭建Ubuntu

    这篇文章主要为大家介绍了postgresql13主从搭建Ubuntu实现过程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11

最新评论