

# 使用 Amazon RDS 优化型读取功能提高 RDS for PostgreSQL 的查询性能
<a name="USER_PostgreSQL.optimizedreads"></a>

使用 Amazon RDS 优化型读取功能，您可以更快地处理 RDS for PostgreSQL 查询。与不使用 RDS 优化型读取功能的数据库实例或多可用区数据库集群相比，使用此功能的实例或集群可以实现最多快 50% 的查询处理速度。

**Topics**
+ [PostgreSQL 中的 RDS 优化型读取功能概述](#USER_PostgreSQL.optimizedreads-overview)
+ [RDS 优化读取的使用案例](#USER_PostgreSQL.optimizedreads-use-cases)
+ [RDS 优化读取的最佳实践](#USER_PostgreSQL.optimizedreads-best-practices)
+ [使用 RDS 优化读取](#USER_PostgreSQL.optimizedreads-using)
+ [监控使用 RDS 优化读取的数据库实例](#USER_PostgreSQL.optimizedreads-monitoring)
+ [PostgreSQL 中 RDS 优化型读取功能的限制](#USER_PostgreSQL.optimizedreads-limitations)

## PostgreSQL 中的 RDS 优化型读取功能概述
<a name="USER_PostgreSQL.optimizedreads-overview"></a>

默认情况下，在使用基于 NVMe 的数据库实例类时，RDS for PostgreSQL 版本 15.2 及更高版本、14.7 及更高版本以及 13.10 及更高版本上提供优化型读取功能。有关指示哪些实例使用 NVMe 的硬件规格，请参阅[数据库实例类的硬件规格](Concepts.DBInstanceClass.Summary.md)。

当您使用开启了 RDS 优化型读取功能的 RDS for PostgreSQL 数据库实例或多可用区数据库集群时，该实例或集群通过使用基于本地非易失性存储规范（NVMe）的固态硬盘（SSD）块级存储，可实现速度最多快 50% 的查询性能。您可以通过将 PostgreSQL 生成的临时表放置在本地存储上来实现更快的查询处理，这可减少通过网络流向 Elastic Block Storage（EBS）的流量。

在 PostgreSQL 中，临时对象分配给临时命名空间，该命名空间在会话结束时会自动删除。删除时的临时命名空间会删除任何依赖于会话的对象，包括模式限定的对象，例如表、函数、运算符甚至扩展。

在 RDS for PostgreSQL 中，为存储临时对象的这一临时工作区配置了 `temp_tablespaces` 参数。

以下查询返回表空间的名称及其位置。

```
postgres=> show temp_tablespaces;
temp_tablespaces
---------------------
rds_temp_tablespace
(1 row)
```

`rds_temp_tablespace` 是由 RDS 配置的指向 NVMe 本地存储的表空间。您可以随时切换回 Amazon EBS 存储，方法是使用 AWS 管理控制台修改 `Parameter group` 中的此参数以指向除 `rds_temp_tablespace` 之外的任何表空间。有关更多信息，请参阅 [在 Amazon RDS 中修改数据库参数组中的参数](USER_WorkingWithParamGroups.Modifying.md)。也可以使用 SET 命令在会话级别将 `temp_tablespaces` 参数的值修改为 `pg_default`。修改此参数会将临时工作区重定向到 Amazon EBS。当 RDS 实例或集群的本地存储空间不足以执行特定的 SQL 操作时，切换回 Amazon EBS 会有所帮助。

```
postgres=> SET temp_tablespaces TO 'pg_default';
SET
```

```
postgres=> show temp_tablespaces;
            
 temp_tablespaces
------------------
 pg_default
```

## RDS 优化读取的使用案例
<a name="USER_PostgreSQL.optimizedreads-use-cases"></a>

以下是一些可从优化型读取功能中受益的使用案例：
+ 包含公用表表达式（CTE）、派生表和分组操作的分析查询。
+ 用于处理应用程序的未优化型查询的只读副本。
+ 具有复杂操作（如 GROUP BY 和 ORDER BY）的按需或动态报告查询，这些操作无法始终使用适当的索引。
+ 使用内部临时表的其他工作负载。
+ 用于排序的 `CREATE INDEX` 或 `REINDEX` 操作。

## RDS 优化读取的最佳实践
<a name="USER_PostgreSQL.optimizedreads-best-practices"></a>

对于 RDS 优化读取使用以下最佳实践：
+ 为只读查询添加重试逻辑，以防它们在执行过程中由于实例存储已满而失败。
+ 使用 CloudWatch 指标 `FreeLocalStorage` 监控实例存储上的可用存储空间。如果由于数据库实例或多可用区数据库集群上的工作负载导致实例存储达到其限制，请修改此实例或集群以使用更大的数据库实例类。

## 使用 RDS 优化读取
<a name="USER_PostgreSQL.optimizedreads-using"></a>

当您在单可用区数据库实例部署、多可用区数据库实例部署或多可用区数据库集群部署中预调配具有基于 NVMe 的数据库实例类之一的 RDS for PostgreSQL 数据库实例时，该数据库实例会自动使用 RDS 优化型读取功能。

有关多可用区部署的更多信息，请参阅[配置和管理 Amazon RDS 的多可用区部署](Concepts.MultiAZ.md)。

要启用 RDS 优化读取，请执行以下操作之一：
+ 使用其中一个基于 NVMe 的数据库实例类创建 RDS for PostgreSQL 数据库实例或多可用区数据库集群。有关更多信息，请参阅 [创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)。
+ 修改现有 RDS for PostgreSQL 数据库实例或多可用区数据库集群，以使用其中一个基于 NVMe 的数据库实例类。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

在支持其中一个或多个数据库实例类（具有本地 NVMe SSD 存储）的所有 AWS 区域中，均可使用 RDS 优化型读取功能。有关更多信息，请参阅 [数据库实例类](Concepts.DBInstanceClass.md)。

要切换回未优化读取功能的 RDS 实例，请将 RDS 实例或集群的数据库实例类修改为类似的实例类，该实例类对于数据库工作负载仅支持 EBS 存储。例如，如果当前数据库实例类是 db.r6gd.4xlarge，请选择 db.r6g.4xlarge 以切换回该实例类。有关更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

## 监控使用 RDS 优化读取的数据库实例
<a name="USER_PostgreSQL.optimizedreads-monitoring"></a>

您可以通过以下 CloudWatch 指标监控使用 RDS 优化型读取功能的数据库实例：
+ `FreeLocalStorage`
+ `ReadIOPSLocalStorage`
+ `ReadLatencyLocalStorage`
+ `ReadThroughputLocalStorage`
+ `WriteIOPSLocalStorage`
+ `WriteLatencyLocalStorage`
+ `WriteThroughputLocalStorage`

这些指标提供有关可用实例存储的存储空间、IOPS 和吞吐量的数据。有关这些指标的更多信息，请参阅 [Amazon RDS 的 Amazon CloudWatch 实例级指标](rds-metrics.md#rds-cw-metrics-instance)。

要监控本地存储的当前使用情况，请登录数据库并运行以下查询：

```
SELECT
    spcname AS "Name",
    pg_catalog.pg_size_pretty(pg_catalog.pg_tablespace_size(oid)) AS "size"
FROM
    pg_catalog.pg_tablespace
WHERE
    spcname IN ('rds_temp_tablespace');
```

有关临时文件及其用法的更多信息，请参阅[使用 PostgreSQL 管理临时文件](PostgreSQL.ManagingTempFiles.md)。

## PostgreSQL 中 RDS 优化型读取功能的限制
<a name="USER_PostgreSQL.optimizedreads-limitations"></a>

以下限制适用于 PostgreSQL 中的 RDS 优化型读取功能：
+ 实例存储已满时，事务可能会失败。