PostgreSql explain 三观正,挺好用

本文探讨PostgreSQL的EXPLAIN功能,解析SQL执行计划及成本评估。介绍如何使用analyze、verbose等参数获取详尽的执行信息,包括启动成本、扫描成本、数据来源等,以及如何将执行计划转换为图形化展示。

查看数据库中执行SQL的执行计划,及相关信息是每个数据库都有的功能,PostgreSQL explain 的功能很丰富,下面就看看,这个explain 有什么过人之处。(以下均已pg 11作为演示版本)

首先从最简单的explain  来开始,显示的方式也是适用缩进的方式,目前四大家 (ORACLE ,SQL SERVER , POSTGRESQL , MYSQL 8.018)都采用了这样的方式显示执行计划(SQL SERVER 可以通过非图形化的方式来显示于此相同的执行计划, MYSQL 8 也是通过 explain format = tree 的方式来显示于此一样的执行计划)到此所有的数据库在文字显示执行计划的方式,算是可以在一个起跑线了。

回到postgresql

上面执行执行计划中的 cost=0.00 是启动成本,后面的 14.03 是扫描成本

rows 是扫描的行数是多少,而我们此次的成本中并不包含列的宽度。

在往上面看,聚合操作启动成本 15.54 行 1 行,列宽度8

这里顺便说一句,有些数据库早期,select count(*)  与 select count(主键) 性能可能不一样的情况在PG 不存在,可以看下面的列子。

上面只是简单的东西,explain 会有很多辅助的命令帮助

这里可能会有人问为什么要启动成本,我们可以想象我们在一辆汽车启动的时候,什么时候最费油,那一定是启动的时候,瞬时油耗可以变成 30 -40升百公里,这里的意思就是越少的启动成本,会让总体成本变得更小,并且如果我在查询中kill掉他,那启动成本就是我肯能消耗最大的一块,所以启动成本越少越好。

在实际中估算的成本可能是不准确的,因为很可能估算的成本和你实际运行的成本不一致,所以

explain analyze 可以让你的运行实际来一次,然后给你一个实际的成本

可以看上图,下图中红色位置

实际运行的时间,与cost 之间的对应关系也都会有,内存的使用率,并且实际上analyze的时间会比实际运行的时间还要长一些。

同时 POSTGRESQL 还可以告诉你实际上你的执行计划中有多少会读取到数据,数据从哪里来,下面有两张图,图1 告诉你 这个SQL 经常运行,数据已经不再从磁盘读取了。图二是,语句初次运行,有多少数据是从 share hit 内存中读取的,有多少是从磁盘上读取的。read = ?  这一点就已经比一大部分的数据库在 EXPLAIN 的表现要好的多了。

当然如果想还要更多明确,这个执行计划使用了那些字段,可以添加verbose,下图在每一段中都有添加 output 

EXPLAIN 中可以带的参数很多,个人觉得有用的有以下一些

Analyze 实际上你要实际运行SQL 并给出实际执行的结果

Verbose 将信息更加详细,括计划树中每个节点的输出列列表、模式限定表和函数名

Buffers 给出语句到底是读取数据的路径是 磁盘 还是 内存以及多少块被涉及

另外timming costs 等都是默认打开的。

当然你也可以将输出的格式进行变换,然后塞到上次说的那个网站,将执行计划已更详细的图形化的方式给你展现

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值