

# 使用 Aurora DSQL EXPLAIN 解释计划
<a name="working-with-explain-plans"></a>

Aurora DSQL 使用与 PostgreSQL 类似的 EXPLAIN 计划结构，但增加了一些反映其分布式架构和执行模型的关键内容。

在本文档中，我们将概述 Aurora DSQL EXPLAIN 计划，重点介绍与 PostgreSQL 相比的相似之处和不同之处。我们将介绍 Aurora DSQL 中可用的各种类型的扫描操作，并协助您了解运行查询的成本。

## PostgreSQL 与 Aurora DSQL EXPLAIN 计划
<a name="postgresql-explain-plans"></a>

 Aurora DSQL 建立在 PostgreSQL 数据库基础之上，与 PostgreSQL 共享大多数计划结构，但存在影响查询执行和优化的关键架构差异：


| 功能 | PostgreSQL | Aurora DSQL | 
| --- | --- | --- | 
| 数据存储 | 堆存储 | 没有堆，所有行都通过唯一标识符编制索引 | 
| 主键 | 主键索引与表数据是分开的 | 主键索引是所有额外列均为 INCLUDE 列的表 | 
| 二级索引 | 标准二级索引 | 工作原理与 PostgreSQL 相同，能够包含非键列 | 
| 筛选功能 | 索引条件、堆筛选条件 | 索引条件、存储筛选条件、查询处理器筛选条件  | 
| 扫描类型 | 顺序扫描、索引扫描、仅限索引扫描 | 全面扫描、仅限索引扫描、索引扫描 | 
| 查询执行 | 对数据库为本地的 | 分布式（计算和存储是分开的） | 

Aurora DSQL 直接按主键顺序存储表数据，而不是存储在单独的堆中。每行都由一个唯一键（通常是主键）标识，这使数据库能够更高效地优化查找。架构差异解释了为什么 Aurora DSQL 经常在 PostgreSQL 可能选择顺序扫描的情况下使用仅限索引扫描。

另一个关键区别是，Aurora DSQL 将计算与存储分开，从而可以在执行路径中更早地应用筛选条件，以减少数据移动并提高性能。

有关在 PostgreSQL 中使用 EXPLAIN 计划的更多信息，请参阅 [PostgreSQL EXPLAIN 文档](https://www.postgresql.org/docs/current/using-explain.html)。

## Aurora DSQL EXPLAIN 中的关键元素
<a name="explain-plan-elements"></a>

Aurora DSQL EXPLAIN 计划提供有关如何执行查询的详细信息，包括筛选发生的位置以及从存储中检索哪些列。了解此输出有助于优化查询性能。

索引条件  
用于导航索引的条件。效率最高的筛选，可减少扫描的数据。在 Aurora DSQL 中，可以在执行计划的多个层面上应用索引条件。

投影  
从存储中检索的列。预测越少意味着性能越好。

存储筛选条件  
在存储级别上应用的条件。比查询处理器筛选条件更高效。

查询处理器筛选条件  
在查询处理器级别应用的条件。需要在筛选之前传输所有数据，这会导致更高的数据移动和处理开销。

## Aurora DSQL 中的筛选条件
<a name="filtering-and-projection"></a>

Aurora DSQL 将计算与存储分开，这意味着在查询执行期间应用筛选条件的位置会对性能产生重大影响。在传输大量数据之前应用筛选的条件可减少延迟并提高效率。越早应用筛选条件，需要处理、移动和扫描的数据就越少，从而加快查询速度。

Aurora DSQL 可以在查询路径的多个阶段应用筛选条件。了解这些阶段是解释查询计划和优化性能的关键。


| 级别 | 筛选条件类型 | 描述 | 
| --- | --- | --- | 
| 1 | 索引条件 | 在扫描索引时应用。限制从存储中读取的数据量，并减少发送到计算层的数据。 | 
| 2 | 存储筛选条件 | 在从存储中读取数据之后但在将其发送到计算之前应用。这里的一个例子是针对索引的包含列的筛选条件。减少数据传输，但不会减少读取量。 | 
| 3 | 查询处理器筛选条件 | 在数据到达计算层后应用。必须先传输所有数据，这会增加延迟和成本。目前，Aurora DSQL 无法对存储执行所有筛选和投影操作，因此某些查询可能会被迫回退到这种类型的筛选。 | 