実行計画キャッシュ(Plan Cache)は、実行計画の生成回数を削減するために使用されます。
OceanBaseデータベースは、以前に生成された実行計画をキャッシュし、次回そのSQLを実行する際に直接使用できるようにします。これにより、繰り返し実行を避けることができ、実行プロセスを最適化します。この戦略は「Optimize Once」、すなわち「一度の最適化」と呼ばれています。
計画キャッシュは典型的なKey-Value構造であり、Keyはパラメータ化されたSQL文字列、ValueはそのSQLに対応する実行計画です。
各テナントは、各サーバー上に独立した計画キャッシュを持ち、そのサーバー上で処理されたSQL計画をキャッシュします。OceanBaseデータベースの計画キャッシュでは、SQLの実行計画はローカル計画、リモート計画、分散計画の3種類に分類されます。計画キャッシュ内では、同一のSQLは必要とするデータに応じて、同時に3種類の実行計画を持つ場合があります。
あるSQLの実行計画について、OceanBaseデータベースはデフォルトで最初にSQLを実行した際に生成された計画のみを保持します。ただし、場合によっては、同一のSQLのパラメータ値が実行計画の選択に影響を与える可能性があるため、計画キャッシュは必要に応じて異なるパラメータ値ごとに異なる実行計画を保持し、毎回の実行時に最も適切な計画を使用できるようにします。
プランキャッシュの削除
プランキャッシュの削除とは、実行計画をプランキャッシュから削除し、プランキャッシュによるメモリ使用量を削減することを指します。OceanBaseデータベースでは、自動削除と手動削除の2種類の方法がサポートされています。
自動削除
自動削除とは、計画キャッシュが占有するメモリが、削除すべき計画のメモリ上限(すなわち、計画のハイウォーターマーク)に達した場合、計画キャッシュ内の計画を自動的に削除することを指します。
実行計画の削除をトリガーする条件
一定時間ごと(具体的な時間間隔は構成パラメータ
plan_cache_evict_intervalで設定)に、システムは異なるテナントの異なるサーバー上の計画キャッシュを自動的にチェックし、計画の削除が必要かどうかを判断します。ある計画キャッシュがそのテナントが設定した計画のハイウォーターマークを超えてメモリを占用した場合、計画キャッシュの削除がトリガーされます。実行計画の削除ポリシー
計画キャッシュの削除がトリガーされた後、最も長い間使用されていない実行計画を優先的に削除します。一部の実行計画を削除した後、計画キャッシュの使用メモリがそのテナントが設定した計画のローワーターマークに達した時点で、削除を停止します。
計画キャッシュの削除に関連する構成
plan_cache_evict_intervalこの構成パラメータは、実行計画の削除が必要かどうかをチェックする間隔時間を設定します。ob_plan_cache_percentageこのシステム変数は、計画キャッシュが使用可能なメモリがテナントのメモリに占める割合を設定します。計算式は以下の通りです:計画キャッシュが使用可能な最大メモリ(メモリ上限の絶対値)= テナントのメモリ上限 × ob_plan_cache_percentage / 100ob_plan_cache_evict_high_percentageこのシステム変数は、計画キャッシュの削除をトリガーするメモリサイズがメモリ上限の絶対値に占める割合を設定します。計算式は以下の通りです:計画キャッシュの削除をトリガーするメモリサイズ(計画のハイウォーターマーク)= メモリ上限の絶対値 × ob_plan_cache_evict_high_percentage / 100ob_plan_cache_evict_low_percentageこのシステム変数は、計画キャッシュの削除を停止するメモリサイズがメモリ上限の絶対値に占める割合(計画のローワーターマーク)を設定します。計算式は以下の通りです:計画キャッシュの削除を停止する時のメモリ値(計画のローワーターマーク)= メモリ上限の絶対値 × ob_plan_cache_evict_low_percentage / 100
例えば、テナントのメモリサイズが10GBで、各パラメータの値を以下のように設定した場合:
ob_plan_cache_percentage=10ob_plan_cache_evict_high_percentage=90ob_plan_cache_evict_low_percentage=50
計算結果は以下の通りです:
計画キャッシュのメモリ上限の絶対値=10GB×10/100=1GB
計画のハイウォーターマーク=1GB×90/100=0.9GB
計画のローワーターマーク=1GB×50/100=0.5GB
計算結果から、このテナントが特定のサーバー上で計画キャッシュの使用量が0.9GBを超えた場合、削除がトリガーされ、最も長い間実行されていない計画を優先的に削除します。削除により使用メモリが0.5GBになった時点で、削除を停止します。もし削除速度が新しい計画の生成速度に追いつかない場合、計画キャッシュの使用メモリがメモリ上限の絶対値である1GBに達した時点で、新しい計画は計画キャッシュに追加されなくなります。削除後の使用メモリが1GB未満になって初めて、新しい計画が計画キャッシュに追加されます。
手動削除
手動削除とは、計画キャッシュ内の計画を強制的に削除することを指します。SQL文は以下のとおりです:
ALTER SYSTEM FLUSH PLAN CACHE [[SQL_identifier] [database_list] tenant_list] [GLOBAL];
パラメータの説明は以下のとおりです:
SQL_identifier:SQLを指定するために使用され、形式はsql_id = 'xxx'です。このパラメータを指定しない場合、すべてのSQLの計画キャッシュがクリアされます。説明
システムテナント
sysでSQL_identifierパラメータを使用する場合は、必ずtenant_listを指定する必要があります。通常のテナントではtenant_listパラメータを指定することはできません。database_list:データベースを指定するために使用されます。このパラメータを指定しない場合、すべての計画キャッシュがクリアされます。説明
システムテナント
sysでdatabase_listパラメータを使用する場合は、必ずtenant_listを指定する必要があります。通常のテナントではtenant_listパラメータを指定することはできません。tenant_list:テナント範囲を指定するために使用されます。tenant_listの形式はtenant = 'tenant_name, tenant_name....'です。tenant_listを指定しない場合、すべてのテナントの計画キャッシュがクリアされます。逆の場合は、特定のテナントの計画キャッシュのみがクリアされます。説明
tenant_listを指定できるのはシステムテナントsysのみです。他のテナントはこのパラメータを指定できず、つまり他のテナントは自分自身の計画キャッシュのみをクリアできます。システムテナントがtenant_listを指定しない場合、すべてのテナントの計画キャッシュがクリアされます。GLOBAL:GLOBALを指定しない場合、ローカルマシンの計画キャッシュがクリアされます。逆の場合は、そのテナントが存在するすべてのサーバー上の計画キャッシュがクリアされます。
プランキャッシュのリフレッシュ
プランキャッシュ内の実行計画は、さまざまな理由により無効になる可能性があります。この場合、プランキャッシュ内の無効な計画をリフレッシュする必要があります。つまり、その実行計画を削除し、再度最適化して新たな計画を生成した後、プランキャッシュに追加します。
以下のシナリオでは実行計画が無効になるため、実行計画をリフレッシュする必要があります:
SQL文でテーブルのスキーマが変更された場合(例えば、インデックスの追加、列の削除または追加など)、プランキャッシュ内の対応する実行計画がリフレッシュされます。
SQL文でテーブルの統計情報の再収集が必要な場合、プランキャッシュ内の対応する実行計画がリフレッシュされます。
プランキャッシュの使用制御
プランキャッシュは、システム変数およびHintを使用して使用制御を実現できます。
システム変数による制御
ob_enable_plan_cacheをTUREに設定すると、SQLリクエストがプランキャッシュを使用できることを意味します。FALSEに設定すると、SQLリクエストがプランキャッシュを使用しないことを意味します。デフォルトはTUREです。このシステム変数は、セッションレベルまたはグローバルレベルに設定できます。Hintによる制御
- Hint文
/*+USE_PLAN_CACHE(NONE)*/を使用すると、プランキャッシュを使用しないことを意味します。 - Hint文
/*+USE_PLAN_CACHE(DEFAULT)*/を使用すると、プランキャッシュを使用することを意味します。
- Hint文
プランキャッシュのビュー
実行計画関連のビューには、以下が含まれます:
(G)V$OB_PLAN_CACHE_STATは、現在のテナントにおける現在(すべての)OBServerノード上のプランキャッシュ全体の状態を表示します。(G)V$OB_PLAN_CACHE_PLAN_STATは、現在のテナントにおける現在(すべての)OBServerノード上のプランキャッシュ内でキャッシュされている各キャッシュオブジェクトの状態を表示します。(G)V$OB_PLAN_CACHE_PLAN_EXPLAINは、現在(すべての)OBServerノード上のプランキャッシュ内にキャッシュされている物理的な実行計画を表示します。
ビューの詳細なパラメータ情報については、プランキャッシュ関連ビューを参照してください。