pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
EXPLAIN — 显示语句的执行计划
EXPLAIN [ VERBOSE ] query
显示详细查询计划的标志。
query任何query。
NOTICE: QUERY PLAN: plan来自Postgres后端的显式 查询计划。
EXPLAIN查询计划显示完毕后发出的标志。
这条命令显示 Postgres 规划器为给定 查询生成的执行计划。执行计划显示查询引用的表将被如何 扫描 —— 用普通的顺序 扫描、索引扫描等 —— 以及当引用多个表时, 将使用什么连接算法把每个输入表中所需的元组汇集到一起。
显示中最关键的部分是估计的查询执行代价,即规划器对运行该 查询所需时间的猜测(以磁盘页获取次数为单位度量)。实际上 会显示两个数字:返回第一个元组之前的启动时间,以及返回所有 元组的总时间。对大多数查询来说,总时间才是重要的,但在诸如 EXISTS 子查询这样的上下文中,规划器会选择最小的启动时间而 不是最小的总时间(因为执行器在取到一个元组后无论如何都会 停止)。另外,如果你用 LIMIT 子句限制返回的元组数,规划器 会在端点代价之间做适当的插值,来估计哪个计划实际上最便宜。
VERBOSE 选项输出计划树的完整内部表示,而不仅仅是一个摘要 (并且也会发送到 postmaster 日志文件)。 通常这个选项只对调试 Postgres 有用。
关于优化器在Postgres中对代价 信息的使用,目前只有很少的文档。关于查询优化的代价估计的 一般信息可以在数据库教科书中找到。更多信息请参阅 程序员指南中关于索引和遗传查询优化器的章节。
要显示对一个只有单个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)
注意,这里显示的具体数字、甚至被选中的查询策略都可能随 Postgres 版本因规划器的改进而变化。
SQL92 中没有定义EXPLAIN语句。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。