ApsaraDB RDS for PostgreSQL インスタンスにおいて、ディスク I/O がボトルネックとなる場合、I/O アクセラレーション機能は一時テーブルおよび一時ファイルを高速キャッシュディスクにルーティングし、複雑なクエリのパフォーマンスを最大 100 % 向上させます。この機能は無料で利用可能であり、アプリケーション側の変更は不要です。
仕組み
一般 ESSD(Enterprise SSD)は、メモリと ESSD ストレージの中間に高速キャッシュディスクを配置した 3 層構造のストレージアーキテクチャを採用しています。I/O アクセラレーション機能は、一時データをこのキャッシュ層に直接書き込み・読み込みします。
I/O アクセラレーションが無効の場合、クエリ実行中に生成される一時テーブルや一時ファイルを含むすべてのデータがクラウドディスクに保存されます。一方、I/O アクセラレーションを有効化すると、クエリエグゼキュータがデータを種別ごとに分離して処理します:
非一時データ(通常のテーブル、ビュー):従来通り、クラウドディスクからメモリへ読み込んで処理します。
一時データ(一時テーブルおよび一時ファイル):キャッシュディスクに対して直接読み書きを行います。
ApsaraDB RDS for PostgreSQL では、キャッシュディスク層を表すために rds_temp_tablespace 表領域が使用されます。明示的に表領域を指定せずに作成された一時オブジェクトは、temp_tablespaces パラメーターを設定した時点で自動的に rds_temp_tablespace に配置されます。
キャッシュディスク上のデータは永続化されません。rds_temp_tablespace に格納されたデータは、インスタンスの仕様変更やその他のデータ移行操作時に失われます。この表領域には、非一時的なデータベースオブジェクトを格納しないでください。
適用範囲
I/O アクセラレーションは、クエリによって生成される一時データ量が使用可能なメモリ容量を上回る場合に最も効果的です:
ソート、集約、グループ化、結合:中間結果をディスクにスピルする操作。
共通テーブル式(CTE)を用いた再帰クエリ:大規模な中間結果セットをマテリアライズする CTE。
サポートインデックスのないアドホッククエリ:フルスキャンを必要とする複雑なフィルターまたは集約処理。
大規模テーブルまたは複数テーブルに対する分析クエリ:高 I/O 負荷を要するレポートおよび分析ワークロード。
一時テーブルを利用するワークロード:アプリケーションロジック内で明示的に一時テーブルを作成する処理。
前提条件
I/O アクセラレーションを有効化する前に、ご利用のインスタンスが以下のすべての要件を満たしていることを確認してください:
| 要件 | 値 |
|---|---|
| 課金方法 | サブスクリプションまたは従量課金 |
| PostgreSQL バージョン | 11 以降 |
| マイナーエンジンバージョン | 20231030 以降 |
| エディション | RDS High-availability Edition |
| プロダクトタイプ | 標準プロダクトタイプ |
| ストレージタイプ | 一般 ESSD |
| インスタンスファミリー | 汎用インスタンスファミリー |
また、インスタンスは以下のリージョンおよびゾーンのいずれかに配置されている必要があります:
| リージョン | ゾーン |
|---|---|
| 中国 (成都) | ゾーン B |
| 中国 (北京) | ゾーン I |
| 中国 (上海) | ゾーン M |
| 中国 (上海) | ゾーン N |
| 中国 (杭州) | ゾーン J |
購入ページで[I/O アクセラレーション]を有効化した後、[プライマリノードのゾーンとネットワーク]セクションで可用性を確認します。
I/O アクセラレーションの有効化
I/O アクセラレーションの有効化または無効化により、約 30 秒間のサービス中断が発生します。ピーク時間帯を避け、非ピーク時間帯に実施してください。
オプション 1:インスタンス作成時に有効化(推奨)
RDS インスタンスを作成する際、上記の前提条件を満たすようパラメーターを構成し、I/O アクセラレーション を有効化します。

オプション 2:既存のインスタンスで有効化
インスタンス ページに移動します。上部のナビゲーションバーからインスタンスが配置されているリージョンを選択し、その後、インスタンス ID をクリックします。
基本情報 セクションで、ストレージタイプ の右側にある 一般 ESSD の構成 をクリックします。
ダイアログボックスで、I/O アクセラレーション を有効化します。

temp_tablespaces パラメーターの設定
I/O アクセラレーションを有効化すると、rds_temp_tablespace 表領域が自動的に作成されます。temp_tablespaces パラメーターを rds_temp_tablespace に設定することで、一時オブジェクトがデフォルトでキャッシュディスクを使用するようになります。
パラメーターの変更手順については、「ApsaraDB RDS for PostgreSQL インスタンスのパラメーターの変更」をご参照ください。
現在のセッションのみに適用する場合は、以下のコマンドを実行します:
SET temp_tablespace TO 'rds_temp_tablespace';クラウドディスクへの復元を行う場合は、temp_tablespaces を '' に設定します。
構成の確認
インスタンスに接続します(「ApsaraDB RDS for PostgreSQL インスタンスへの接続」をご参照ください)。その後、以下のステートメントを実行します:
-- 通常のテーブルを作成
CREATE TABLE test_table (di INT);
-- 一時テーブルを作成
CREATE TEMPORARY TABLE test_temp_table (id INT);
-- 各テーブルが使用する表領域を照会
SELECT
c.relname AS table_name,
COALESCE(t.spcname, 'pg_default') AS tablespace_name
FROM
pg_class c
JOIN
pg_namespace n ON c.relnamespace = n.oid
LEFT JOIN
pg_tablespace t ON c.reltablespace = t.oid
WHERE
c.relkind = 'r'
AND c.relname IN ('test_table', 'test_temp_table');期待される出力:
table_name | tablespace_name
------------------+---------------------
test_table | pg_default
test_temp_table | rds_temp_tablespace
(2 rows)test_temp_table が rds_temp_tablespace に表示される場合、I/O アクセラレーションが正常に有効化されています。
注意事項
キャッシュディスク領域は、ご利用のインスタンスタイプに基づいて割り当てられます。キャッシュ領域が不足した場合、一時データを書き込むステートメントに対して、
ERROR: could not write to file "pg_tblspc/xxxx": No space left on deviceというエラーが報告されます。ただし、非一時データを対象とした SQL ステートメントには影響しません。rds_temp_tablespace内のデータは永続化されません。インスタンスの仕様変更やその他のデータ移行操作時に失われます。
トラブルシューティング
ERROR: No space left on device
このエラーは、rds_temp_tablespace 表領域が満杯であることを意味します。以下の順序で対応してください:
現在のセッションを終了し、再接続します。 セッション終了時にインスタンスは一時ファイルを自動的にクリアします。再接続後に、再度ステートメントを実行してください。
クラウドディスクへのフォールバック:
temp_tablespacesを''に設定します。これによりキャッシュディスクの制限は解除されますが、I/O アクセラレーションによるパフォーマンス向上効果も失われます。
次のステップ
ApsaraDB RDS for PostgreSQL でサポートされるすべてのストレージタイプについては、「ストレージタイプ」をご参照ください。
一般 ESSD およびその 3 層アーキテクチャの概要については、「一般 ESSD」をご参照ください。
ワークロードのピーク IOPS 需要が予測困難な場合、I/O アクセラレーションに加えて、I/O バーストの有効化 を検討してください。