

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

# 使用 Amazon RDS Optimized Reads 改善 RDS for PostgreSQL 的查詢效能
<a name="USER_PostgreSQL.optimizedreads"></a>

您可以使用 Amazon RDS Optimized Reads，為 RDS for PostgreSQL 實現更快的查詢處理。使用 RDS Optimized Reads 的 RDS for PostgreSQL 資料庫執行個體或多可用區域資料庫叢集，相較於不使用的情況，查詢處理速度最多可提高 50%。

**Topics**
+ [PostgreSQL 中 RDS Optimized Reads 的概觀](#USER_PostgreSQL.optimizedreads-overview)
+ [RDS Optimized Reads 的使用案例](#USER_PostgreSQL.optimizedreads-use-cases)
+ [RDS Optimized Reads 的最佳實務](#USER_PostgreSQL.optimizedreads-best-practices)
+ [使用 RDS Optimized Reads](#USER_PostgreSQL.optimizedreads-using)
+ [監控使用 RDS Optimized Reads 的資料庫執行個體](#USER_PostgreSQL.optimizedreads-monitoring)
+ [PostgreSQL 中 RDS Optimized Reads 的限制](#USER_PostgreSQL.optimizedreads-limitations)

## PostgreSQL 中 RDS Optimized Reads 的概觀
<a name="USER_PostgreSQL.optimizedreads-overview"></a>

在使用 NVMe 型資料庫執行個體類別時，Optimized Reads 依預設可在 RDS for PostgreSQL 15.2 和更高版本、14.7 和更高版本以及 13.10 和更高版本上使用。如需指出哪些執行個體使用 NVMe 的硬體規格，請參閱 [ 資料庫執行個體類別的硬體規格](Concepts.DBInstanceClass.Summary.md)。

當您使用已開啟 RDS Optimized Reads 的 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 本機儲存體。您隨時可以使用AWS 管理主控台修改 `Parameter group` 中的這個參數為指向 `rds_temp_tablespace` 以外的任何資料表空間，來切換回 Amazon EBS 儲存體。如需詳細資訊，請參閱 [修改 Amazon RDS 中的資料庫參數群組中的參數](USER_WorkingWithParamGroups.Modifying.md)。您也可以使用 SET 命令，在工作階段層級使用 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 Optimized Reads 的使用案例
<a name="USER_PostgreSQL.optimizedreads-use-cases"></a>

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

## RDS Optimized Reads 的最佳實務
<a name="USER_PostgreSQL.optimizedreads-best-practices"></a>

請使用 RDS Optimized Reads 的下列最佳實務：
+ 針對唯讀查詢新增重試邏輯，以防這些查詢在執行期間由於執行個體儲存體已滿而失敗。
+ 使用 CloudWatch 指標 `FreeLocalStorage` 監控執行個體儲存體上的可用儲存空間。如果執行個體儲存體由於資料庫執行個體或多可用區域資料庫叢集的工作負載而達到其限制，請對其修改以使用較大的資料庫執行個體類別。

## 使用 RDS Optimized Reads
<a name="USER_PostgreSQL.optimizedreads-using"></a>

當您在單一可用區域資料庫執行個體部署、多可用區域資料庫執行個體部署或多可用區域資料庫叢集部署中，佈建具有 NVMe 基礎其中一個資料庫執行個體類別的 RDS for PostgreSQL 資料庫執行個體時，資料庫執行個體會自動使用 RDS Optimized Reads：

如需多可用區域部署的詳細資訊，請參閱 [設定及管理 Amazon RDS 的多可用區域部署](Concepts.MultiAZ.md)。

若要開啟 RDS Optimized Reads，請執行下列其中一項：
+ 使用其中一個 NVMe 為基礎的資料庫執行個體類別，建立 RDS for PostgreSQL 資料庫執行個體或多可用區域資料庫叢集。如需詳細資訊，請參閱 [建立 Amazon RDS 資料庫執行個體](USER_CreateDBInstance.md)。
+ 修改現有的 RDS for PostgreSQL 資料庫執行個體或多可用區資料庫叢集，以使用其中一個 NVMe 為基礎的資料庫執行個體類別。如需詳細資訊，請參閱 [修改 Amazon RDS 資料庫執行個體](Overview.DBInstance.Modifying.md)。

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

若要切換回非最佳化讀取 RDS 執行個體，請將 RDS 執行個體或叢集的資料庫執行個體類別修改為僅支援資料庫工作負載 EBS 儲存體的類似執行個體類別。例如，如果目前的資料庫執行個體類別是 db.r6gd.4xlarge，請選擇 db.r6g.4xlarge 以切換回來。如需詳細資訊，請參閱 [修改 Amazon RDS 資料庫執行個體](Overview.DBInstance.Modifying.md)。

## 監控使用 RDS Optimized Reads 的資料庫執行個體
<a name="USER_PostgreSQL.optimizedreads-monitoring"></a>

您可以透過下列 CloudWatch 指標，監控使用 RDS Optimized Reads 的資料庫執行個體：
+ `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 Optimized Reads 的限制
<a name="USER_PostgreSQL.optimizedreads-limitations"></a>

下列限制適用於 PostgreSQL 中的 RDS Optimized Reads：
+ 執行個體儲存體已滿時，交易會失敗。