すべてのプロダクト
Search
ドキュメントセンター

PolarDB:グローバルプランキャッシュ

最終更新日:Jun 06, 2025

このトピックでは、PolarDB for PostgreSQL (Oracle 互換) のグローバルプランキャッシュ (GPC) 機能について説明します。

背景情報

従来のバージョンの PolarDB for PostgreSQL では、プランキャッシュはプリペアドステートメントでのみ使用できました。このため、以下の問題が発生していました。

  • プランキャッシュを接続間で共有できない。

  • 各接続に固有のプランキャッシュがあるため、メモリ使用量のオーバーヘッドが発生する。

これらの問題に対処するため、PolarDB for PostgreSQL (Oracle 互換) は、プリペアドステートメント間と接続間でプランキャッシュを共有できる GPC 機能を提供します。

GPC は、大量の SQL 文を送信するアプリケーションのメモリ使用量を大幅に削減し、OOM (Out of Memory) 問題のリスクを軽減できます。また、実行プランを生成するオーバーヘッドを削減することで、パフォーマンスを向上させることもできます。

同じクエリキーを持つクエリは、プランキャッシュを共有できます。クエリキーには、以下のコンポーネントが含まれています。

  • クエリ文。

  • データベース ID。

  • オブジェクトのパス。

  • ユーザー ID。

使用上の注意事項

  • GPC は、PostgreSQL 11 (カーネルマイナーバージョン 1.1.30 以降) を実行する PolarDB for PostgreSQL (Oracle 互換) クラスターでサポートされており、デフォルトで有効になっています。

説明

以下の文を実行して、PolarDB for PostgreSQL (Oracle 互換) クラスターのマイナーバージョンを表示できます。

show polar_version;

制限事項

  • GPC はプリペアドステートメントのみをサポートし、PL/SQL シナリオでは使用できません。

  • SELECTINSERTUPDATE、および DELETE 文のみがサポートされています。

  • 一時テーブルはサポートされていません。

パラメータ

パラメータ

説明

polar_gpc_mem

GPC の格納に使用するメモリ容量。単位:MB。デフォルト値:30。値は共有バッファの容量より大きくすることはできません。

説明
  • パラメータ値を変更した後、変更を有効にするには、クラスターを再起動する必要があります。

  • polar_gpc_mem が 0 以下の場合、GPC は無効になります。値が 0 より大きい場合、このパラメータで指定された容量の共有メモリが GPC 用に予約されます。共有メモリが不足すると、新しいプランキャッシュはローカルディスクに保存されます。使用頻度の低い GPC または無効な GPC が削除された場合、共有メモリがクリーンアップされた後、プランキャッシュは共有メモリに移動される場合があります。

polar_enable_gpc_level

GPC を有効にするノードのタイプ。値は変更可能です。有効な値:

  • 0 (デフォルト): GPC は有効になっていません。

  • 1: GPC は読み取り専用ノードでのみ有効になります。

  • 2: GPC は読み書きノードと読み取り専用ノードの両方で有効になります。

説明
  • polar_gpc_mem が 0 より大きく、polar_enable_gpc_level が 1 または 2 に設定されている場合にのみ、GPC は有効になります。

  • polar_gpc_mem が 0 より大きく、 polar_enable_gpc_level が 0 に設定されている場合、GPC を使用しているクエリは引き続き GPC を使用できますが、新しいクエリは GPC を使用できません。

polar_gpc_clean_timeout

使用頻度の低い GPC が削除される時間間隔。値は変更可能です。単位:秒。デフォルト値:1800。有効な値:0 ~ 86400。

polar_worker.gpc_clear_interval

無効な GPC が削除される時間間隔。値は変更可能です。単位:秒。デフォルト値:60。有効な値:0 ~ 4294967。

polar_gpc_clean_max

バッチで削除できる GPC の最大量。値は変更可能です。デフォルト値:100。有効な値:10 ~ 10000。

polar_gpc_partitions

GPC の格納に使用するハッシュテーブルの数。デフォルト値:32。有効な値:1 ~ 1024。

説明

パラメータ値を変更した後、変更を有効にするには、クラスターを再起動する必要があります。

polar_gpc_entries

ハッシュテーブルに格納できるエントリの最大数。デフォルト値:1024。有効な値:1 ~ 10000。

説明

パラメータ値を変更した後、変更を有効にするには、クラスターを再起動する必要があります。

使用方法

polar_stat_gpc

polar_stat_gpc ビューをクエリして、GPC の全体的な統計情報を取得できます。サンプル文:

SELECT * FROM polar_stat_gpc;

フィールド:

  • get: GPC のマッチングが試行された回数。

  • hit: GPC がマッチングされた回数。

  • store: クエリプランがキャッシュされた回数。

  • store_failed: メモリ不足のためにクエリプランのキャッシュに失敗した回数。値が大きい場合、polar_gpc_mem パラメータがビジネス要件を満たせない値に設定されている可能性があります。

  • store_exists: 別のセッションでプランが書き込まれたため、ローカルプランキャッシュを GPC に追加できなかった回数。

polar_gpc_plan

polar_gpc_plan ビューをクエリして、各 GPC に関するメモリ使用量情報を取得できます。サンプル文:

SELECT * FROM polar_gpc_plan;

フィールド:

  • plan_id: クエリプラン ID。

  • stmt_name: プリペアドステートメントの名前。

  • query: SQL 文。

  • used_cnt: プランが使用された回数。

  • last_use_time: GPC が最後に使用された日時。

  • is_valid: プランの有効状態。

polar_gpc_plan_mcxt

polar_gpc_plan_mcxt ビューをクエリして、各 GPC に関する MemoryContext 情報を取得できます。サンプル文:

SELECT * FROM polar_gpc_plan_mcxt;

フィールド:

  • plan_id: クエリプラン ID。

  • mcxt_name: MemoryContext の名前。

  • totalspace: メモリ空間の合計。

  • freespace: 使用可能なメモリ空間。

  • used: 使用済みメモリ空間。

  • nblocks: ブロック数。

polar_gpc_plan_key

polar_gpc_plan_key ビューをクエリして、各 GPC のクエリキーを取得できます。サンプル文:

SELECT * FROM polar_gpc_plan_key;

フィールド:

  • plan_id: プラン ID。

  • query: SQL 文。

  • dbid: データベース ID。

  • pid: プロセス ID。

  • num_params: クエリ文のパラメータの数。

  • search_path: オブジェクトのパス。

  • role_id: ユーザー ID。

polar_prepared_statement

polar_prepared_statement ビューをクエリして、GPC のすべてのプリペアドステートメントに関する情報を取得できます。サンプル文:

SELECT * FROM polar_prepared_statement;

フィールド:

  • is_saved: クエリプランが GPC に保存されているかどうかを示します。

  • is_valid: プランが有効かどうかを示します。

  • cacheable: プランをキャッシュできるかどうかを示します。

polar_gpc_evict_invalid_gpc

polar_gpc_evict_invalid_gpc 関数を使用して、無効な GPC を削除できます。サンプル文:

SELECT polar_gpc_evict_invalid_gpc();

この文を手動で実行しなくても、システムは $polar_worker.gpc_clear_interval 秒ごとに無効な GPC を削除します。

polar_gpc_evict_live_gpc

polar_gpc_evict_live_gpc 関数を使用して、使用頻度の低い GPC を削除できます。サンプル文:

SELECT polar_gpc_evict_live_gpc(); 

この文を手動で実行しなくても、システムは $polar_worker.gpc_clear_interval 秒ごとに使用頻度の低い GPC を削除します。