利用auto_explain查看sql、procedure、function实时执行计划

这篇具有很好参考价值的文章主要介绍了利用auto_explain查看sql、procedure、function实时执行计划。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.简介

postgresql中,利用explain 结合一些选项,如analyze、buffers等命令查看sql语句执行计划在一般场景下已经足够,但是基于如下原因,auto_explain将是一个强有力的补充:

1.1 实时的执行计划

鉴于pg优化器的复杂性,以及柱状图不同值数据的分布,sql不总是按照我们使用explain工具看到的执行计划执行

1.2 查看procedure、function的执行计划

对于procedure/function执行计划的分析,通常我们可以raise notice查看各个sql的时间,也可以使用explain一段一段的查看执行计划,但是在procedure/function中往往有者复杂的写法,如for loop循环,要查看这些执行情况变得相当不容易
我们今天将仅演示auto_explain的使用,细节将可以查看postgresql官方文档auto_explain

2.load auto_explain

auto_explain是一个session级的library,可以在使用时动态加载

set session_preload_libraries to auto_explain
load  'auto_explain'

3.相关参数设定

参数具体含义可参考官方文档

set auto_explain.sample_rate = 1
set auto_explain.log_min_duration = 0
set auto_explain.log_analyze = true 
set auto_explain.log_nested_statements to on

4.创建测试表

测试表t1

create table t1 (id bigint)

测试表t2

create table t2 (id bigint)
insert into t2 values(generate_series(1,10000))
create index idx_t2_id on t2(id)

5.测试用的function

create or replace function pro_test1()
returns record
LANGUAGE 'plpgsql'
as $body$
declare
v_num int :=1;
sfc record;
begin 
delete from t1;
for sfc in (select id from t2 where id >9997)
loop
insert into t1(id) select * from t2 where sfc.id=t2.id;
end loop;
return sfc;
end;
$body$;

6.运行测试function

select pro_test1()

7.查看执行过程

2023-06-27 13:53:42.728 WIB,"dbas","pccwms502Zdb",105829,"172.19.6.187:1032",649a5d9e.19d65,15056,"SELECT",2023-06-27 10:55:10 WIB,43/1567572,840415340,LOG,00000,"duration: 0.048 ms  plan:
Query Text: delete from t1
Delete on t1  (cost=0.00..1.05 rows=5 width=6) (actual rows=0 loops=1)
  ->  Seq Scan on t1  (cost=0.00..1.05 rows=5 width=6) (actual rows=5 loops=1)",,,,,"SQL statement ""delete from t1""
PL/pgSQL function pro_test1() line 6 at SQL statement",,,,"pgAdmin 4 - CONN:3952426"
2023-06-27 13:53:42.728 WIB,"dbas","pccwms502Zdb",105829,"172.19.6.187:1032",649a5d9e.19d65,15057,"SELECT",2023-06-27 10:55:10 WIB,43/1567572,840415340,LOG,00000,"duration: 0.019 ms  plan:
Query Text: insert into t1(id) select * from t2 where sfc.id=t2.id
Insert on t1  (cost=0.29..4.31 rows=1 width=4) (actual rows=0 loops=1)
  ->  Index Only Scan using idx_t2_id on t2  (cost=0.29..4.31 rows=1 width=4) (actual rows=1 loops=1)
        Index Cond: (id = $4)
        Heap Fetches: 0",,,,,"SQL statement ""insert into t1(id) select * from t2 where sfc.id=t2.id""
PL/pgSQL function pro_test1() line 11 at SQL statement",,,,"pgAdmin 4 - CONN:3952426"
2023-06-27 13:53:42.728 WIB,"dbas","pccwms502Zdb",105829,"172.19.6.187:1032",649a5d9e.19d65,15058,"SELECT",2023-06-27 10:55:10 WIB,43/1567572,840415340,LOG,00000,"duration: 0.009 ms  plan:
Query Text: insert into t1(id) select * from t2 where sfc.id=t2.id
Insert on t1  (cost=0.29..4.31 rows=1 width=4) (actual rows=0 loops=1)
  ->  Index Only Scan using idx_t2_id on t2  (cost=0.29..4.31 rows=1 width=4) (actual rows=1 loops=1)
        Index Cond: (id = $4)
        Heap Fetches: 0",,,,,"SQL statement ""insert into t1(id) select * from t2 where sfc.id=t2.id""
PL/pgSQL function pro_test1() line 11 at SQL statement",,,,"pgAdmin 4 - CONN:3952426"
2023-06-27 13:53:42.728 WIB,"dbas","pccwms502Zdb",105829,"172.19.6.187:1032",649a5d9e.19d65,15059,"SELECT",2023-06-27 10:55:10 WIB,43/1567572,840415340,LOG,00000,"duration: 0.007 ms  plan:
Query Text: insert into t1(id) select * from t2 where sfc.id=t2.id
Insert on t1  (cost=0.29..4.31 rows=1 width=4) (actual rows=0 loops=1)
  ->  Index Only Scan using idx_t2_id on t2  (cost=0.29..4.31 rows=1 width=4) (actual rows=1 loops=1)
        Index Cond: (id = $4)
        Heap Fetches: 0",,,,,"SQL statement ""insert into t1(id) select * from t2 where sfc.id=t2.id""
PL/pgSQL function pro_test1() line 11 at SQL statement",,,,"pgAdmin 4 - CONN:3952426"
2023-06-27 13:53:42.729 WIB,"dbas","pccwms502Zdb",105829,"172.19.6.187:1032",649a5d9e.19d65,15060,"SELECT",2023-06-27 10:55:10 WIB,43/1567572,840415340,LOG,00000,"duration: 0.010 ms  plan:
Query Text: (select id from t2 where id >9997)
Index Only Scan using idx_t2_id on t2  (cost=0.29..4.34 rows=3 width=8) (actual rows=3 loops=1)
  Index Cond: (id > 9997)
  Heap Fetches: 0",,,,,"PL/pgSQL function pro_test1() line 8 at FOR over SELECT rows",,,,"pgAdmin 4 - CONN:3952426"
