クエリキャッシュは、頻繁に繰り返されるクエリの実行結果を保存し、その後の同一クエリ要求に対して、クエリの完全な実行をバイパスして結果を直接返します。これにより、短時間ウィンドウ内で同一クエリが繰り返し実行される読み取り中心のワークロードにおいて、クエリ遅延を低減できます。
前提条件
クエリキャッシュを有効化する前に、以下の点を確認してください。
ご利用のインスタンスが V6.3.7.0 以降のバージョンで動作していること。バージョンの確認方法については、「インスタンスのマイナーバージョンの確認」をご参照ください。バージョンアップの手順については、「インスタンスのマイナーバージョンの更新」をご参照ください。
インスタンスに対してクエリキャッシュが有効化されていること(デフォルトでは無効)。有効化するには、チケットを起票してください。
制限事項
構成要件
| 要件 | 詳細 |
|---|---|
| トランザクション分離レベル | READ COMMITTED に設定する必要があります |
GUC パラメーター rds_uppercase_colname | オフ |
GUC パラメーター gp_select_invisible | 「off」に設定する必要があります。off |
| libpq ライブラリフロントエンドプロトコル | バージョン 3.0 以降である必要があります |
| テーブル単位での有効化 | クエリに含まれるすべてのテーブルについて、クエリキャッシュを有効化する必要があります |
対応していないクエリタイプ
クエリキャッシュは、以下のクエリには適用されません。
一時テーブル、ビュー、マテリアライズドビュー、システムテーブル、unlogged テーブル、外部テーブルに対するクエリ
volatile 関数または immutable 関数を呼び出すクエリ
パーティションに対するクエリ
拡張クエリでカーソルを使用するクエリ
同一トランザクションブロック内でデータ変更後に実行されるクエリ
結果セットが 7.5 KB を超えるクエリ
32 個を超えるテーブルを結合するクエリ
対応していない構成
複数のコーディネーターノードを持つインスタンス
インスタンス単位でのクエリキャッシュの有効化
クエリキャッシュは、クエリの反復率が高いワークロードにのみ有効であるため、デフォルトでは無効化されています。有効化するには、チケットを起票してください。
クエリキャッシュを有効化した後は、設定を有効にするためにインスタンスを再起動する必要があります。サービスへの影響を最小限に抑えるため、非ピーク時間帯に再起動を実施してください。
セッション単位でのクエリキャッシュの有効化または無効化
セッションレベルでクエリキャッシュを制御するには、rds_session_use_query_cache パラメーターを使用します。
現在のセッションでクエリキャッシュを有効化するには:
SET rds_session_use_query_cache = on;現在のセッションでクエリキャッシュを無効化するには:
SET rds_session_use_query_cache = off;テーブル単位でのクエリキャッシュの有効化または無効化
テーブルレベルでクエリキャッシュを制御するには、querycache_enabled ストレージパラメーターを使用します。
テーブル作成時にクエリキャッシュを有効化するには:
CREATE TABLE table_name (c1 int, c2 int) WITH (querycache_enabled=on);既存のテーブルでクエリキャッシュを有効化するには:
ALTER TABLE table_name SET (querycache_enabled=on);テーブルでクエリキャッシュを無効化するには:
ALTER TABLE table_name SET (querycache_enabled=off);クエリキャッシュは、そのクエリに含まれるすべてのテーブルで有効化されている場合にのみ適用されます。
キャッシュの有効性管理
デフォルトでは、キャッシュされた結果は 10 分後に有効期限切れになります。10 分のタイムウィンドウを経過後に同一クエリが実行された場合、システムはキャッシュされた結果ではなく、クエリを再実行します。
書き込みによるキャッシュ無効化: テーブルに対する DDL または DML 文は、当該テーブルのキャッシュされた結果を無効化し、書き込み後の古くなったデータが返却されるのを防ぎます。
AnalyticDB for PostgreSQL はマルチバージョン同時実行制御 (MVCC) を採用しており、各キャッシュエントリには最新のクエリ結果のみを格納します。読み取りと書き込みのトランザクションが同時にコミットされる高同時実行環境では、有効期間内であってもキャッシュが最新のコミット済みデータを反映しない場合があります。
デフォルトの 10 分間の有効期間を変更するには、チケットを起票してください。
パフォーマンス
キャッシュヒット率が高い場合、クエリキャッシュは顕著なパフォーマンス向上を実現します。一方、ヒット率が低い場合にはオーバーヘッドは極めて小さいです。
以下に示す TPC-H および TPC-DS のテストは、TPC-H および TPC-DS のベンチマーク手法に基づいていますが、公式ベンチマークのすべての要件を満たすものではありません。そのため、公開されている TPC-H や TPC-DS のベンチマーク結果との比較はできません。
OLTP(オンライントランザクション処理)
キャッシュヒット率が 100 % の場合、クエリキャッシュによりポイントクエリのパフォーマンスが約 6.5 倍向上し、1,718 TPS(1 秒あたりのトランザクション数)から 11,219 TPS になります。
キャッシュヒット率が 0 % の場合、オーバーヘッドは極めて小さく、キャッシュ置き換えを含めてもクエリ遅延は 20 ms 未満に収まり、ベースラインとなる約 10 ms と比べて大きな増加はありません。
| シナリオ | キャッシュ無効時 | キャッシュ有効時 |
|---|---|---|
| ヒット率 0 %、1 文 | 1,718 TPS | 置き換えなし:1,399 TPS;置き換えあり:915 TPS |
| ヒット率 50 %、2 文 | 807 TPS | 置き換えなし:1,367 TPS;置き換えあり:877 TPS |
| ヒット率 100 %、1 文 | 1,718 TPS | 11,219 TPS |
OLAP(オンライン分析処理)
10 GB のデータに対する分析ワークロードにおいて、繰り返し実行されるクエリがキャッシュにヒットした場合、クエリキャッシュにより総クエリ時間が短縮されます。
| ベンチマーク | キャッシュ無効時 | キャッシュ有効時 |
|---|---|---|
| TPC-H 10 GB | 1,255 秒 | 522 秒 |
| TPC-DS 10 GB | 2,813 秒 | 1,956 秒 |
キャッシュされた結果と一致する個別のクエリでは、極端な高速化が見られます。たとえば、TPC-H Q1 はキャッシュヒット時に 1,000 倍以上の性能向上を実現します。ただし、結果セットが 7.5 KB を超えるクエリはキャッシュされないため、フルベンチマーク実行全体における改善効果は限定的です。
クエリキャッシュの利用タイミング
クエリキャッシュは、以下のワークロード特性がある場合に最も効果的です。
| ワークロードの特性 | 推奨事項 |
|---|---|
| 数分以内に同一クエリが繰り返し実行される(高い時間的局所性) | キャッシュを有効化し、クエリの反復ウィンドウに合わせて有効期間を設定してください |
| 読み取り中心であり、キャッシュ対象テーブルへの書き込みが稀な場合 | キャッシュを有効化してください。DML 操作が稀なほど、恩恵が最大化されます |
| 結果セットが小さい(7.5 KB 未満) | キャッシュを有効化してください。大規模な結果セットは自動的にキャッシュをバイパスします |
| 固定レポートクエリを用いる BI ダッシュボード | キャッシュを有効化し、BI ツール内のクエリ文字列を標準化して完全に一致するよう調整してください |
以下のケースでは、クエリキャッシュの恩恵は限定的です。
キャッシュヒットが稀なアドホックまたはユニークな分析クエリ
頻繁に書き込みが行われるテーブル — DML 操作によりキャッシュされた結果が無効化されるため
7.5 KB を超える大規模な結果セットを返すクエリ