# 解释
解释-显示语句的执行计划
# 提要
EXPLAIN [ ( option [, ...] ) ] statement
EXPLAIN [ ANALYZE ] [ VERBOSE ] statement
where option can be one of:
ANALYZE [ boolean ]
VERBOSE [ boolean ]
COSTS [ boolean ]
SETTINGS [ boolean ]
BUFFERS [ boolean ]
WAL [ boolean ]
TIMING [ boolean ]
SUMMARY [ boolean ]
FORMAT { TEXT | XML | JSON | YAML }
# 描述
此命令显示PostgreSQL planner为提供的语句生成的执行计划。执行计划显示了如何扫描语句引用的表(通过普通顺序扫描、索引扫描等),以及如果引用了多个表,将使用什么连接算法将每个输入表中所需的行合并在一起。
显示中最关键的部分是估计的语句执行成本,这是计划人员对运行语句所需时间的猜测(以成本单位衡量,成本单位是任意的,但通常是指磁盘页获取)。实际上显示了两个数字:返回第一行之前的启动成本,以及返回所有行的总成本。对于大多数查询来说,总成本才是最重要的,但在诸如存在
,规划者将选择最小的启动成本,而不是最小的总成本(因为执行者在得到一行后将停止)。另外,如果您限制返回的行数限度
子句中,规划者在端点成本之间进行适当的插值,以估计哪个计划真正最便宜。
这个分析
选项使语句实际执行,而不仅仅是计划执行。然后将实际运行时统计信息添加到显示中,包括每个计划节点内花费的总运行时间(以毫秒为单位)及其实际返回的行总数。这有助于了解规划者的估计是否接近现实。
# 重要的
请记住,当分析
选项被使用。虽然解释
将丢弃选择
如果它再次出现,该声明的其他副作用将照常发生。如果你想用解释分析
在插入
,使现代化
,删去
, 将表创建为
或处决
语句在不让命令影响数据的情况下,使用以下方法:
BEGIN;
EXPLAIN ANALYZE ...;
ROLLBACK;
只有分析
和冗长的
可以指定选项,并且只能按该顺序指定,而无需将选项列表括在括号中。在PostgreSQL 9.0之前,唯一受支持的语法是未细化的语法。预计所有新选项将仅在括号内的语法中受支持。
# 参数
分析
执行命令并显示实际运行时间和其他统计信息。此参数默认为错误的
.
冗长的
显示有关计划的其他信息。具体来说,包括计划树中每个节点的输出列列表、模式限定表和函数名,始终使用其范围表别名在表达式中标记变量,并始终打印显示统计信息的每个触发器的名称。如果已经计算了查询标识符,也会显示查询标识符,请参阅计算_查询_身份证件更多细节。此参数默认为错误的
.
成本
包括每个计划节点的估计启动和总成本信息,以及每行的估计行数和估计宽度。此参数默认为符合事实的
.
设置
包括有关配置参数的信息。具体来说,包括影响查询计划的选项,其值与内置默认值不同。此参数默认为错误的
.
缓冲区
包括有关缓冲区使用的信息。具体来说,包括命中、读取、污染和写入的共享块的数量,命中、读取、污染和写入的本地块的数量,读取和写入的临时块的数量,以及读取和写入数据文件块所花费的时间(毫秒)轨道_木卫一_时机已启用。A.打意味着避免了读取,因为在需要时已在缓存中找到该块。共享块包含来自常规表和索引的数据;本地块包含来自临时表和索引的数据;而临时块包含排序、哈希、物化计划节点和类似情况中使用的短期工作数据。街区的数量弄脏指示此查询更改的以前未修改的块数;而街区的数量书面的指示在查询处理期间此后端从缓存中逐出的先前脏块数。为上层节点显示的块数包括其所有子节点使用的块数。在文本格式中,仅打印非零值。它默认为错误的
.
沃尔
包括有关WAL记录生成的信息。具体来说,包括记录数、整页图像数(fpi)和以字节为单位生成的WAL量。在文本格式中,仅打印非零值。此参数只能在以下情况下使用:分析
也已启用。它默认为错误的
.
时机
在输出中包括实际启动时间和每个节点花费的时间。重复读取系统时钟的开销会显著降低某些系统上的查询速度,因此将此参数设置为错误的
当只需要实际的行计数,而不需要精确的时间时。始终测量整个语句的运行时,即使使用此选项关闭了节点级计时。此参数只能在以下情况下使用:分析
也已启用。它默认为符合事实的
.
总结
在查询计划后包括摘要信息(例如,总计时间信息)。默认情况下,当分析
已使用,但默认情况下不包括,但可以使用此选项启用。计划时间解释执行
包括从缓存中获取计划所需的时间,以及重新计划所需的时间(如有必要)。
总体安排
指定输出格式,可以是文本、XML、JSON或YAML。非文本输出包含与文本输出格式相同的信息,但程序更容易解析。此参数默认为文本
.
布尔值
指定应打开还是关闭选定选项。你可以写符合事实的
, 在…上
或1.
启用该选项,以及错误的
, 关
或0
禁用它。这个*布尔值
*值也可以省略,在这种情况下符合事实的
这是假定的。
陈述
任何选择
, 插入
, 使现代化
, 删去
, 价值观
, 处决
, 声明
, 将表创建为
或将物化视图创建为
声明,您希望看到其执行计划。
# 输出
命令的结果是对所选计划的文本描述*陈述
*,可以选择使用执行统计信息进行注释。第14.1节描述提供的信息。
# 笔记
为了让PostgreSQL查询规划器在优化查询时做出合理明智的决策pg_统计
查询中使用的所有表的数据都应该是最新的。通常情况下自动真空守护程序会自动处理的。但是,如果一个表的内容最近发生了重大变化,您可能需要编写一本手册分析
而不是等待autovacuum跟上变化。
为了衡量执行计划中每个节点的运行时成本解释分析
为查询执行增加分析开销。因此,跑步解释分析
有时,执行查询所需的时间比正常执行查询所需的时间要长得多。开销的大小取决于查询的性质以及所使用的平台。最坏的情况发生在计划节点上,这些节点本身每次执行所需的时间非常少,并且在操作系统调用相对较慢的机器上获取一天中的时间。
# 例子
使用单个整数
列和10000行:
EXPLAIN SELECT * FROM foo;
QUERY PLAN
## Compatibility
There is no `EXPLAIN` statement defined in the SQL standard.
## See Also
[ANALYZE](sql-analyze.html)