iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >PostgreSQL查看带有绑定变量SQL的通用方法详解
  • 394
分享到

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

2024-04-02 19:04:59 394人浏览 薄情痞子
摘要

当我们在postgresql中分析一些历史的sql问题时,往往看到的SQL都是带有绑定变量的。而对于pg,我们没法像oracle一样通过例如dba_hist_sqlbind之类的视图去获取历史的绑定变量值。不仅如此,对于

当我们在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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: PostgreSQL查看带有绑定变量SQL的通用方法详解

本文链接: https://www.lsjlt.com/news/34050.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • sql中如何通过v$sql_bind_capture查看绑定变量
    这篇文章将为大家详细讲解有关sql中如何通过v$sql_bind_capture查看绑定变量,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。最近在排查CRMG性能SQL的过程中,大量的SQL需要确定绑定变量...
    99+
    2023-06-06
  • sql查找未使用绑定变量的语句
    本篇内容主要讲解“sql查找未使用绑定变量的语句”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“sql查找未使用绑定变量的语句”吧!一、查找方法:从ORACLE1...
    99+
    2024-04-02
  • pycharm查看变量值的方法有哪些
    本篇内容介绍了“pycharm查看变量值的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!方法一:插入断点,Debug运行在欲查看变...
    99+
    2023-06-30
  • git用户自定义变量查看修改及调用的方法
    这篇文章主要介绍“git用户自定义变量查看修改及调用的方法”,在日常操作中,相信很多人在git用户自定义变量查看修改及调用的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”git用户自定义变量查看修改及调用...
    99+
    2023-06-30
  • Go语言变量的定义和使用方法详解
    Go语言变量的定义和使用方法详解 Go语言是一种静态类型的系统编程语言,它支持面向对象、过程式和函数式编程风格。在Go语言中,变量是用来存储数据的最基本的单元,它们可以存储各种数据类型...
    99+
    2024-04-02
  • git用户自定义变量查看修改及调用教程详解
    目录1、变量定义2、变量调用3、变量的修改4、查看变量(1)-u选项说明:(2)-x选项说明:(3)set命令说明:小结:5、变量删除1、变量定义 变量正确定义。 格式:变量名=&q...
    99+
    2024-04-02
  • Java不使用第三方变量交换两个变量值的四种方法详解
    目录变量本身交换数值算术运算指针地址操作位运算简单总结哈喽,大家好,我是阿Q。前几天有个小伙伴去面试,被面试官的一个问题劝退了:请说出几种不使用第三方变量交换两个变量值的方法。 问题...
    99+
    2024-04-02
  • Java带返回值的方法的定义和调用详解
    目录带返回值的方法练习方法的注意事项方法注意事项方法通用格式带返回值的方法练习 需求: 设计一个方法可以获取两个数的较大值,数据来自于参数 思路: 1. 定义一个方法,用于获取两个数...
    99+
    2024-04-02
  • PHP Session 变量的使用方法详解与实例代码
    当您运行一个应用程序时,您会打开它,做些更改,然后关闭它。这很像一次会话。计算机清楚你是谁。它知道你何时启动应用程序,并在何时终止。但是在因特网上,存在一个问题:服务器不知道你是谁以...
    99+
    2022-11-15
    PHP Session
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作