PostgreSql explain 三观正,挺好用

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

PostgreSql explain 三观正,挺好用

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

回到postgresql

PostgreSql explain 三观正,挺好用

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

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

PostgreSql explain 三观正,挺好用

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

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

PostgreSql explain 三观正,挺好用

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

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

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

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

PostgreSql explain 三观正,挺好用

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

PostgreSql explain 三观正,挺好用

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

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

PostgreSql explain 三观正,挺好用

PostgreSql explain 三观正,挺好用

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

PostgreSql explain 三观正,挺好用

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

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

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

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

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

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

PostgreSql explain 三观正,挺好用

PostgreSql explain 三观正,挺好用

PostgreSql explain 三观正,挺好用

PostgreSql explain 三观正,挺好用

相关文章:

  • 2021-08-11
  • 2022-02-05
  • 2022-01-13
  • 2022-02-16
  • 2021-10-18
  • 2021-06-11
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-06-03
  • 2017-12-14
  • 2021-09-18
  • 2022-12-23
  • 2022-02-09
  • 2021-06-17
相关资源
相似解决方案