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

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

最終更新日:Jan 28, 2026

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

背景情報

PolarDB の以前のバージョンでは、プランキャッシュはプリペアドステートメントにバインドされていました。このアプローチには 2 つの欠点がありました:

  • プランキャッシュは個々の接続に分離されており、共有できませんでした。

  • 各接続が独自のプランキャッシュを保持していたため、メモリ使用量が高くなっていました。

PolarDB for PostgreSQL は、異なる接続で同じプランキャッシュを共有できるようにすることで、これらの問題に対処する GPC 機能を導入しています。

プランは、異なるプリペアドステートメントや接続間で共有できます。多数の異なる SQL 文を持つアプリケーションの場合、GPC はメモリ使用量を大幅に削減し、メモリ不足 (OOM) エラーのリスクを低減できます。この効率的なキャッシュ機構は、実行計画の生成コストも削減し、パフォーマンスを向上させます。

プランは、クエリキーが同じ場合にのみ共有できます。クエリキーは、次の部分で構成されます:

  • クエリテキスト。

  • データベース ID。

  • オブジェクト検索パス。

  • ユーザー ID。

適用範囲

  • この機能は、PolarDB for PostgreSQL の以下のバージョンで利用できます:

    • PostgreSQL 18 (マイナーエンジンバージョン 2.0.18.0.1.0 以降)

    • PostgreSQL 17 (マイナーエンジンバージョン 2.0.17.2.1.0 以降)

    • PostgreSQL 16 (マイナーエンジンバージョン 2.0.16.3.1.1 以降)

    • PostgreSQL 15 (マイナーエンジンバージョン 2.0.15.7.1.1 以降)

    • PostgreSQL 14 (マイナーエンジンバージョン 2.0.14.9.15.0 以降)

    • PostgreSQL 11 (マイナーエンジンバージョン 2.0.11.9.28.0 以降)

    説明

    コンソールでマイナーエンジンバージョン番号を確認するか、SHOW polardb_version; 文を実行します。ご利用のクラスターがマイナーエンジンバージョンの要件を満たしていない場合は、マイナーエンジンバージョンをアップグレードしてください。

  • GPC 機能は、バージョンの要件を満たすクラスターではデフォルトで有効になっています。

制限事項

  • GPC はプリペアドステートメントのみをサポートします。PL/SQL シナリオでは、プランキャッシュはサポートされていません。

  • SELECTINSERTUPDATEDELETE 文のみがサポートされています。

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

パラメーター

パラメーター

説明

polar_gpc_mem

GPC のメモリサイズを設定します。単位:MB。デフォルト値は 30 MB です。この値は shared_buffer のサイズを超えることはできません。

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

  • polar_gpc_mem が 0 以下の場合、GPC 機能は無効になります。polar_gpc_mem が 0 より大きい場合、クラスターは起動時に指定された量の共有メモリを予約します。共有メモリが不足している場合、新しいプランキャッシュは一時的にローカルに保存されます。使用頻度の低い、または無効な GPC エントリがクリアされると、共有メモリが解放されます。その後、システムはローカルのプランキャッシュを GPC に移動しようとします。

polar_enable_gpc_level

GPC 機能が有効になるレベルです。このパラメーターは動的に変更できます。有効な値:

  • 0 (デフォルト):GPC は使用されません。

  • 1:GPC は読み取り専用 (RO) ノードでのみ使用されます。

  • 2:GPC はプライマリ (RW) ノードと読み取り専用ノードの両方で使用されます。

説明
  • このパラメーターは polar_gpc_mem と一緒に使用する必要があります。GPC は、polar_gpc_mem が 0 より大きく、かつ polar_enable_gpc_level が 0 より大きい場合にのみ機能します。

  • polar_gpc_mem が 0 より大きく、polar_enable_gpc_level が 0 の場合、既存のクエリは GPC を引き続き使用できますが、新しいクエリは使用できません。

polar_gpc_clean_timeout

使用頻度の低い GPC エントリをクリアする時間間隔。このパラメーターは動的に変更できます。単位:秒。デフォルト値は 1800 秒です。値の範囲は 0 秒から 24 時間です。

polar_worker.gpc_clear_interval

無効な GPC エントリをクリアする時間間隔。このパラメーターは動的に変更できます。単位:秒。デフォルト値は 60 秒です。最大値は (2^32 - 1)/1000 です。

polar_gpc_clean_max

一度にクリアする GPC エントリの数です。このパラメーターは動的に変更できます。デフォルト値は 100 です。値の範囲は 10 から 10000 です。

