AnalyticDB for PostgreSQL V6.3.7.0は、クエリ結果をキャッシュすることで、繰り返しクエリへの応答を高速化するクエリキャッシュ機能を提供します。 クエリキャッシュ機能は、多数の読み取り操作と繰り返しクエリを含むシナリオでのクエリのパフォーマンスを向上させます。
使用上の注意
V6.3.7.0以降のAnalyticDB for PostgreSQLインスタンスのみがクエリキャッシュ機能をサポートしています。 AnalyticDB For PostgreSQLインスタンスのマイナーバージョンを表示および更新する方法については、「インスタンスのマイナーバージョンの表示」および「インスタンスのマイナーバージョンの更新」をご参照ください。
AnalyticDB for PostgreSQLでクエリキャッシュ機能を使用する場合、次の制限が適用されます。
クエリキャッシュ機能は、トランザクション分離レベルをREAD COMMITTEDに設定した場合にのみ使用できます。
クエリキャッシュ機能は、グランドユニファイド構成 (GUC) パラメーターrds_uppercase_colnameおよびgp_select_invisibleをoffに設定した場合にのみ使用できます。
クエリ内のすべてのテーブルに対してクエリキャッシュ機能を有効にした場合にのみ、キャッシュされたデータをクエリできます。
クエリキャッシュ機能は、libpqライブラリでサポートされているフロントエンドプロトコルのバージョンが3.0以降の場合にのみ使用できます。
同じトランザクションブロック内でデータが変更された後にクエリステートメントを実行すると、クエリ結果をキャッシュできません。
クエリキャッシュ機能は、一時テーブル、ビュー、マテリアライズドビュー、システムテーブル、未ログテーブル、外部テーブル、または揮発性関数または不変関数には使用できません。
パーティションのクエリには、クエリキャッシュ機能を使用できません。
複数のコーディネーターノードが存在する場合、クエリにクエリキャッシュ機能を使用することはできません。
クエリ結果のサイズが7.5 KBを超える場合、クエリキャッシュ機能は使用できません。
1つのクエリに32を超えるテーブルが含まれている場合は、クエリキャッシュ機能を使用できません。
拡張クエリでカーソルが使用されている場合、クエリキャッシュ機能は使用できません。
インスタンスのクエリキャッシュ機能を有効にする
クエリキャッシュ機能は、クエリの時間的局所性が高い場合にのみ適しているため、デフォルトでは無効になっています。 AnalyticDB for PostgreSQLインスタンスのクエリキャッシュ機能を有効にするには、
チケットを起票して、サービスセンターにお問い合わせください。
AnalyticDB for PostgreSQLインスタンスのクエリキャッシュ機能を有効にした後、インスタンスを再起動して機能を有効にする必要があります。 オフピーク時にインスタンスを再起動することを推奨します。
セッションのクエリキャッシュ機能を有効または無効にする
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);キャッシュされたクエリ結果の有効期間の変更
DDLまたはDMLステートメントがテーブルで実行されると、テーブルのキャッシュされたクエリ結果は無効になります。 これにより、正しいクエリ結果が返され、無効なクエリ結果が返されるのを防ぎます。 AnalyticDB for PostgreSQLはマルチバージョン同時実行制御 (MVCC) メカニズムを使用し、クエリキャッシュ機能は最新のクエリ結果のみを格納します。 その結果、キャッシュされたクエリ結果が最も早い機会に更新されないため、無効なクエリ結果が返される可能性があります。 たとえば、読み取りトランザクションと書き込みトランザクションがテーブルに対して同時にコミットされた場合、無効なクエリ結果が発生する可能性があります。
デフォルトでは、キャッシュされたクエリ結果は10分間有効です。 クエリ結果が10分以上キャッシュされた後に同じクエリが実行された場合、システムはキャッシュされたクエリ結果を返す代わりにクエリを再実行します。
無効なクエリ結果が返されないようにするには、
チケットを起票して、キャッシュされたクエリ結果の有効期間を変更します。
パフォーマンス評価
このセクションでは、オンライントランザクション処理 (OLTP) とオンライン分析処理 (OLAP) の2つの負荷シナリオでのクエリキャッシュ機能のパフォーマンスを評価します。
このトピックで説明するTPC-HおよびTPC-DSのパフォーマンステストは、TPC-HおよびTPC-DSのベンチマークテストに基づいて実装されますが、TPC-HおよびTPC-DSのベンチマークテストのすべての要件を満たすわけではありません。 したがって、テスト結果を公開されたTPC-Hと比較してベンチマークテスト結果をTPC-DSすることはできません。
OLTP
次の表に、インデックス付きのポイントクエリのテスト結果を示します。
シナリオ | クエリキャッシュ無効 | クエリキャッシュの有効化 |
キャッシュヒット率: 0% ポイントクエリで使用されるステートメント: 1 | 1,718トランザクション /秒 (TPS) |
|
キャッシュヒット率: 50% ポイントクエリで使用されるステートメント: 2 | 807 TPS |
|
キャッシュヒット率: 100% ポイントクエリで使用されるステートメント: 1 | 1,718 TPS | 11,219 TPS |
OLTPシナリオでは、通常のクエリのレイテンシは約10 msです。 クエリキャッシュ機能が有効になっていて、キャッシュヒット率が100% 場合、クエリのパフォーマンスは約6.5倍向上します。 キャッシュヒット率が0% 場合でも、クエリキャッシュ機能が有効になっている場合のクエリのパフォーマンスは、クエリキャッシュ機能が無効になっている場合のパフォーマンスよりも大幅に低くなりません。 クエリキャッシュ機能がクエリを完了するのに必要な時間は、大幅に変化せず、キャッシュの置き換えが存在する場合は20 msを超えません。
OLAP
次の表に、10 GBのデータに対するTPC-HおよびTPC-DSクエリのテスト結果を示します。
シナリオ | クエリキャッシュ無効 | クエリキャッシュの有効化 |
10 GB TPC-H | 1,255s | 522s |
10 GB TPC-DS | 2,813s | 1,956s |
OLAPシナリオでは、クエリキャッシュ機能を有効にすると、TPC-HおよびTPC-DSクエリのパフォーマンスが大幅に向上します。 たとえば、キャッシュされたクエリ結果が一致すると、TPC-H Q1のパフォーマンスが1,000倍を超えて向上します。 ただし、特定のTPC-HおよびTPC-DSのクエリ結果が最大クエリキャッシュサイズの7.5 KBを超える場合は、キャッシュされません。 全体として、試験は、性能の有意な改善を示さない。