PostgreSql explain 三观正,挺好用

2020-05-12 10:34:53 浏览数 (1)

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

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

0 人点赞