↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0 / 6.5 / 6.4
历史版本。 PostgreSQL 7.2 已结束支持。 请参阅 当前版本手册.

EXPLAIN

EXPLAIN — 显示一条语句的执行计划

大纲

EXPLAIN [ ANALYZE ] [ VERBOSE ] query        
  

输入

ANALYZE

执行查询并显示实际运行时间(runtimes)的标志。

VERBOSE

显示详细查询计划的标志。

query

任何query。

输出

NOTICE: QUERY PLAN: plan

来自PostgreSQL后端的显式查询计划。

EXPLAIN

查询计划显示完毕后发出的标志。

描述

这条命令显示PostgreSQL规划器为给定查询生成的执行计划。执行计划显示查询引用的表将被如何扫描——用普通的顺序扫描、索引扫描等——以及当引用多个表时,将使用什么连接算法把每个输入表中所需的元组汇集到一起。

显示中最关键的部分是估计的查询执行代价,即规划器对运行该查询所需时间的猜测(以磁盘页获取次数为单位度量)。实际上会显示两个数字:返回第一个元组之前的启动时间,以及返回所有元组的总时间。对大多数查询来说,总时间才是重要的,但在诸如 EXISTS 子查询这样的上下文中,规划器会选择最小的启动时间而不是最小的总时间(因为执行器在取到一个元组后无论如何都会停止)。另外,如果你用 LIMIT 子句限制返回的元组数,规划器会在端点代价之间做适当的插值,来估计哪个计划实际上最便宜。

ANALYZE 选项使查询被真正执行,而不仅仅是规划。每个计划节点内部花费的总耗时(毫秒)以及它实际返回的总元组数会被添加到显示中。这对于查看规划器的估计是否接近现实很有用。

VERBOSE 选项输出计划树的完整内部表示,而不仅仅是一个摘要(并且也会发送到 postmaster 日志文件)。通常这个选项只对调试PostgreSQL有用。

小心

请记住,使用 ANALYZE 时查询会被真正执行。虽然EXPLAIN会丢弃 SELECT 本会返回的任何输出,查询的其他副作用会照常发生。如果你想在 INSERT、UPDATE 或 DELETE 查询上使用 EXPLAIN ANALYZE而又不让查询影响你的数据,可以使用这样的方法:

BEGIN;
EXPLAIN ANALYZE ...;
ROLLBACK;
      

注解

关于优化器在PostgreSQL中对代价信息的使用,目前只有很少的文档。更多信息请参阅用户指南和程序员指南。

用法

要显示对一个只有单个int4列和 128 行的表的简单查询的查询计划:

EXPLAIN SELECT * FROM foo;
    NOTICE:  QUERY PLAN:

Seq Scan on foo  (cost=0.00..2.28 rows=128 width=4)

EXPLAIN
    
   

对于同一个表,如果有一个支持查询上等值连接条件的索引,EXPLAIN将显示一个不同的计划:

EXPLAIN SELECT * FROM foo WHERE i = 4;
    NOTICE:  QUERY PLAN:

Index Scan using fi on foo  (cost=0.00..0.42 rows=1 width=4)

EXPLAIN
    
   

最后,对于同一个表,如果有支持查询上等值连接条件的索引,EXPLAIN对使用聚合函数的查询将显示如下内容:

EXPLAIN SELECT sum(i) FROM foo WHERE i = 4;
    NOTICE:  QUERY PLAN:

Aggregate  (cost=0.42..0.42 rows=1 width=4)
  ->  Index Scan using fi on foo  (cost=0.00..0.42 rows=1 width=4)
    
   

注意,这里显示的具体数字、甚至被选中的查询策略都可能随 PostgreSQL版本因规划器的改进而变化。

兼容性

SQL92

SQL92 中没有定义EXPLAIN语句。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.