

# 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 DB インスタンスまたはマルチ AZ DB クラスターは、これを使用しないものに比べて、クエリ処理を最大 2 倍高速化できます。

**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 を使用する DB インスタンスのモニタリング](#USER_PostgreSQL.optimizedreads-monitoring)
+ [PostgreSQL の RDS Optimized Reads についての制限事項](#USER_PostgreSQL.optimizedreads-limitations)

## PostgreSQL の RDS Optimized Reads の概要
<a name="USER_PostgreSQL.optimizedreads-overview"></a>

NVMe ベースの DB インスタンスクラスを使用する場合、RDS for PostgreSQL バージョン 15.2 以上、14.7 以上、13.10 以上では、Optimized Reads をデフォルトで利用できます。NVMe を使用するインスタンスを示すハードウェア仕様については、「[ DB インスタンスクラスのハードウェア仕様](Concepts.DBInstanceClass.Summary.md)」を参照してください。

RDS Optimized Reads が有効になっている RDS for PostgreSQL DB インスタンスまたはマルチ AZ DB クラスターを使用する場合、それがローカルの不揮発性メモリエクスプレス (NVMe) ベースのソリッドステートドライブ (SSD) ブロックレベルストレージを使用することで、クエリのパフォーマンスが最大 2 倍高速化されます。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` は、NVMe ローカルストレージを指す RDS によって設定された表領域です。`Parameter group` 内のこのパラメータを AWS マネジメントコンソール を使用して変更し、`rds_temp_tablespace` 以外の任意のテーブルスペースを指すようにすることで、いつでも Amazon EBS ストレージに戻すことができます。詳細については、「[Amazon RDS の DB パラメータグループのパラメータの変更](USER_WorkingWithParamGroups.Modifying.md)」を参照してください。SET コマンドを使用して、セッションレベルで `temp_tablespaces` パラメータの値を `pg_default` に変更することもできます。パラメータを変更すると、一時的な作業領域が Amazon EBS にリダイレクトされます。Amazon EBS に戻すことは、RDS インスタンスまたはクラスターのローカルストレージが特定の SQL 操作を実行するのに十分でない場合に役立ちます。

```
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` を使用して、インスタンスストアで使用可能なストレージ容量をモニタリングします。DB インスタンスまたはマルチ AZ DB クラスターのワークロードが原因でインスタンスストアが上限に達している場合は、より大きな DB インスタンスクラスを使用するように変更します。

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

シングル AZ DB インスタンスデプロイ、マルチ AZ DB インスタンスデプロイ、またはマルチ AZ DB クラスターデプロイで、NVMe ベースの DB インスタンスクラスのいずれかを使用して RDS for PostgreSQL DB インスタンスをプロビジョニングすると、DB インスタンスは自動的に RDS Optimized Reads を使用します。

マルチ AZ 配置については、「[Amazon RDS でのマルチ AZ 配置の設定と管理](Concepts.MultiAZ.md)」を参照してください。

RDS Optimized Reads をオンにするには、次のいずれかの操作を行います。
+ NVMe ベースの DB インスタンスクラスの 1 つを使用して、RDS for PostgreSQL DB インスタンスまたはマルチ AZ DB クラスターを作成します。詳細については、「[Amazon RDS DB インスタンスの作成](USER_CreateDBInstance.md)」を参照してください。
+ NVMe ベースの DB インスタンスクラスの 1 つを使用して、既存の RDS for PostgreSQL DB インスタンスまたはマルチ AZ DB クラスターを変更します。詳細については、「[Amazon RDS DB インスタンスを変更する](Overview.DBInstance.Modifying.md)」を参照してください。

RDS Optimized Reads は、ローカル NVMe SSD ストレージのある DB インスタンスクラスの 1 つ以上がサポートされているすべての AWS リージョン で使用できます。詳細については、「[ DB インスタンスクラス](Concepts.DBInstanceClass.md)」を参照してください。

最適化されていない読み取り RDS インスタンスに戻すには、RDS インスタンスまたはクラスターの DB インスタンスクラスを、データベースワークロードの EBS ストレージのみをサポートする同様のインスタンスクラスに変更します。例えば、現在の DB インスタンスクラスが db.r6gd.4xlarge の場合、db.r6g.4xlarge を選択して元に戻します。詳細については、「[Amazon RDS DB インスタンスを変更する](Overview.DBInstance.Modifying.md)」を参照してください。

## RDS Optimized Reads を使用する DB インスタンスのモニタリング
<a name="USER_PostgreSQL.optimizedreads-monitoring"></a>

RDS Optimized Reads を使用する DB インスタンスは、次の CloudWatch メトリクスでモニタリングできます。
+ `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 には次の制限事項が適用されます。
+ トランザクションは、インスタンスストアが満杯になるとエラーになる可能性があります。