このトピックでは、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 シナリオでは使用できません。
SELECT、INSERT、UPDATE、およびDELETE文のみがサポートされています。一時テーブルはサポートされていません。
パラメータ
パラメータ | 説明 |
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。 説明 パラメータ値を変更した後、変更を有効にするには、クラスターを再起動する必要があります。 |
使用方法
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 を削除します。