Amazon RDS Optimized Reads による RDS for PostgreSQL のクエリパフォーマンスの向上
Amazon RDS Optimized Reads によって、RDS for PostgreSQL の高速クエリ処理を実現できます。RDS Optimized Reads を使用する RDS for PostgreSQL DB インスタンスまたはマルチ AZ DB クラスターは、これを使用しないものに比べて、クエリ処理を最大 2 倍高速化できます。
トピック
PostgreSQL の RDS Optimized Reads の概要
Optimized Reads は、PostgreSQL バージョン 15.2 以降、14.7 以降、13.10 以降の RDS でデフォルトで利用できます。
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 Management Console を使用して変更し、rds_temp_tablespace
以外の任意のテーブルスペースを指すようにすることで、いつでも Amazon EBS ストレージに戻すことができます。詳細は、「DB パラメータグループのパラメータの変更」を参照してください。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 のユースケース
以下に、Optimized Reads を使用することでメリットが得られるユースケースをいくつか紹介します。
-
テーブル共通式 (CTE)、派生テーブル、グループ化オペレーションを含む分析クエリ。
-
アプリケーションの最適化されていないクエリを処理するリードレプリカ。
-
GROUP BY や ORDER BY などの複雑な操作を伴うオンデマンドまたは動的なレポートクエリで、常に適切なインデックスを使用できるとは限らないもの。
-
内部の一時テーブルを使用するその他のワークロード。
-
ソート用の
CREATE INDEX
またはREINDEX
操作。
RDS Optimized Reads のベストプラクティス
RDS Optimized Reads を使用するベストプラクティスは次のとおりです。
-
インスタンスストアが実行中にストレージ不足によって失敗した場合に備えて、読み取り専用クエリの再試行ロジックを追加します。
-
CloudWatch メトリクスの
FreeLocalStorage
を使用して、インスタンスストアで使用可能なストレージ容量をモニタリングします。DB インスタンスまたはマルチ AZ DB クラスターのワークロードが原因でインスタンスストアが上限に達している場合は、より大きな DB インスタンスクラスを使用するように変更します。
RDS Optimized Reads の使用
シングル AZ DB インスタンスデプロイ、マルチ AZ DB インスタンスデプロイ、またはマルチ AZ DB クラスターデプロイで、NVMe ベースの DB インスタンスクラスのいずれかを使用して RDS for PostgreSQL DB インスタンスをプロビジョニングすると、DB インスタンスは自動的に RDS Optimized Reads を使用します。
マルチ AZ 配置については、「Amazon RDS でのマルチ AZ 配置の設定と管理」を参照してください。
RDS Optimized Reads をオンにするには、次のいずれかの操作を行います。
-
NVMe ベースの DB インスタンスクラスの 1 つを使用して、RDS for PostgreSQL DB インスタンスまたはマルチ AZ DB クラスターを作成します。詳細については、「Amazon RDS DB インスタンスの作成」を参照してください。
-
NVMe ベースの DB インスタンスクラスの 1 つを使用して、既存の RDS for PostgreSQL DB インスタンスまたはマルチ AZ DB クラスターを変更します。詳細については、「Amazon RDS DB インスタンスを変更する」を参照してください。
RDS Optimized Reads は、ローカル NVMe SSD ストレージのある DB インスタンスクラスの 1 つ以上がサポートされているすべての AWS リージョン で使用できます。詳細については、「 DB インスタンスクラス」を参照してください。
最適化されていない読み取り RDS インスタンスに戻すには、RDS インスタンスまたはクラスターの DB インスタンスクラスを、データベースワークロードの EBS ストレージのみをサポートする同様のインスタンスクラスに変更します。例えば、現在の DB インスタンスクラスが db.r6gd.4xlarge の場合、db.r6g.4xlarge を選択して元に戻します。詳細については、「Amazon RDS DB インスタンスを変更する」を参照してください。
RDS Optimized Reads を使用する DB インスタンスのモニタリング
RDS Optimized Reads を使用する DB インスタンスは、次の CloudWatch メトリクスでモニタリングできます。
-
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 Optimized Reads についての制限事項
PostgreSQL の RDS Optimized Reads には次の制限事項が適用されます。
-
トランザクションは、インスタンスストアが満杯になるとエラーになる可能性があります。