このトピックでは、 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は、
SELECT
、INSERT
、UPDATE
、およびDELETE
ステートメントのみをサポートします。GPCは一時テーブルをサポートしていません。
Parameters
パラメーター | 説明 |
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がクリアされる時間間隔。 値は変更できます。 単位: 秒。 デフォルト値: 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を定期的にクリアします。