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

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

最終更新日:Jun 27, 2024

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

背景情報

以前のエディションのPolarDBでは、計画キャッシュは準備済みのステートメントでのみ使用できます。 これにより、次の問題が発生します。

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

  • 各接続には特定のプランキャッシュがあり、メモリ使用量のオーバーヘッドが発生します。

上記の問題を解決するために、 PolarDB for PostgreSQL (Compatible with Oracle) はGPC機能を提供します。

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

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

  • クエリ 文。

  • データベースID。

  • オブジェクトパス。

  • ユーザー ID。

前提条件

  • GPC機能は、PolarDB for PostgreSQL (Oracle互換) クラスターで有効になっています。 デフォルトでは、GPC機能は有効になっています。

  • PolarDB for PostgreSQL (Compatible with Oracle) クラスターは、次のエンジンを実行します。

    Oracle 2.0 (バージョン2.0.14.15.0以降)

    説明

    次のステートメントを実行して、 PolarDB for PostgreSQL (Compatible with Oracle) クラスターのマイナーバージョンを照会できます。

    SHOW polar_version; 

制限

  • GPCは準備されたステートメントのみをサポートし、PL/SQLシナリオでは使用できません。

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

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

Parameters

パラメーター

説明

polar_gpc_mem

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

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

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

polar_enable_gpc_level

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

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

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

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

説明
  • このパラメーターは、polar_gpc_memパラメーターと一緒に設定する必要があります。 GPCは、polar_gpc_memパラメーターを1より大きい値に設定し、このパラメーターを1または2に設定した場合にのみ、期待どおりに機能します。

  • polar_gpc_memパラメーターを0より大きい値に設定し、このパラメーターを0に設定した場合、GPCを使用したクエリのみが使用できます。 新しいクエリはGPCを使用できません。

polar_gpc_clean_timeout

まれに使用されたGPCがクリアされる時間間隔。 値は変更できます。 単位: 秒。 デフォルト値: 1800 有効な値: 0 ~ 86400

polar_worker.gpc_clear_interval

無効なGPCがクリアされる時間間隔。 値は変更できます。 単位: 秒。 デフォルト値: 0。 有効な値: 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_キー

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_ステートメント

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