

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# EXPLAIN 查询计划
<a name="explain-query-plan"></a>

PostgreSQL 提供了`EXPLAIN``EXPLAIN ANALYZE`和选项，用于返回查询计划，其中包含有关如何运行查询的详细信息。

## 解释声明
<a name="explain"></a>

该`EXPLAIN`语句返回 PostgreSQL 规划器为给定语句生成的查询计划。查询计划显示以下内容：
+ 如何扫描语句中涉及的表（例如，通过索引扫描或顺序扫描）
+ 如何连接多个表（例如，哈希联接、合并联接或嵌套循环联接）

在提高查询性能时，了解计划至关重要。了解计划后，您可以专注于查询花费时间过长的地方，并采取措施缩短时间。

## 使用 “解释分析”
<a name="explain-analyze"></a>

在 PostgreSQL 中`EXPLAIN`，只会为给定的语句生成计划。如果添加`ANALYZE`关键字，`EXPLAIN`将返回计划，运行查询，并显示每个步骤的实际运行时间和行数。这对于分析查询性能是必不可少的。

**重要**  
使用时`EXPLAIN ANALYZE`，请小心`INSERT``UPDATE`、和`DELETE`。

## 如何阅读 EXPLAIN 查询计划
<a name="read"></a>

*PostgreSQL 查询计划是由多个节点组成的树状结构。*`EXPLAIN`查询计划显示了数据库引擎用于运行查询的步骤。查询计划提供以下信息：
+ 执行的操作类型，例如顺序扫描、索引扫描或嵌套循环联接。
+ 一个标签，例如`Seq Scan``Index Scan`、或`Nested Loop`，用于描述正在执行的操作。
+ 查询正在处理的表或索引的名称。
+ 成本和行列，其中包含有关以任意计算单位计算的估计成本和处理的行数的信息。
+ 应用于操作的任何过滤器的筛选`where`条件，例如条件。
+ 步骤的直观表示，每个操作都显示为节点和连接操作的箭头。操作顺序从左到右显示，较早的操作将输入到以后的操作中。

以下屏幕截图显示了顺序扫描的查询计划。



![\[查询计划显示在 pgadmin 的 “数据输出” 选项卡上。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/postgresql-query-tuning/images/query-plan.png)


成本估算`(cost=0.00..32.60 rows=2260 width=8)`意味着 PostgreSQL 预计查询将需要 32.60 个计算单位才能返回结果。

该`0.00`值是该节点可以开始工作的成本（在本例中为查询的启动时间）。该`rows`值是顺序扫描将返回的估计行数。该`width`值是返回行的估计大小（以字节为单位）。

由于示例显示的是`ANALYZE`选项`EXPLAIN`，因此查询已运行，并捕获了计时信息。结果`(actual time=0.120..0.121 rows=1 loops=1)`意味着以下内容：
+ 顺序扫描运行了一次（该`loops`值）。
+ 扫描返回了一行。
+ 实际时间为 0.12 毫秒。