前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PostgreSql explain 三观正,挺好用

PostgreSql explain 三观正,挺好用

作者头像
AustinDatabases
发布2020-05-12 10:34:53
5350
发布2020-05-12 10:34:53
举报
文章被收录于专栏:AustinDatabasesAustinDatabases

查看数据库中执行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 等都是默认打开的。

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档