2023-06-27 13:53:42.729 WIB,"dbas","pccwms502Zdb",105829,"172.19.6.187:1032",649a5d9e.19d65,15061,"SELECT",2023-06-27 10:55:10 WIB,43/1567572,840415340,LOG,00000,"duration: 1.075 ms  plan:
Query Text: select pro_test1()
Result  (cost=0.00..0.26 rows=1 width=32) (actual rows=1 loops=1)",,,,,,,,,"pgAdmin 4 - CONN:3952426"

这里,可以看到输出的完整执行计划,甚至每一个for循环的执行计划都有记录下来,这对我们查看复杂sql的执行计划非常的有帮助文章来源地址https://www.toymoban.com/news/detail-526930.html

8.关闭auto_explain

set autoexplain.log_min_duration to -1

到了这里,关于利用auto_explain查看sql、procedure、function实时执行计划的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HiveSQL执行计划查看(EXPLAIN)

    Hive是一个基于Hadoop的数据仓库工具,通过SQL语言对分布式数据进行处理。在Hive中,执行计划是指查询语句的执行过程,包括查询语句的优化、查询计划生成和查询执行。对于HiveSQL的执行计划可以通过EXPLAIN命令进行查看。本文将为大家介绍HiveSQL执行计划的相关内容。 EXPLAI

    2024年02月16日
    浏览(25)
  • ClickHouse查看执行计划(EXPLAIN语法)

    EXPLAIN [AST | SYNTAX | QUERY TREE | PLAN | PIPELINE | ESTIMATE | TABLE OVERRIDE] [setting = value, ...]     [       SELECT ... |       tableFunction(...) [COLUMNS (...)] [ORDER BY ...] [PARTITION BY ...] [PRIMARY KEY] [SAMPLE BY ...] [TTL ...]     ]     [FORMAT ...] 查询计划的类型说明:  AST(抽象语法树):在AST级别优化之后的查

    2024年02月13日
    浏览(28)
  • 如何使用 Explain 分析 SQL 语句?

    MySQL中 EXPLAIN 命令是我们分析和优化SQL语句的利器。 如何使用 EXPLAIN 来分析SQL语句,接下来有15个例子,一起学习呗 本文已收录于,我的技术网站 ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享 EXPLAIN 可以用于分析MySQL如何执行一个SQL查询,包括如何选择

    2024年01月16日
    浏览(32)
  • SQL优化之EXPLAIN执行计划

    从今天开始本系列文章就带各位小伙伴学习数据库技术。 数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。本系列教程由浅入深, 全面讲解数据库体系。 非常适合零基础的小伙伴来学习。 全文大约 【1965】字 ,不说废话,只讲可以让你学到技术、明

    2024年02月07日
    浏览(43)
  • sql中的explain关键字用法

    在SQL中,使用 EXPLAIN 可以获取查询的执行计划,以便进行性能优化和查询调优。执行计划提供了关于查询操作的详细信息,涵盖了多个表头字段,每个字段都提供了特定的信息。以下是explain表头字段解释: id :每个操作的唯一标识符。这个字段通常是一个递增的整数

    2024年01月18日
    浏览(31)
  • Mysql的SQL性能分析【借助EXPLAIN分析】

    要说sql有问题,需要拿出证据,因此需要性能分析 Mysql中有专门负责优化SELECT语句的优化器模块,主要功能:通过计算分析系统中收集到的统计信息,为客户端请求的Query提供他认为最优的执行计划(它认为最优的数据检索方式,不见得是DBA认为是最优的,这部分最耗费时间,

    2024年02月12日
    浏览(54)
  • 玩转MySQL之SQL优化之EXPLAIN执行计划

    从今天开始本系列文章就带各位小伙伴学习数据库技术。 数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。本系列教程由浅入深, 全面讲解数据库体系。 非常适合零基础的小伙伴来学习。 全文大约 【1965】字 ,不说废话,只讲可以让你学到技术、明

    2024年02月08日
    浏览(31)
  • 【MYSQL高级】Mysql的SQL性能分析【借助EXPLAIN分析】

    要说sql有问题,需要拿出证据,因此需要性能分析 Mysql中有专门负责优化SELECT语句的优化器模块,主要功能:通过计算分析系统中收集到的统计信息,为客户端请求的Query提供他认为最优的执行计划(它认为最优的数据检索方式,不见得是DBA认为是最优的,这部分最耗费时间,

    2024年02月15日
    浏览(45)
  • MySQL索引3——Explain关键字和索引优化(SQL提示、索引失效、索引使用规则)

    目录 Explain 索引性能分析 Id ——select的查询序列号 Select_type——select查询的类型 Table——表名称 Type——select的连接类型 Possible_key ——显示可能应用在这张表的索引 Key——实际用到的索引 Key_len——实际索引使用到的字节数 Ref    ——索引命中的列或常量 Rows——预

    2024年02月14日
    浏览(40)
  • MySQL索引3——Explain关键字和索引使用规则(SQL提示、索引失效、最左前缀法则)

    目录 Explain 索引性能分析 Id ——select的查询序列号 Select_type——select查询的类型 Table——表名称 Type——select的连接类型 Possible_key ——显示可能应用在这张表的索引 Key——实际用到的索引 Key_len——实际索引使用到的字节数 Ref    ——索引命中的列或常量 Rows——预

    2024年02月14日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包