SQLの最適化は時間がかかるため、繰り返し実行されることを避けるために、生成された計画をPlan Cacheに格納し、再度実行する際にはPlan Cacheから直接計画を取得します。各テナントは各ノード上に独立したPlan Cacheを持ち、そのノードで処理されたSQL Planをキャッシュします。
Plan Cache関連のビューには、Plan Cacheの統計情報、実行統計の統計情報および計画情報が含まれており、これらのビューのデータはすべてPlan Cacheから取得されます。関連するビューには以下が含まれます:
GV$OB_PLAN_CACHE_STAT:各テナントは各ノード上に独立したPlan Cacheを持ち、そのノードで処理されたSQL Planをキャッシュします。このビューは各Plan Cacheの統計情報を記録し、各Plan Cacheにつき1件のレコードがあります。GV$OB_PLAN_CACHE_PLAN_EXPLAIN:Plan Cache内の計画の演算子(Operator)情報を記録し、各演算子につき1件のレコードがあります。GV$OB_PLAN_CACHE_PLAN_STAT:Plan Cache内の計画の詳細情報および実行統計情報を記録し、各計画につき1件のレコードがあります。
GV$OB_PLAN_CACHE_PLAN_EXPLAINビューは実行計画の詳細情報を記録しており、主なフィールドの紹介は以下の通りです:
TENANT_ID:テナントID。SVR_IP:ノードIPアドレス。PLAN_ID:実行計画ID。PLAN_DEPTH:Operatorの深さ。OPERATOR:Operatorの名前。NAME:Operatorに対応するテーブル名。ROWS:推定される結果行数。COST:推定されるコスト。PROPERTY:Operatorの詳細情報。
注意
GV$OB_PLAN_CACHE_PLAN_EXPLAINビューを照会する場合、TENANT_ID、SVR_IP、SVR_PORT、PLAN_IDの等値条件を指定する必要があります。そうでない場合、クエリ結果は空になります。V$OB_PLAN_CACHE_PLAN_EXPLAINビューを照会する場合、TENANT_ID、PLAN_IDの等値条件を指定する必要があります。そうでない場合、クエリ結果は空になります。
例えば、以下のステートメントは実行計画を示しています:
obclient> select * from GV$OB_PLAN_CACHE_PLAN_EXPLAIN where tenant_id=1 and svr_ip='xx.xx.xx.xx' and svr_port=2882 and plan_id=349;
+-----------+-------------+----------+---------+------------+--------------+----------------------+--------------+------+------+---------------------------------------------------------------------------------------------------------------------------------------------------------+
| TENANT_ID | SVR_IP | SVR_PORT | PLAN_ID | PLAN_DEPTH | PLAN_LINE_ID | OPERATOR | NAME | ROWS | COST | PROPERTY |
+-----------+-------------+----------+---------+------------+--------------+----------------------+--------------+------+------+---------------------------------------------------------------------------------------------------------------------------------------------------------+
| 1 | xx.xx.xx.xx | 2882 | 349 | 0 | 0 | PHY_DIRECT_RECEIVE | NULL | 1 | 6 | NULL |
| 1 | xx.xx.xx.xx | 2882 | 349 | 1 | 1 | PHY_DIRECT_TRANSMIT | NULL | 1 | 5 | NULL |
| 1 | xx.xx.xx.xx | 2882 | 349 | 2 | 2 | PHY_TABLE_SCAN | __all_server | 1 | 2 | table_rows:6, physical_range_rows:1, logical_range_rows:1, index_back_rows:0, output_rows:1, est_method:default_stat, avaiable_index_name[__all_server] |
+-----------+-------------+----------+---------+------------+--------------+----------------------+--------------+------+------+---------------------------------------------------------------------------------------------------------------------------------------------------------+
3 rows in set (0.04 sec)
GV$OB_PLAN_CACHE_PLAN_STATビューはPlan Cache内の計画の詳細情報および実行統計情報を記録し、各計画につき1件のレコードがあります。
TENANT_ID:テナントID。SVR_IP:ノードIPアドレス。PLAN_ID:実行計画ID。GV$OB_SQL_AUDITビューのPLAN_IDフィールドに対応します。SQL_ID:SQL ID。GV$OB_SQL_AUDITビューのSQL_IDフィールドに対応します。TYPE:実行計画のタイプ。1はローカル計画、2はリモート計画、3は分散計画を表します。STATEMENT:パラメータ化されたSQL文。QUERY_SQL:計画が初めて読み込まれた時の元のSQL文。FIRST_LOAD_TIME:最初に読み込まれた時間。SCHEMA_VERSION:スキーマバージョン番号。LAST_ACTIVE_TIME:最後に実行された時間。AVG_EXE_USEC:平均実行時間。SLOWEST_EXE_TIME:最も遅い実行のタイムスタンプ。SLOWEST_EXE_USEC:最も遅い実行の時間消費量。SLOW_COUNT:スロークエリと判断された回数。しきい値はクラスタ構成パラメータtrace_log_slow_query_watermarkで制御されます。HIT_COUNT:ヒット回数。LARGE_QUERYS:大規模クエリと判断された回数。しきい値はクラスタ構成パラメータlarge_query_thresholdで制御されます。DELAYED_LARGE_QUERYS:大規模クエリと判断され、大規模クエリキューに投入された回数。TIMEOUT_COUNT:タイムアウト回数。EXECUTIONS:実行回数。DISK_READS:すべての実行物理読み取り回数。DIRECT_WRITES:すべての実行書き込み回数。BUFFER_GETS:すべての実行論理読み取り回数。APPLICATION_WAIT_TIME:すべてのapplicationクラスイベントの実行にかかった総時間。CONCURRENCY_WAIT_TIME:すべてのconcurrencyクラスイベントの実行にかかった総時間。USER_IO_WAIT_TIME:すべてのuser_ioクラスイベントの実行にかかった総時間。ROWS_PROCESSED:すべての実行選択の結果行数または変更テーブルの行数。ELAPSED_TIME:すべての実行がリクエスト受信から実行終了までに消費した時間。CPU_TIME:すべての実行で消費されたCPU時間。OUTLINE_ID:ユーザー作成のアウトラインIDにヒットしたかどうか。-1はアウトラインバインディングによって生成された計画ではないことを表します。OUTLINE_DATA:計画に対応するアウトライン情報。TABLE_SCAN:このクエリが主キースキャンであるかどうか。EVOLUTION:この実行計画が進化中であるかどうか。EVO_EXECUTIONS:進化回数。PS_STMT_ID:Prepare StatementのID。