使用 Amazon RDS 优化型读取功能提高 RDS for PostgreSQL 的查询性能 - Amazon Relational Database Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用 Amazon RDS 优化型读取功能提高 RDS for PostgreSQL 的查询性能

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

PostgreSQL 中的 RDS 优化型读取功能概述

原定设置情况下,RDS for PostgreSQL 版本 15.2 及更高版本、14.7 及更高版本以及 13.10 及更高版本上提供优化型读取功能。

当您使用开启了 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 存储,方法是使用 Amazon Web Services Management Console修改 Parameter group 中的此参数以指向除 rds_temp_tablespace 之外的任何表空间。有关更多信息,请参阅修改数据库参数组中的参数。也可以使用 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 优化读取的使用案例

以下是一些可从优化型读取功能中受益的使用案例:

  • 包含公用表表达式(CTE)、派生表和分组操作的分析查询。

  • 用于处理应用程序的未优化型查询的只读副本。

  • 具有复杂操作(如 GROUP BY 和 ORDER BY)的按需或动态报告查询,这些操作无法始终使用适当的索引。

  • 使用内部临时表的其他工作负载。

  • 用于排序的 CREATE INDEXREINDEX 操作。

RDS 优化读取的最佳实践

对于 RDS 优化读取使用以下最佳实践:

  • 为只读查询添加重试逻辑,以防它们在执行过程中由于实例存储已满而失败。

  • 使用 CloudWatch 指标 FreeLocalStorage 监控实例存储上的可用存储空间。如果由于数据库实例或多可用区数据库集群上的工作负载导致实例存储达到其限制,请修改此实例或集群以使用更大的数据库实例类。

使用 RDS 优化读取

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

有关多可用区部署的更多信息,请参阅配置和管理多可用区部署

要启用 RDS 优化读取,请执行以下操作之一:

  • 使用其中一个基于 NVMe 的数据库实例类创建 RDS for PostgreSQL 数据库实例或多可用区数据库集群。有关更多信息,请参阅创建 Amazon RDS 数据库实例

  • 修改现有 RDS for PostgreSQL 数据库实例或多可用区数据库集群,以使用其中一个基于 NVMe 的数据库实例类。有关更多信息,请参阅修改 Amazon RDS 数据库实例

在支持其中一个或多个数据库实例类(具有本地 NVMe SSD 存储)的所有 Amazon Web Services 区域中,均可使用 RDS 优化型读取功能。有关更多信息,请参阅 数据库实例类

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

监控使用 RDS 优化读取的数据库实例

您可以通过以下 CloudWatch 指标监控使用 RDS 优化型读取功能的数据库实例:

  • FreeLocalStorage

  • ReadIOPSLocalStorage

  • ReadLatencyLocalStorage

  • ReadThroughputLocalStorage

  • WriteIOPSLocalStorage

  • WriteLatencyLocalStorage

  • WriteThroughputLocalStorage

这些指标提供有关可用实例存储的存储空间、IOPS 和吞吐量的数据。有关这些指标的更多信息,请参阅 Amazon RDS 的 Amazon CloudWatch 实例级指标

要监控本地存储的当前使用情况,请使用以下查询登录数据库:

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 中 RDS 优化型读取功能的限制

以下限制适用于 PostgreSQL 中的 RDS 优化型读取功能:

  • 实例存储已满时,事务可能会失败。