AnalyticDB for PostgreSQL V7.0 はクエリキャッシュ機能をサポートしています。この機能は AnalyticDB for PostgreSQL V6.0 のクエリキャッシュを再設計したもので、個々のクエリとインスタンス全体の両方で、より大きなキャッシュサイズをサポートします。
AnalyticDB for PostgreSQL V6.0 のクエリキャッシュと同様に、この機能はクエリ結果をキャッシュし、繰り返し実行されるクエリに対して迅速に結果を返します。この機能は、読み取り負荷の高いシナリオ、特に繰り返し実行されるクエリが多いシナリオに最適です。これらのシナリオでクエリキャッシュを使用すると、クエリパフォーマンスを大幅に向上させることができます。
バージョン制限
この機能は、マイナーエンジンバージョンが v7.0.6.9 以降の AnalyticDB for PostgreSQL V7.0 インスタンスで利用できます。
マイナーエンジンバージョンを確認する方法については、「マイナーエンジンバージョンの表示」をご参照ください。ご利用のインスタンスがこの要件を満たしていない場合は、マイナーエンジンバージョンをアップグレードできます。詳細については、「マイナーエンジンバージョンのアップグレード」をご参照ください。
制限事項
クエリキャッシュは、以下のシナリオではサポートされません。
パーティションの子テーブルへの直接アクセス。
libpq のフロントエンドプロトコルのバージョンが 3.0 未満の場合。
単一のクエリに 128 を超えるテーブルが含まれる場合。
拡張クエリでカーソルが使用される場合。
トランザクション分離レベルが READ UNCOMMITTED または SERIALIZABLE に設定されている場合。
テーブルパラメーター
querycache_enabled=onが指定されていない場合。Grand Unified Configuration (GUC) パラメーター
gp_select_invisibleがonに設定されている場合。クエリが実行される前にトランザクションブロック内で変更操作が発生した場合、クエリ結果はキャッシュできません。
クエリキャッシュは、一時テーブル、ビュー、マテリアライズドビュー、システムテーブル、ログなしテーブル、外部テーブル、または volatile 関数や immutable 関数ではサポートされません。
結果セットが大きすぎます。デフォルトでは、キャッシュされる結果セットの最大サイズは 1 MB です。この制限を変更するには、テクニカルサポートにご連絡ください。変更を有効にするには、インスタンスを再起動する必要があります。
上記のいずれの条件にも当てはまらない場合、AnalyticDB for PostgreSQL V7.0 は自動的にクエリ結果をキャッシュします。後で同一のクエリが実行された場合、キャッシュされた結果が直接返されます。
クエリキャッシュ機能の有効化
クエリキャッシュ機能は、クエリに高い時間的局所性がある場合にのみ有効です。そのため、この機能はデフォルトで無効になっています。クエリキャッシュ機能を有効にするには、テクニカルサポートにご連絡ください。
テーブルレベルでのクエリキャッシュの有効化/無効化
一部のビジネスシナリオでは、テーブルのクエリ頻度は低いものの、変更は頻繁に行われます。これらのシナリオはクエリキャッシュには適していません。そのため、AnalyticDB for PostgreSQL V7.0 は、テーブルレベルの設定項目 querycache_enabled を提供します。この項目により、テーブル作成時にクエリキャッシュを有効にするかどうかを明示的に制御できます。
クエリがクエリキャッシュを使用できるのは、インスタンスでクエリキャッシュ機能が有効になっており、かつクエリ内のすべてのテーブルで 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);
クエリキャッシュの無効化
正しい結果を保証するため、テーブルのクエリキャッシュは、そのテーブルに対してデータ定義言語 (DDL) またはデータ操作言語 (DML) 操作が実行されると無効になります。
AnalyticDB for PostgreSQL は多版型同時実行制御 (MVCC) を使用します。しかし、クエリキャッシュは最新のクエリ結果のみを保存するため、キャッシュが古くなり、期限切れのデータを返す可能性があります。これは、例えば、同じテーブルで読み取りトランザクションと書き込みトランザクションが同時に実行される場合に発生する可能性があります。
CREATE TABLE test1 (c1 int, c2 int) WITH (querycache_enabled=on);
1: BEGIN;
1: SELECT * FROM test1;
2: BEGIN;
2: INSERT INTO test1 values (3, 4);
2: COMMIT;
1: COMMIT;
-- このクエリは、以前のキャッシュを使用するため、(3,4) ではなく空の結果を返します。
1: SELECT * FROM test1;この問題に対処するため、クエリキャッシュは adbpg_querycache_item_valid_duration パラメーターを提供します。このパラメーターは、キャッシュされた結果のライフサイクルを制御します。デフォルト値は 10 分です。キャッシュされた結果が指定されたライフサイクルより古い場合、新しい同一のクエリには使用されず、代わりにクエリが再実行されます。必要に応じて、querycache_enabled=off を設定してテーブルのクエリキャッシュを無効にするか、adbpg_querycache_item_valid_duration の値を調整できます。
通常、adbpg_querycache_item_valid_duration パラメーターにはデフォルト値を使用できます。変更するには、テクニカルサポートにご連絡ください。
パフォーマンス評価
AnalyticDB for PostgreSQL V7.0 のクエリキャッシュは、トランザクション処理 (TP) 負荷のパフォーマンスを大幅に向上させることはありませんが、悪影響もありません。分析処理 (AP) 負荷については、10 GB の TPC-H および TPC-DS ベンチマークを使用してテストが実行されました。結果を以下に示します。
シナリオ | クエリキャッシュ無効 | クエリキャッシュ有効 |
10 GB TPC-H | 360.35s | 13.42s |
10 GB TPC-DS | 1176.63s | 6.71s |
結果は、TPC-H と TPC-DS の両方で大幅なパフォーマンス向上を示しています。TPC-H の場合、Q1 のようなキャッシュヒットしたクエリは 10 ミリ秒で実行されます。これは 1,000 倍以上のパフォーマンス向上に相当します。理論上、キャッシュヒットしたクエリは 1 秒未満で実行されるはずです。TPC-H と TPC-DS の実際の合計実行時間は約 10 秒でした。これは、一部の結果セットが単一のキャッシュされたクエリの最大サイズである 1 MB を超えたため、キャッシュされなかったことが原因です。