

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Aurora Optimized Reads 改善 Aurora PostgreSQL 的查詢效能
<a name="AuroraPostgreSQL.optimized.reads"></a>

您可以使用 Aurora Optimized Reads，為 Aurora PostgreSQL 實現更快的查詢處理。使用 Aurora Optimized Reads 的 Aurora PostgreSQL 資料庫執行個體可為具有大型資料集 (超過資料庫執行個體記憶體容量) 的應用程式提供高達 8 倍的查詢延遲改進，以及高達 30% 的成本節省。

**Topics**
+ [PostgreSQL 中 Aurora Optimized Reads 的概觀](#AuroraPostgreSQL.optimized.reads.overview)
+ [使用 Aurora Optimized Reads](#AuroraPostgreSQL.optimized.reads.using)
+ [Aurora Optimized Reads 的使用案例](#AuroraPostgreSQL.optimized.reads.usecases)
+ [監控使用 Aurora Optimized Reads 的資料庫執行個體](#AuroraPostgreSQL.optimized.reads.monitoring)
+ [Aurora Optimized Reads 的最佳實務](#AuroraPostgreSQL.optimized.reads.bestpractices)

## PostgreSQL 中 Aurora Optimized Reads 的概觀
<a name="AuroraPostgreSQL.optimized.reads.overview"></a>

當您建立使用 Graviton 型 R6gd, R8gd 和 Intel 型 R6id 執行個體搭配非揮發性記憶體快速 (NVMe) 儲存體的資料庫叢集時，預設可以使用 Aurora Optimized Reads。它可從以下 PostgreSQL 版本取得：
+ 適用於 R8gd 執行個體的 14.12 和更新版本、15.7 和更新版本、16.3 和更新版本、17.4 和更新版本
+ 14.9 和更新版本、15.4 和更新版本、16.1 和 R6gd 和 R6id 執行個體的所有更新版本

Aurora Optimized Reads 支援兩種功能：階層式快取和暫存物件。

**啟用 Optimized Reads 的階層式快取** - 使用階層式快取，您可以將資料庫執行個體快取容量擴充至執行個體記憶體的 5 倍。這會自動維護快取以包含最新的交易一致性資料，讓應用程式免於管理外部結果集型快取解決方案之資料貨幣的額外負荷。它為先前從 Aurora 儲存獲取資料的查詢提供了高達 8 倍的延遲。

在 Aurora 中，預設參數群組中的 `shared_buffers` 值通常設定為可用記憶體的大約 75%。不過，對於 r8gd、r6gd 和 r6id 執行個體類型，Aurora 會將`shared_buffers`空間減少 4.5%，以託管 Optimized Reads 快取的中繼資料。

**已啟用 Optimized Reads 的暫存物件** - 使用暫存物件，您可將 PostgreSQL 產生的暫時檔案放置在本機 NVMe 儲存體上，實現更快的查詢處理。如此可減少透過網路傳送至彈性區塊儲存 (EBS) 的流量。對於進階查詢進行排序、聯結或合併不適合資料庫執行個體上可用記憶體容量的大量資料，可提供高達 2 倍的延遲和輸送量。

在 Aurora I/O 最佳化叢集上，Optimized Reads 會在 NVMe 儲存裝置上同時使用階層式快取和暫存物件。透過啟用 Optimized Reads 的階層式快取功能，Aurora 會為暫存物件分配 2 倍的執行個體記憶體、約 10% 的儲存用於內部作業，而剩餘的儲存裝置則分配為階層式快取。在 Aurora 標準叢集上，Optimized Reads 僅會使用暫存物件。

Aurora I/O 最佳化叢集可讓您使用執行個體層級的動態參數 `aurora_temp_space_size`，調整已啟用 Optimized Reads 之臨時物件的配置空間大小。此調整大小功能可從以下 PostgreSQL 版本取得：
+ 16.8 版和所有更新版本
+ 15.12 版和更新的 15 版本
+ 14.17 版和更新的 14 版本

使用此參數，您可以調整容量大小，從 2 倍到最多 6 倍的執行個體記憶體，而不需要重新啟動資料庫引擎。當您擴展臨時物件空間時，無論並行工作負載為何，變更都會立即生效。不過，當您減少空間時，只有在臨時物件中有足夠的未使用空間來容納新的大小請求之後，調整才會完成。調整已啟用 Optimized Reads 的臨時物件大小後，分層快取會自動調整以使用任何可用的空間。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.optimized.reads.html)

**注意**  
在 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 Optimized Reads
<a name="AuroraPostgreSQL.optimized.reads.using"></a>

當您使用其中一個 NVMe 型資料庫執行個體佈建 Aurora PostgreSQL 資料庫執行個體時，資料庫執行個體會自動使用 Aurora Optimized Reads。

若要開啟 Aurora Optimized Reads，請執行下列其中一項：
+ 使用其中一個 NVMe 型資料庫執行個體類別，建立 Aurora PostgreSQL 資料庫叢集。如需詳細資訊，請參閱[建立 Amazon Aurora 資料庫叢集](Aurora.CreateInstance.md)。
+ 修改現有的 Aurora PostgreSQL 資料庫叢集，以使用其中一個 NVMe 型資料庫執行個體類別。如需詳細資訊，請參閱[修改 Amazon Aurora 資料庫叢集](Aurora.Modifying.md)。

Aurora Optimized Reads 適用於支援 AWS 區域 一或多個具有本機 NVMe SSD 儲存體的資料庫執行個體類別的所有 。如需詳細資訊，請參閱[Amazon Aurora 資料庫執行個體類別](Concepts.DBInstanceClass.md)。

若要切換回非 Optimized Reads Aurora 執行個體，請將 Aurora 執行個體的資料庫執行個體類別修改為針對資料庫工作負載沒有 NVMe 暫時性儲存的類似執行個體類別。例如，如果目前的資料庫執行個體類別是 db.r6gd.4xlarge，請選擇 db.r6g.4xlarge 以切換回來。如需詳細資訊，請參閱[修改 Aurora 資料庫執行個體](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.DBInstance.Modifying.html)。

## Aurora Optimized Reads 的使用案例
<a name="AuroraPostgreSQL.optimized.reads.usecases"></a>

**啟用 Optimized Reads 的階層式快取**

下列是一些可從 Optimized Reads 搭配階層式快取受益的使用案例：
+ 具有嚴格效能 SLA 的網際網路規模的應用程式，例如支付處理、計費、電子商務。
+ 執行數百個點查詢以便收集指標/資料的即時報告儀表板。
+ 具有 pgvector 擴充功能的生成式 AI 應用程式可以在數百萬個向量嵌入中搜尋精確或最近的鄰居。

**啟用 Optimized Reads 的暫存物件**

下列是一些可從 Optimized Reads 搭配暫存物件受益的使用案例：
+ 分析查詢，包括一般資料表表達式 (CTE)、衍生資料表和群組操作。
+ 處理應用程式未最佳化查詢的僅供讀取複本。
+ 具有複雜操作的隨需或動態報告查詢 (例如 GROUP BY 和 ORDER BY)，無法始終使用適當的索引。
+ 用於排序的 `CREATE INDEX` 或 `REINDEX` 操作。
+ 使用內部暫存資料表的其他工作負載

## 監控使用 Aurora Optimized Reads 的資料庫執行個體
<a name="AuroraPostgreSQL.optimized.reads.monitoring"></a>

您可以使用 EXPLAIN 命令監控使用啟用 Optimized Reads 之階層式快取的查詢，如以下範例所示：

```
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
```

**注意**  
只有在 Optimized Reads 已開啟且其值大於零時，才會顯示解釋計畫 `Buffers` 區段中的 `aurora_orcache_hit` 和 `aurora_storage_read` 欄位。讀取欄位是 `aurora_orcache_hit` 和 `aurora_storage_read` 欄位的總計。

您可以透過下列 CloudWatch 指標，監控使用 Aurora Optimized Reads 的資料庫執行個體：
+ `AuroraOptimizedReadsCacheHitRatio`
+ `FreeEphemeralStorage`
+ `ReadIOPSEphemeralStorage`
+ `ReadLatencyEphemeralStorage`
+ `ReadThroughputEphemeralStorage`
+ `WriteIOPSEphemeralStorage`
+ `WriteLatencyEphemeralStorage`
+ `WriteThroughputEphemeralStorage`

這些指標提供可用執行個體儲存體、IOPS 和輸送量的相關資料。如需這些指標的詳細資訊，請參閱 [Amazon Aurora 的執行個體層級指標](Aurora.AuroraMonitoring.Metrics.md#Aurora.AuroraMySQL.Monitoring.Metrics.instances)。

您也可以使用 `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 Optimized Reads 的最佳實務
<a name="AuroraPostgreSQL.optimized.reads.bestpractices"></a>

請使用 Aurora Optimized Reads 的下列最佳實務：
+ 使用 CloudWatch 指標 `FreeEphemeralStorage` 監控執行個體儲存體上的可用儲存空間。如果執行個體儲存體由於資料庫執行個體的工作負載而達到其限制，請調整大量使用暫存物件的並行和查詢，或修改它以使用較大的資料庫執行個體類別。
+ 監控 CloudWatch 指標以了解 Optimized Reads 快取命中率。像 VACUUM 這樣的操作可以非常快速地修改大量區塊。這可能會造成命中率暫時下降。`pg_prewarm` 擴充功能可用來將資料載入緩衝區快取，讓 Aurora 主動將其中一些區塊寫入 Optimized Reads 快取。
+ 您可以啟用叢集快取管理 (CCM)，預熱第 0 層讀取器上的緩衝區快取和階層式快取，這將用作容錯移轉目標。啟用 CCM 時，會定期掃描緩衝區快取，以便在階層式快取中寫入符合移出資格的頁面。如需 CCM 的詳細資訊，請參閱 [Aurora PostgreSQL 的容錯移轉後使用叢集快取管理快速復原](AuroraPostgreSQL.cluster-cache-mgmt.md)。