PgSQL - EXPLAIN的使用

300 阅读3分钟

EXPLAIN 语法

EXPLAIN [ ( option [, ...] ) ] statement
EXPLAIN [ ANALYZE ] [ VERBOSE ] statement

where option can be one of:

    ANALYZE [ boolean ]
    VERBOSE [ boolean ]
    COSTS [ boolean ]
    BUFFERS [ boolean ]
    TIMING [ boolean ]
    SUMMARY [ boolean ]
    FORMAT { TEXT | XML | JSON | YAML }
  • ANALYZE 选项为TRUE 会实际执行SQL,并获得相应的查询计划,默认为FALSE。
  • VERBOSE 选项为TRUE 会显示查询计划的附加信息,默认为FALSE。附加信息包括查询计划中每个节点(后面具体解释节点的含义)输出的列(Output),表的SCHEMA 信息,函数的SCHEMA 信息,表达式中列所属表的别名,被触发的触发器名称等。
  • COSTS 选项为TRUE 会显示每个计划节点的预估启动代价(找到第一个符合条件的结果的代价)和总代价,以及预估行数和每行宽度,默认为TRUE。
  • BUFFERS 选项为TRUE 会显示关于缓存的使用信息,默认为FALSE。该参数只能与ANALYZE 参数一起使用。缓冲区信息包括共享块(常规表或者索引块)、本地块(临时表或者索引块)和临时块(排序或者哈希等涉及到的短期存在的数据块)的命中块数,更新块数,挤出块数。
  • TIMING 选项为TRUE 会显示每个计划节点的实际启动时间和总的执行时间,默认为TRUE。该参数只能与ANALYZE 参数一起使用。因为对于一些系统来说,获取系统时间需要比较大的代价,如果只需要准确的返回行数,而不需要准确的时间,可以把该参数关闭。
  • SUMMARY 选项为TRUE 会在查询计划后面输出总结信息,例如查询计划生成的时间和查询计划执行的时间。当ANALYZE 选项打开时,它默认为TRUE。
  • FORMAT 指定输出格式,默认为TEXT。各个格式输出的内容都是相同的,其中XML | JSON | YAML 更有利于我们通过程序解析SQL 语句的查询计划,为了更有利于阅读,我们下文的例子都是使用TEXT 格式的输出结果。

节点类型(暂时介绍这5个)

  • Seq Scan,顺序扫描
  • Index Scan,基于索引扫描,但不只是返回索引列的值
  • IndexOnly Scan,基于索引扫描,并且只返回索引列的值,简称为覆盖索引
  • BitmapIndex Scan,利用Bitmap 结构扫描
  • BitmapHeap Scan,把BitmapIndex Scan 返回的Bitmap 结构转换为元组结构

举例

其中

  • Seq Scan 表明了这个节点的类型和作用对象,即在表上进行了全表扫描
  • (cost ...) 代价估计
  • (actual ...) 真实执行信息
  • Output: 表明了SQL 的输出结果集的各个列,当EXPLAIN 命令中的选项VERBOSE为on时才会显示
  • Filter: 表明了Seq Scan 节点之上的Filter 操作,即全表扫描时对每行记录进行过滤操作
  • Rows Removed by Filter: 表明了过滤操作过滤了多少行记录,属于Seq Scan 节点的VERBOSE 信息,只有EXPLAIN 命令中的VERBOSE 选项为on时才会显示
  • Planning time: 表明了生成查询计划的时间
  • Execution time: 表明了实际的SQL 执行时间,其中不包括查询计划的生成时间

参考