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

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

使用 Aurora 优化型读取功能,您可以实现更快的 Aurora PostgreSQL 查询处理。使用 Aurora 优化型读取功能的 Aurora PostgreSQL 数据库实例可将查询延迟缩短多达 8 倍,对于具有超出数据库实例内存容量的大型数据集的应用程序,最多可节省 30% 的成本。

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

创建使用基于 Graviton 的 R6gd 和基于英特尔的 R6id 实例以及非易失性存储规范(NVMe)存储的数据库集群时,默认可以使用 Aurora 优化型读取功能。可在以下 PostgreSQL 版本中可使用此功能:

  • 16.1 及所有更高版本

  • 15.4 及更高版本

  • 14.9 及更高版本

Aurora 优化型读取支持两种功能:分层缓存和临时对象。

启用优化型读取的分层缓存 - 使用分层缓存,您可以将数据库实例缓存容量最多扩展至实例内存的 5 倍。这样可以自动维护缓存以包含最新的、事务一致的数据,从而使应用程序免除管理基于外部结果集的缓存解决方案数据货币的开销。对于之前从 Aurora 存储中获取数据的查询,查询延迟可缩短高达 8 倍。

在 Aurora 中,默认参数组中 shared_buffers 的值通常设置为可用内存的 75% 左右。但是,对于 r6gd 和 r6id 实例类型,Aurora 将减少 4.5% 的 shared_buffers 空间,用于托管优化型读取缓存的元数据。

启用优化型读取的临时对象 - 使用临时对象,您可以通过将 PostgreSQL 生成的临时文件放置在本地 NVMe 存储上来实现更快的查询处理。这将减少通过网络流向 Elastic Block Storage(EBS)的流量。对于排序、联接或合并大量数据而不符合数据库实例上可用内存容量范围的高级查询,延迟可缩短高达 2 倍,吞吐量可提升高达 2 倍。

在 Aurora I/O 优化版集群上,优化型读取同时在 NVMe 存储上利用分层缓存和临时对象。借助启用了优化型读取的分层缓存功能,Aurora 为临时对象分配 2 倍的实例内存,为内部操作分配大约 10% 的存储,剩余的存储作为分层缓存。在 Aurora 标准集群上,优化型读取仅使用临时对象。

Engine 集群存储配置 启用优化型读取的临时对象 启用优化型读取的分层缓存 支持的版本
Aurora PostgreSQL 兼容版 Standard 支持 不支持 Aurora PostgreSQL 版本 16.1 及所有更高版本、15.4 及更高版本、版本 14.9 及更高版本
I/O 优化版 支持 支持
注意

在基于 NVMe 的数据库实例类上,在 IO 优化型集群和标准集群之间切换会导致数据库引擎立即重启。

在 Aurora PostgreSQL 中,使用 temp_tablespaces 参数配置存储临时对象的表空间。

要检查是否配置了临时对象,请使用以下命令:

postgres=> show temp_tablespaces; temp_tablespaces --------------------- aurora_temp_tablespace (1 row)

aurora_temp_tablespace 是由 Aurora 配置的指向 NVMe 本地存储的表空间。您无法修改此参数或切换回 Amazon EBS 存储。

要检查优化型读取缓存是否已开启,请使用以下命令:

postgres=> show shared_preload_libraries; shared_preload_libraries -------------------------------------------------------- rdsutils,pg_stat_statements,aurora_optimized_reads_cache

使用 Aurora 优化型读取

当使用其中一个基于 NVMe 的数据库实例预调配 Aurora PostgreSQL 数据库实例时,该数据库实例会自动使用 Aurora 优化型读取功能。

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

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

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

Aurora 优化型读取的使用案例

启用优化型读取的分层缓存

以下是一些可从优化型读取分层缓存中受益的使用案例:

  • Internet 规模的应用程序,例如支付处理、计费、电子商务(具有严格的性能 SLA)。

  • 实时报告仪表板,可对指标/数据收集运行数百次单点查询。

  • 带有 pgvector 扩展的生成式人工智能应用程序,可在数百万个向量嵌入中搜索精确或最近的邻居。

启用优化型读取的临时对象

以下是一些可从优化型读取临时对象中受益的使用案例:

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

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

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

  • 用于排序的 CREATE INDEXREINDEX 操作。

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

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

您可以使用 EXPLAIN 命令监控使用启用了优化型读取的分层缓存的查询,如以下示例所示:

Postgres=> EXPLAIN (ANALYZE, BUFFERS) SELECT c FROM sbtest15 WHERE id=100000000 QUERY PLAN -------------------------------------------------------------------------------------- Index Scan using sbtest15_pkey on sbtest15 (cost=0.57..8.59 rows=1 width=121) (actual time=0.287..0.288 rows=1 loops=1) Index Cond: (id = 100000000) Buffers: shared hit=3 read=2 aurora_orcache_hit=2 I/O Timings: shared/local read=0.264 Planning: Buffers: shared hit=33 read=6 aurora_orcache_hit=6 I/O Timings: shared/local read=0.607 Planning Time: 0.929 ms Execution Time: 0.303 ms (9 rows) Time: 2.028 ms
注意

只有在优化型读取功能处于开启状态,并且解释计划的 Buffers 部分中 aurora_orcache_hitaurora_storage_read 字段的值大于零时,才会显示这些字段。读取字段是 aurora_orcache_hitaurora_storage_read 字段的总和。

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

  • AuroraOptimizedReadsCacheHitRatio

  • FreeEphemeralStorage

  • ReadIOPSEphemeralStorage

  • ReadLatencyEphemeralStorage

  • ReadThroughputEphemeralStorage

  • WriteIOPSEphemeralStorage

  • WriteLatencyEphemeralStorage

  • WriteThroughputEphemeralStorage

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

您还可以使用此 pg_proctab 扩展来监控 NVMe 存储。

postgres=>select * from pg_diskusage(); major | minor | devname | reads_completed | reads_merged | sectors_read | readtime | writes_completed | writes_merged | sectors_written | writetime | current_io | iotime | totaliotime ------+-------+---------------------+-----------------+--------------+--------------+----------+------------------+---------------+-----------------+-----------+------------+---------+------------- | | rdstemp | 23264 | 0 | 191450 | 11670 | 1750892 | 0 | 24540576 | 819350 | 0 | 3847580 | 831020 | | rdsephemeralstorage | 23271 | 0 | 193098 | 2620 | 114961 | 0 | 13845120 | 130770 | 0 | 215010 | 133410 (2 rows)

Aurora 优化型读取的最佳实践

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

  • 使用 CloudWatch 指标 FreeEphemeralStorage 监控实例存储上的可用存储空间。如果由于数据库实例上的工作负载导致实例存储达到其限制,请调整并发性和大量使用临时对象的查询,或者将其修改为使用更大的数据库实例类。

  • 监控 CloudWatch 指标的优化型读取缓存命中率。诸如 VACUUM 之类的操作可以非常快速地修改大量块。这可能会导致命中率暂时下降。pg_prewarm 扩展可用于将数据加载到缓冲区缓存中,从而允许 Aurora 主动将其中一些块写入优化型读取缓存。

  • 您可以启用集群缓存管理(CCM),在将用作故障转移目标的 Tier-0 读取器上预热缓冲区缓存和分层缓存。启用 CCM 后,会定期扫描缓冲区缓存,以便在分层缓存中写入符合驱逐条件的页面。有关 CCM 的更多信息,请参阅 通过 Aurora PostgreSQL 的集群缓存管理提供故障转移后的快速恢复