热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

怎样分析PostgreSQL的执行计划

借助工具分析执行计划,

经常有人问我如何看懂执行计划,如何才能抓住计划中的瓶颈点,要完全搞懂一个执行计划还是需要丰富的背景知识,但是对于测试或开发并没有完备的数据库知识,那么怎样看懂PostgreSQL的执行计划呢,这里介绍一个网站,以图形和数据分析的方式解释每个执行计划,小白也能轻松掌握,抓住瓶颈优化SQL。


构造测试数据

postgres=# SELECT version();
version
---------------------------------------------------------------------------------------------------------
PostgreSQL 13.3 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit
(1 row)
--创建100个班级
postgres=# CREATE TABLE t_class(classid INT,classname VARCHAR(30),createtime TIMESTAMP(0) NOT NULL DEFAULT NOW());
CREATE TABLE
postgres=# INSERT INTO t_class(classid,classname) SELECT t.id,'一年级' || t.id || '班' FROM (SELECT generate_series(1,100) AS id) t;
INSERT 0 100
--每个班级50个学生
postgres=# CREATE TABLE t_student(studnetid INT,studentname VARCHAR(30),classid INT,createtime TIMESTAMP(0) NOT NULL DEFAULT NOW());
CREATE TABLE
postgres=# INSERT INTO t_student(studnetid,studentname,classid)
postgres-# SELECT row_number() over(),substr(md5(random()::text),1,5),c.classid FROM t_class c,(SELECT generate_series(1,50) AS id) t;
INSERT 0 5000
postgres=# TABLE t_class LIMIT 10;
classid | classname | createtime
---------+------------+---------------------
1 | 一年级1班 | 2021-07-21 10:15:44
2 | 一年级2班 | 2021-07-21 10:15:44
3 | 一年级3班 | 2021-07-21 10:15:44
4 | 一年级4班 | 2021-07-21 10:15:44
5 | 一年级5班 | 2021-07-21 10:15:44
6 | 一年级6班 | 2021-07-21 10:15:44
7 | 一年级7班 | 2021-07-21 10:15:44
8 | 一年级8班 | 2021-07-21 10:15:44
9 | 一年级9班 | 2021-07-21 10:15:44
10 | 一年级10班 | 2021-07-21 10:15:44
(10 rows)
postgres=# TABLE t_student LIMIT 10;
studnetid | studentname | classid | createtime
-----------+-------------+---------+---------------------
1 | 9a443 | 1 | 2021-07-21 10:15:44
2 | 1fee5 | 1 | 2021-07-21 10:15:44
3 | 244dd | 1 | 2021-07-21 10:15:44
4 | 99fee | 1 | 2021-07-21 10:15:44
5 | aa69b | 1 | 2021-07-21 10:15:44
6 | a6b51 | 1 | 2021-07-21 10:15:44
7 | bec83 | 1 | 2021-07-21 10:15:44
8 | 084ef | 1 | 2021-07-21 10:15:44
9 | 8ceae | 1 | 2021-07-21 10:15:44
10 | e6827 | 1 | 2021-07-21 10:15:44
(10 rows)
postgres=# VACUUM ANALYZE t_class,t_student;
VACUUM
--生成JSON格式的计划
postgres=# EXPLAIN (ANALYZE, COSTS, VERBOSE, BUFFERS, FORMAT JSON)
postgres-# SELECT * FROM t_class c,t_student s WHERE c.classid = s.classid AND s.studentname = '8ceae';
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------
[ +
{ +
"Plan": { +
"Node Type": "Nested Loop", +
"Parallel Aware": false, +
"Join Type": "Inner", +
"Startup Cost": 0.00, +
"Total Cost": 97.75, +
"Plan Rows": 1, +
"Plan Width": 48, ...计划太长,此处省略一万字

分析执行计划

访问 https://explain.dalibo.com/ 网站,把以上生成的执行计划贴到此网站,提交即可

计划1.png

计划2.png

这里就可以看到图形化的执行计划了,页面信息非常丰富,应有尽有

计划21.png

计划22.png

可以点开各个节点展开详细信息(节点中的选项卡可以切换General\IO&Buffers\Output\Workers\Misc等)

计划3.png

这里是执行计划的文本信息

计划4.png

这里是查询语句

计划5.png

这个页面查看执行计划的统计信息,包括每个表的统计信息,节点统计信息,索引统计信息等,这里可以清晰的分析出性能的瓶颈,这里很明显顺序扫描t_student表时间占比达到了92%(1.28ms),在查询条件上面应该建一个索引

postgres=# CREATE INDEX idx_studentname_t_student ON t_student(studentname);
CREATE INDEX
postgres=# VACUUM ANALYZE t_student;
VACUUM

计划7.png

计划8.png

查看建索引后的执行计划,执行时间从1.38毫秒下降到了0.168毫秒,对t_student表的扫描占比下降到了21%(0.036ms)


总结

以上是个很简单的例子,不借助上面的网站也容易分析,但是如果对于那种成百上千行的SQL语句,即使是老司机文本分析也不是那么简单,有这么好的工具我们应该多加利用来提高生产力。



推荐阅读
  • PG12新增的VACUUM命令的SKIP_LOCKED选项
    PG12版本的VACUUM命令新增了SKIP_LOCKED选项,该选项使得vacuum命令在遇到被lock住的table时可以跳过并被视为成功执行。之前的版本中,vacuum命令会一直处于等待状态。本文还提到了PostgreSQL 12.1版本的相关信息。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 本文记录了作者对x265开源代码的实现与框架进行学习与探索的过程,包括x265的下载地址与参考资料,以及在Win7 32 bit PC、VS2010平台上的安装与配置步骤。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • LINUX学习之centos7营救模式
    今天卸载软件的时候,不小心把GNOME的一些组件给卸了,导致桌面无法正常开启,会卡在启动过程中,而我的开机启动模式又是设置为图形界面,所以一开LINUX就卡住了,进入不了命令行界面 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 花瓣|目标值_Compose 动画边学边做夏日彩虹
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Compose动画边学边做-夏日彩虹相关的知识,希望对你有一定的参考价值。引言Comp ... [详细]
author-avatar
卢军好2602912493
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有