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 执行时间,其中不包括查询计划的生成时间
参考