polar_gpc_partitions

GPC エントリを格納するために使用されるハッシュテーブルの数です。デフォルト値は 32 です。値の範囲は 1 から 1024 です。

説明

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

polar_gpc_entries

各ハッシュテーブルの最大エントリ数です。デフォルト値は 1024 です。値の範囲は 1 から 10000 です。

説明

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

使用ガイド

GPC 機能のモニタリングビューと関数は、polar_gpc 拡張機能に含まれています。次のコマンドを実行して、この拡張機能を作成できます。

CREATE EXTENSION IF NOT EXISTS polar_gpc;

ビュー

polar_stat_gpc - GPC の全体的な使用状況の表示

polar_stat_gpc ビューから、次のように GPC の全体的な使用状況を確認できます:

SELECT * FROM polar_stat_gpc;

polar_stat_gpc ビューの主要なメトリクスは次のとおりです:

  • get:一致する GPC エントリを取得しようとした回数。

  • hit:一致する GPC エントリが見つかった回数。

  • store:プランが GPC に正常に保存された回数。

  • store_failed:GPC の一時的なメモリ不足エラーにより、プランの保存に失敗した回数。この値が頻繁に増加する場合は、polar_gpc_mem パラメーターが低すぎることを示します。

  • store_exists:システムがローカルのプランキャッシュを GPC に追加しようとしたときに、別のセッションがすでにプランを追加済みであった回数。

polar_gpc_plan - 各 GPC エントリのメモリ使用状況の表示

polar_gpc_plan ビューをクエリして、各 GPC エントリのメモリ使用量を確認できます。例:

SELECT * FROM polar_gpc_plan;

polar_gpc_plan ビューの主要なメトリクスは次のとおりです:

  • plan_id:実行計画の ID。

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

  • query:クエリ文。

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

  • last_use_time:GPC エントリが最後に使用された時間。

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

polar_gpc_plan_mcxt - 各 GPC エントリの MemoryContext 情報の表示

polar_gpc_plan_mcxt ビューをクエリして、各 GPC エントリの MemoryContext 情報を確認できます。例:

SELECT * FROM polar_gpc_plan_mcxt;

polar_gpc_plan_mcxt ビューの主要なメトリクスは次のとおりです:

  • plan_id:実行計画の ID。

  • mcxt_name:MemoryContext の名前。

  • totalspace:合計メモリ領域。

  • freespace:利用可能なメモリ領域。

  • used:使用済みメモリ領域。

  • nblocks:ブロック数。

polar_gpc_plan_key - 各 GPC エントリの GPC キーの表示

polar_gpc_plan_key ビューをクエリして、各 GPC エントリの GPC キーを確認できます。このキーは、一致する GPC エントリを見つけるために使用されます。例:

SELECT * FROM polar_gpc_plan_key;

polar_gpc_plan_key ビューの主要なメトリクスは次のとおりです:

  • plan_id:プランの ID。

  • query:クエリ文。

  • dbid:データベースの ID。

  • pid:プロセス ID。

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

  • search_path:検索パス。

  • role_id:ユーザー ID。

polar_prepared_statement - GPC 内のすべてのプリペアドステートメントに関する情報の表示

polar_prepared_statement ビューをクエリして、GPC 内のすべてのプリペアドステートメントに関する情報を確認できます。例:

SELECT * FROM polar_prepared_statement;

polar_prepared_statement ビューの主要なメトリクスは次のとおりです:

  • is_saved:プリペアドステートメントの実行計画が GPC に保存されているかどうかを示します。

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

  • cacheable:プランがキャッシュ可能かどうかを示します。

関数

polar_gpc_evict_invalid_gpc - 無効な GPC エントリの手動クリア

polar_gpc_evict_invalid_gpc 関数を使用して、無効な GPC エントリを手動でクリアできます。例:

SELECT polar_gpc_evict_invalid_gpc();

この関数を呼び出さない場合、システムは $polar_worker.gpc_clear_interval パラメーターで指定された間隔で無効な GPC エントリを自動的にクリアします。

polar_gpc_evict_live_gpc - 使用頻度の低い GPC エントリの手動削除

polar_gpc_evict_live_gpc 関数を使用して、使用頻度の低い GPC エントリを手動で排除できます。例:

SELECT polar_gpc_evict_live_gpc(); 

この関数を呼び出さない場合、システムは $polar_worker.gpc_clear_interval パラメーターで指定された間隔で使用頻度の低い GPC エントリを自動的に削除します。