このトピックでは、PolarDB for PostgreSQL (Oracle 互換) のグローバルプランキャッシュ (GPC) 機能について説明します。
背景情報
PolarDB の以前のエディションでは、プランキャッシュはプリペアドステートメントでのみ使用できました。このため、以下の問題が発生します。
プランキャッシュを接続間で共有できません。
各接続に固有のプランキャッシュがあるため、メモリ使用量のオーバーヘッドが発生します。
前述の問題を解決するために、PolarDB for PostgreSQL (Oracle 互換) は GPC 機能を提供します。
これにより、プランキャッシュをプリペアドステートメントと接続間で共有できます。 GPC は、大量の SQL 文を送信するアプリケーションのメモリ使用量を大幅に削減し、Out-of-Memory (OOM) 問題のリスクを軽減できます。 GPC は、実行プラン生成のオーバーヘッドを削減することで、パフォーマンスも向上させることができます。
同じクエリキーを持つクエリは、プランキャッシュを共有できます。クエリキーには、次のコンポーネントが含まれています。
クエリ文
データベース ID
オブジェクトパス
ユーザー ID
前提条件
PolarDB for PostgreSQL (Oracle 互換) クラスタで GPC 機能が有効になっていること。デフォルトでは、GPC 機能は有効になっています。
PolarDB for PostgreSQL (Oracle 互換) クラスタが PolarDB for PostgreSQL (Oracle 互換) 2.0 (リビジョンバージョン 2.0.14.9.15.0 以降) で実行されていること。
説明コンソールでリビジョンバージョンを表示するか、
SHOW polardb_version;ステートメントを実行して表示します。必要に応じてリビジョンバージョンをアップグレードします。
制限事項
GPC はプリペアドステートメントのみをサポートし、PL/SQL シナリオでは使用できません。
GPC は、
SELECT、INSERT、UPDATE、およびDELETE文のみをサポートします。GPC は一時テーブルをサポートしていません。
パラメーター
パラメーター | 説明 |
polar_gpc_mem | GPC の格納に使用するメモリのサイズ。単位:MB。デフォルト値:30。値は共有バッファーの容量より大きくすることはできません。 説明
|
polar_enable_gpc_level | 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 を定期的にクリアします。