这条命令显示 Postgres 规划器为所提供的查询生成的执行规划。 执行规划显示查询引用的表是如何被扫描的--- 是简单的顺序扫描,还是 索引扫描等 --- 并且如果引用了多个表, 采用了什么样的连接算法从每个输入的表中取出所需要的记录。
显示出来的最关键的部分是预计的查询执行开销, 这就是规划器对运行该查询所需时间的估计(以磁盘页面存取为单位计量)。 实际上显示了两个数字:返回第一条记录前的启动时间, 和返回所有记录的总时间。对于大多数查询而言,关心的是总时间,但是, 在某些环境下,比如一个 EXISTS 子查询里, 规划器将选择最小启动时间而不是最小总时间 (因为执行器在获取一条记录后总是要停下来)。同样, 如果你用一条 LIMIT 子句限制返回的记录数, 规划器会在最终的开销上做一个合理的插值以计算哪个规划开销最省。
VERBOSE 选项输出规划树在系统内部的完整内容, 而不仅仅是一个概要(并且还把它发送给 postmaster 日志文件)。 通常这个选项只是对调试 Postgres 有用。
显示一个对只有一个 int4 列和 128 行的表的简单查询的查询规划:
EXPLAIN SELECT * FROM foo; NOTICE: QUERY PLAN: Seq Scan on foo (cost=0.00..2.28 rows=128 width=4) EXPLAIN
对同一个拥有支持查询 equijoin 条件的索引的表, 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
最后,同一个拥有支持查询 equijoin 条件的索引的表, 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 版本之间不同--因为规划器在不断改进。