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

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

最終更新日:May 13, 2025

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

背景情報

PolarDB の以前のエディションでは、プランキャッシュはプリペアドステートメントでのみ使用できました。このため、以下の問題が発生します。

  • プランキャッシュを接続間で共有できません。

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

前述の問題を解決するために、PolarDB for PostgreSQL (Oracle 互換) は GPC 機能を提供します。

これにより、プランキャッシュをプリペアドステートメントと接続間で共有できます。 GPC は、大量の SQL 文を送信するアプリケーションのメモリ使用量を大幅に削減し、Out-of-Memory (OOM) 問題のリスクを軽減できます。 GPC は、実行プラン生成のオーバーヘッドを削減することで、パフォーマンスも向上させることができます。

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

  • クエリ文

  • データベース ID

  • オブジェクトパス

  • ユーザー ID

前提条件

制限事項

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

  • GPC は、SELECTINSERTUPDATE、および DELETE 文のみをサポートします。

  • GPC は一時テーブルをサポートしていません。

パラメーター

パラメーター

説明

polar_gpc_mem

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

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

  • このパラメーターの値が 0 以下の場合、GPC は無効になります。このパラメーターの値が 0 より大きい場合、このパラメーターに指定されたメモリ量が GPC 用に予約されます。 共有メモリが不足した場合、新しいプランキャッシュは一時的にローカルディスクに格納されます。使用頻度の低い GPC または無効な GPC がクリアされると、共有メモリ領域が解放され、システムはローカルディスクに格納されているプランキャッシュを GPC に移動しようとします。

polar_enable_gpc_level

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

  • 0: GPC を無効にします。これはデフォルト値です。

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

  • 2: 読み取り/書き込みノードと読み取り専用ノードで GPC を有効にします。

説明
  • このパラメーターは、polar_gpc_mem パラメーターと一緒に構成する必要があります。polar_gpc_mem パラメーターを 1 より大きい値に設定し、このパラメーターを 1 または 2 に設定した場合にのみ、GPC は正常に動作します。

  • polar_gpc_mem パラメーターを 0 より大きい値に設定し、このパラメーターを 0 に設定した場合、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。

説明

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

使用上の注意

GPC の監視ビューを提供する polar_gpc 拡張機能をインストールするには、次の文を実行します。

CREATE EXTENSION IF NOT EXISTS polar_gpc;

ビュー

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 を定期的にクリアします。