DBMS_XPLANシステムパッケージは、論理計画の最適化追跡など、論理計画管理に関連する機能を提供します。
システムパッケージの紹介
display_cursor
機能紹介
OceanBaseデータベースは、ユーザーが実行したすべてのクエリの計画を、物理計画と論理計画を含めて保存します。これは、ユーザーが後から問題を調査する際に利用されます。履歴クエリ計画を読みやすくするため、OceanBaseデータベースは関連するDBMSパッケージを提供し、計画をフォーマットします。EXPLAINで得られる計画とは異なり、ユーザーが実行した計画は、ユーザーが接続を切断してもデータベースに常に保存されます。保存されたクエリ計画は、ユーザーがクラスタを再起動した場合にのみクリーンアップされます。
関連パッケージ関数の説明
-- display sql plan table`s plan
function display_cursor(plan_id integer default 0, -- default value: last plan
format varchar2 default 'TYPICAL',
svr_ip varchar2 default null, -- default value: server connected by client
svr_port integer default 0, -- default value: server connected by client
tenant_id integer default 0 -- default value: current tenant
)
return dbms_xplan_type_table;
パラメータの説明:
- plan_id:計画ID。指定しない場合、最後に実行された計画を表します。
- format:計画の形式。上記と同じです。
- svr_ip、svr_port:計画が存在するノードのIPアドレス。デフォルトはセッションが接続されているノードのIPアドレスです。
- tenant_id:計画が属するテナントID。デフォルトはセッションが現在接続しているテナントです。
関連データディクショナリの説明
計画情報が格納されているデータディクショナリは__all_virtual_sql_planです。各テナントには、対応するシステムビューとしてgv$ob_sql_plan(現在のテナントのすべてのマシンの計画)とv$ob_sql_plan(現在のテナントの現在のマシンの計画)があります。
+--------------------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------------+---------------------+------+-----+---------+-------+
| tenant_id | bigint(20) | NO | PRI | NULL | |
| plan_id | bigint(20) | NO | PRI | NULL | |
| svr_ip | varchar(46) | NO | PRI | NULL | |
| svr_port | bigint(20) | NO | PRI | NULL | |
| sql_id | varchar(32) | NO | | NULL | |
| db_id | bigint(20) | NO | | NULL | |
| plan_hash | bigint(20) unsigned | NO | | NULL | |
| gmt_create | timestamp(6) | NO | | NULL | |
| operator | varchar(255) | NO | | NULL | |
| options | varchar(255) | NO | | NULL | |
| object_node | varchar(40) | NO | | NULL | |
| object_id | bigint(20) | NO | | NULL | |
| object_owner | varchar(128) | NO | | NULL | |
| object_name | varchar(128) | NO | | NULL | |
| object_alias | varchar(261) | NO | | NULL | |
| object_type | varchar(20) | NO | | NULL | |
| optimizer | varchar(4000) | NO | | NULL | |
| id | bigint(20) | NO | | NULL | |
| parent_id | bigint(20) | NO | | NULL | |
| depth | bigint(20) | NO | | NULL | |
| position | bigint(20) | NO | | NULL | |
| search_columns | bigint(20) | NO | | NULL | |
| is_last_child | bigint(20) | NO | | NULL | |
| cost | bigint(20) | NO | | NULL | |
| real_cost | bigint(20) | NO | | NULL | |
| cardinality | bigint(20) | NO | | NULL | |
| real_cardinality | bigint(20) | NO | | NULL | |
| bytes | bigint(20) | NO | | NULL | |
| rowset | bigint(20) | NO | | NULL | |
| other_tag | varchar(4000) | NO | | NULL | |
| partition_start | varchar(4000) | NO | | NULL | |
| partition_stop | varchar(4000) | NO | | NULL | |
| partition_id | bigint(20) | NO | | NULL | |
| other | varchar(4000) | NO | | NULL | |
| distribution | varchar(64) | NO | | NULL | |
| cpu_cost | bigint(20) | NO | | NULL | |
| io_cost | bigint(20) | NO | | NULL | |
| temp_space | bigint(20) | NO | | NULL | |
| access_predicates | varchar(4000) | NO | | NULL | |
| filter_predicates | varchar(4000) | NO | | NULL | |
| startup_predicates | varchar(4000) | NO | | NULL | |
| projection | varchar(4000) | NO | | NULL | |
| special_predicates | varchar(4000) | NO | | NULL | |
| time | bigint(20) | NO | | NULL | |
| qblock_name | varchar(128) | NO | | NULL | |
| remarks | varchar(4000) | NO | | NULL | |
| other_xml | varchar(4000) | NO | | NULL | |
+--------------------+---------------------+------+-----+---------+-------+
display_active_session_plan
機能紹介
典型的なユースケース:ユーザーが大規模なSQLを実行している際、現在の接続が長時間実行されており、ユーザーがクエリの実行状況(実行計画、実行プロセスなど)を把握したい場合です。このような場合、現在のセッションは大規模なSQLに占有されているため、新しい接続を開き、show full processlistコマンドでその大規模なSQLが存在するセッションを特定し、session_idとdisplay_active_session_planを使用して大規模なSQLの実行詳細を表示する必要があります。
関連パッケージ関数の説明
-- disable real time plan
function display_active_session_plan(
session_id integer default 0,
format varchar2 default 'TYPICAL',
svr_ip varchar2 default null, -- default value: server connected by client
svr_port integer default 0 -- default value: server connected by client
)
return dbms_xplan_type_table;
- session_id:ユーザー接続のsession id。注意:proxy session idではなく、serverのsession idです。
- format:計画の形式。上記と同じです。
- svr_ip、svr_port:sessionが存在するノードのIPアドレス。デフォルトは現在のsessionが接続されているノードのIPアドレスです。
enable_opt_trace
機能紹介
オプティマイザーが計画を生成するプロセスは非常に複雑であり、非最適計画の問題を調査するには、関連情報を収集するために多くの時間がかかります。この機能は、オプティマイザーの全リンク追跡メカニズムを設計し、オプティマイザーが計画を生成するために必要な完全な情報を一度に収集することができ、非最適計画の問題を分析するのに便利です。この機能には以下の追跡情報が含まれます:
- env:
- システム情報、セッション情報
- ユーザーSQL
- オプティマイザー関連変数情報
- transformer:
- 各リライトルールは、リライト前後のSQLを報告します。
- 各リライトルールにおいて、リライトが発生した場合と発生しなかった場合の詳細な理由(hintの制御や何らかの条件が満たされなかったことなど)を示します。
- optimizer:
- 使用された統計情報
- ベーステーブルパス生成ログ(プロセス条件、行数、コスト推定情報、skyline剪枝ルールのプロセスを含む)
- join order列挙の詳細なプロセス
- top演算子の割り当て・最適化プロセス
関連パッケージ関数説明
DBMS_XPLAN.ENABLE_OPT_TRACE
DEFAULT_INENTIFIER constant VARCHAR2(20) := '';
DEFAULT_LEVEL constant INT := 1;
PROCEDURE enable_opt_trace(
sql_id IN VARCHAR2 DEFAULT '',
identifier IN VARCHAR2 DEFAULT DEFAULT_INENTIFIER,
level IN INT DEFAULT DEFAULT_LEVEL
);
DBMS_XPLAN.ENABLE_OPT_TRACE 関数は、オプティマイザーのフルリンクトレースを有効にするために使用されます。有効にすると、現在のセッションで生成される各実行計画のプロセスが追跡されます。
パラメータ紹介:
sql_idは、追跡が必要なSQLをマークするために使用されます。例えば、現在のテストでPLプログラムを実行する必要があり、同時にPL関数内の特定のSQLのみを追跡したい場合、sql_idを設定してマークすることができます。sql_idを設定すると、特定のSQLのみが追跡され、設定しない場合はすべてのSQLが追跡されます。
levelは、追跡のレベルを設定するために使用されます。
- 0: デフォルト動作。
- 1: 各モジュールの使用メモリ、時間を追加で出力します。
- 2: リライトが発生したかどうかにかかわらず、各リライトされたquery blockに対応するSQLを追加で出力します。
注意
levelはデータベースのキーワードであるため、使用する際はOracleテナントでは二重引用符で、MySQLテナントでは`で囲む必要があります。
identifierは、traceファイルの拡張子をマークするために使用され、ユーザーが自身のtraceファイルを検索しやすくします。
DBMS_XPLAN.DISABLE_OPT_TRACE
PROCEDURE disable_opt_trace;
DBMS_XPLAN.DISABLE_OPT_TRACEは、現在のセッションのオプティマイザーのフルリンクトレース機能を無効にするために使用されます。
DBMS_XPLAN.SET_OPT_TRACE_PARAMETER
PROCEDURE set_opt_trace_parameter(
sql_id IN VARCHAR2 DEFAULT '',
identifier IN VARCHAR2 DEFAULT DEFAULT_INENTIFIER,
level IN INT DEFAULT DEFAULT_LEVEL
);
DBMS_XPLAN.SET_OPT_TRACE_PARAMETERは、現在のセッションのオプティマイザーのフルリンクトレースのパラメータを変更するために使用されます。
典型的なシナリオ診断
クエリは実行可能で終了するものの、実行が非常に遅い
クエリ実行の詳細情報を収集します:
Proxyがセッションを「保持」します。
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;クエリを実行します。
select * from t1;DBMS_XPLANパッケージを使用して、前回の実行計画を確認します。
select * from table(dbms_xplan.display_cursor(format=>'all')); +--------------------------------------------------------------------------------------------------+ | COLUMN_VALUE | +--------------------------------------------------------------------------------------------------+ | ================================================================================================ | | |ID|OPERATOR |NAME|EST.ROWS|EST.TIME(us)|REAL.ROWS|REAL.TIME(us)|IO TIME(us)|CPU TIME(us)| | | ------------------------------------------------------------------------------------------------ | | |0 |TABLE FULL SCAN|T1 |1 |2 |0 |0 |0 |0 | | | ================================================================================================ | | Outputs & filters: | | ------------------------------------- | | 0 - output([T1.C1]), filter(nil), rowset=256 | | access([T1.C1]), partitions(p0) | | is_index_back=false, is_global_index=false, | | range_key([T1.__pk_increment]), range(MIN ; MAX)always true | +--------------------------------------------------------------------------------------------------+
Proxyがセッションを「保持」します。
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;クエリを実行します。
select * from t1;DBMS_XPLANパッケージとsql_auditを使用して、前回の実行計画を確認します。
select dbms_xplan.display_cursor(0, 'all'); +--------------------------------------------------------------------------------------------------+ | COLUMN_VALUE | +--------------------------------------------------------------------------------------------------+ | ================================================================================================ | | |ID|OPERATOR |NAME|EST.ROWS|EST.TIME(us)|REAL.ROWS|REAL.TIME(us)|IO TIME(us)|CPU TIME(us)| | | ------------------------------------------------------------------------------------------------ | | |0 |TABLE FULL SCAN|T1 |1 |2 |0 |0 |0 |0 | | | ================================================================================================ | | Outputs & filters: | | ------------------------------------- | | 0 - output([T1.C1]), filter(nil), rowset=256 | | access([T1.C1]), partitions(p0) | | is_index_back=false, is_global_index=false, | | range_key([T1.__pk_increment]), range(MIN ; MAX)always true | +--------------------------------------------------------------------------------------------------+
クエリの実行が非常に遅く、長時間終わらない
実行計画の詳細情報を収集する:
接続AでスローSQLを実行します。
select count(*) from table(generator(100000)) A, table(generator(10000))B;システムテナントにログインし、
__all_virtual_processlistをクエリして、スローSQLを実行しているセッション情報(seesion_id、svr_ip、svr_port)を特定します。select id, svr_ip, svr_ip, svr_port, info from __all_virtual_processlist where info like "%select%"\G id: 3221489189 svr_ip: 11.xxx.xxx.xxx svr_port: 50000 info: select count(*) from table(generator(100000)) A, table(generator(10000))Bセッションの実行計画の詳細を表示します。
select dbms_xplan.display_active_session_plan(3221668463, 'all', '11.xxx.xxx.xxx', 50000); +--------------------------------------------------------------------------------------------------------------------+ | COLUMN_VALUE | +--------------------------------------------------------------------------------------------------------------------+ | ============================================================================================================== | | |ID|OPERATOR |NAME|EST.ROWS|EST.TIME(us)|REAL.ROWS|REAL.TIME(us)|IO TIME(us)|CPU TIME(us)| | | -------------------------------------------------------------------------------------------------------------- | | |0 |SCALAR GROUP BY | |1 |1794 |0 |0 |0 |0 | | | |1 |└─NESTED-LOOP JOIN CARTESIAN | |39601 |1076 |0 |0 |0 |0 | | | |2 | ├─FUNCTION_TABLE |A |199 |1 |0 |0 |0 |0 | | | |3 | └─MATERIAL | |199 |80 |0 |0 |0 |0 | | | |4 | └─FUNCTION_TABLE |B |199 |1 |0 |0 |0 |0 | | | ============================================================================================================== | | Outputs & filters: | | ------------------------------------- | | 0 - output([T_FUN_COUNT(*)]), filter(nil), rowset=256 | | group(nil), agg_func([T_FUN_COUNT(*)]) | | 1 - output(nil), filter(nil), rowset=256 | | conds(nil), nl_params_(nil), use_batch=false | | 2 - output(nil), filter(nil) | | value(GENERATOR(cast(:0, BIGINT(-1, 0)))) | | 3 - output(nil), filter(nil), rowset=256 | | 4 - output(nil), filter(nil) | | value(GENERATOR(cast(:1, BIGINT(-1, 0)))) | +--------------------------------------------------------------------------------------------------------------------+
接続AでスローSQLを実行します。
select count(*) from table(generator(100000)) A, table(generator(10000))B;システムテナントにログインし、
__all_virtual_processlistをクエリして、スローSQLを実行しているセッション情報(seesion_id、svr_ip、svr_port)を特定します。select id, svr_ip, svr_ip, svr_port, info from __all_virtual_processlist where info like "%select%"\G id: 3221489189 svr_ip: 11.xxx.xxx.xxx svr_port: 50000 info: select count(*) from table(generator(100000)) A, table(generator(10000))Bセッション計画の詳細を表示します。
select dbms_xplan.display_active_session_plan(3221668463, 'all', '11.xxx.xxx.xxx', 50000); +--------------------------------------------------------------------------------------------------------------------+ | COLUMN_VALUE | +--------------------------------------------------------------------------------------------------------------------+ | ============================================================================================================== | | |ID|OPERATOR |NAME|EST.ROWS|EST.TIME(us)|REAL.ROWS|REAL.TIME(us)|IO TIME(us)|CPU TIME(us)| | | -------------------------------------------------------------------------------------------------------------- | | |0 |SCALAR GROUP BY | |1 |1794 |0 |0 |0 |0 | | | |1 |└─NESTED-LOOP JOIN CARTESIAN | |39601 |1076 |0 |0 |0 |0 | | | |2 | ├─FUNCTION_TABLE |A |199 |1 |0 |0 |0 |0 | | | |3 | └─MATERIAL | |199 |80 |0 |0 |0 |0 | | | |4 | └─FUNCTION_TABLE |B |199 |1 |0 |0 |0 |0 | | | ============================================================================================================== | | Outputs & filters: | | ------------------------------------- | | 0 - output([T_FUN_COUNT(*)]), filter(nil), rowset=256 | | group(nil), agg_func([T_FUN_COUNT(*)]) | | 1 - output(nil), filter(nil), rowset=256 | | conds(nil), nl_params_(nil), use_batch=false | | 2 - output(nil), filter(nil) | | value(GENERATOR(cast(:0, BIGINT(-1, 0)))) | | 3 - output(nil), filter(nil), rowset=256 | | 4 - output(nil), filter(nil) | | value(GENERATOR(cast(:1, BIGINT(-1, 0)))) | +--------------------------------------------------------------------------------------------------------------------+
計画の生成に時間がかかりすぎる、または計画生成中にメモリ不足で予期しない計画が生成された場合
クエリ最適化情報の収集:
Proxyがセッションを「保持」します。
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;現在のセッションのオプティマイザー追跡機能を有効にします。
call dbms_xplan.enable_opt_trace();追跡ログのレベルとログファイルの拡張子を設定します。
call dbms_xplan.set_opt_trace_parameter(identifier=>'trace_test', "level"=>3);クエリ計画を照会します。
explain select * from t1;observerログディレクトリ内でtrace_testを拡張子とする追跡ログを確認します。vi /home/admin/oceanbase/log/optimizer_trace_BkkGn1_trace_test.trac現在のセッションのオプティマイザー追跡機能を無効にします。
call dbms_xplan.disable_opt_trace();
Proxyがセッションを「保持」します。
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;現在のセッションのオプティマイザー追跡機能を有効にします。
call dbms_xplan.enable_opt_trace();追跡ログのレベルとログファイルの拡張子を設定します。
call dbms_xplan.set_opt_trace_parameter(identifier=>'trace_test', `level`=>3);クエリプランを確認します。
explain select * from t1;observerログディレクトリで、trace_testをサフィックスとするトレースログを確認します。vi /home/admin/oceanbase/log/optimizer_trace_BkkGn1_trace_test.trac現在のセッションのコンパイラによるトレース機能を無効にします。
call dbms_xplan.disable_opt_trace();
情報の解読
plan tableのフィールド紹介
フィールド |
説明 |
|---|---|
| OPERATOR | 演算子名 |
| NAME | スキャンするテーブル名 |
| EST.ROWS | オプティマイザーが推定した出力行数 |
| EST.TIME(us) | オプティマイザーが推定した演算子終了計算時間 |
| REAL.ROWS | 現在の演算子の実際の出力行数 |
| REAL.TIME(us) | 現在の演算子の実際の終了計算時間 |
| IO TIME(us) | 現在の演算子の待機時間(単位:マイクロ秒)。EXCHANGE IN、EXCHANGE OUT、PX COORD演算子については、この時間はネットワーク待機時間を示します。 |
| CPU TIME(us) | 現在の演算子のCPU時間(単位:マイクロ秒)。EXCHANGE IN、EXCHANGE OUT、PX COORD演算子については、この時間は実際のネットワークオーバーヘッドではないため、注意不要です。 |
optimizer infoの紹介
Optimization Info:
-------------------------------------
t1:
table_rows:3
physical_range_rows:1
logical_range_rows:1
index_back_rows:0
output_rows:1
table_dop:1
dop_method:Table DOP
avaiable_index_name:[idx_ct, idx_pc, t1]
pruned_index_name:[idx_ct, idx_pc]
stats version:0
dynamic sampling level:0
estimation method:[DEFAULT]
Plan Type:
DISTRIBUTED
Note:
Degree of Parallelisim is 1 because of table property
プロパティ名 |
説明 |
|---|---|
| table_rows | t1 テーブルの元の行数 |
| physical_range_rows | t1 テーブルでインデックス上をスキャンする必要がある物理行数 |
| logical_range_rows | t1 テーブルでインデックス上をスキャンする必要がある論理行数 |
| index_back_rows | t1 テーブルで再テーブルアクセスが必要な行数 |
| output_rows | t1 テーブルでフィルタリング後の行数 |
| table_dop | t1 テーブルスキャンの並列度 |
| dop_method | テーブルスキャンの並列度を決定する理由。TableDOP(テーブル定義の並列度)、AutoDop(オプティマイザーがコストに基づいて選択する並列度、auto dop機能を有効にする必要があります)、global parallel(parallelヒントまたはシステム変数で設定された並列度)が該当します。 |
| available_index_name | t1 テーブルで利用可能なインデックスのリスト |
| pruned_index_name | 現在のクエリでルールに基づいて削除されたインデックスのリスト |
| stats_version | t1 テーブルの統計情報バージョン番号。値が0の場合、そのテーブルの統計情報が収集されていないことを意味します。計画の正しい生成を保証するため、手動でそのテーブルの統計情報を収集してください。 |
| dynamic_sampling_level | 動的サンプリング(オプティマイザーの最適化ツールの一種、詳細は公式ドキュメントを参照)のレベル。値が0の場合、そのテーブルで動的サンプリングが使用されていないことを意味します。 |
| estimation_method | t1 テーブルの行数推定方法。DEFAULT(デフォルトの統計情報を使用する。この場合、行数の推定は非常に不正確であり、DBAによる最適化が必要です)、STORAGE(ストレージ層を使用したリアルタイム行数推定)、STATS(統計情報を使用した行数推定)が該当します。 |
| Plan Type | 現在の計画タイプ。LOCAL、REMOTE、DISTRIBUTEDが該当します。 |
| Note | その計画を生成した際のいくつかの備考情報。例えば、「Degree of Parallelisim is 1 because of table property」というのは、現在のテーブルの並列度が1に設定されているため、現在のクエリの並列度も1に設定されたことを意味します。 |
計画のパフォーマンスが悪い原因を迅速に特定する
CPU TIMEが高い上位N個の演算子を見つけ、EXCHANGE IN、EXCHANGE OUT、PX COORDのいくつかの演算子を除外します。以下の演算子がある場合:
- TABLE SCAN:Output & filter情報にis_index_back=trueの再テーブルアクセスがないか確認します。ある場合、optimizer info内のindex_back_rowsに注目します。行数が多い場合はインデックスの最適化が必要です。REAL.ROWSがEST.ROWSを大幅に上回る場合、統計情報が収集されているか、統計情報が古くなっていないか確認する必要があります(optimizer infoのstats versionフィールドで確認)。どちらもある場合、case when、likeなどの複雑なフィルタ条件がないか確認します。この場合、動的サンプリングを手動で有効にすることで、行数推定の精度を向上させることができます(/+dynamic_sampling(1)/)。この演算子がNested Loop JoinやSubPlan Filter演算子の右側にある場合、rescanが多すぎてオーバーヘッドが大きいことを意味します。
- Nested Loop Join:まず、左側の演算子の行数推定が正しいか確認します。行数の偏差が大きい場合、統計情報の問題に注目するか、動的サンプリングを有効にして行数推定の精度を向上させます(/+dynamic_sampling(1)/)。これらが効果がない場合、他の計画にバインドするために/+use_hash(xxx)/を使用します。行数推定が正常でもパフォーマンスが悪い場合、Output & filter情報に注目し、batch_joinが使用されていないか確認します。
- SubPlan Filter:まず、左側の演算子の行数推定が正しいか確認します。行数の偏差が大きい場合、統計情報の問題に注目するか、動的サンプリングを有効にして行数推定の精度を向上させます(/+dynamic_sampling(1)/)。行数推定が正常でもパフォーマンスが悪い場合、Output & filter情報に注目し、batchが使用されていないか確認します。上記の方法がすべて無効な場合、SQL内で対応するサブクエリを見つけ、/+unnest/で書き換えて最適化できないか確認する必要があります。
他の比較的遅い演算子については、行数推定と統計情報の状態に注目します。統計情報を収集したり、動的サンプリングを有効にしても改善が見られない場合、データ量が大きいことを意味します。並列実行を有効にする必要があります(/+parallel(xxx)/)。INSERT、UPDATE、DELETE、MERGEタイプの演算子については、PDMLを追加で有効にして最適化する必要があります(/+parallel(xxx) enable_parallel_dml/)。
HASH DISTINCT、SORT、HASH GROUP BY、HASH JOINなどの演算子にIO TIMEがある場合、これらの演算子にディスクへの書き込みが発生していることを意味します。sql_work_area_sizeパラメータを適切に調整できます。
opt_traceログの解読
この内容を理解するには、オプティマイザーの基礎知識と、OceanBaseオプティマイザーの基本的な動作原理を理解している必要があります。これには、反復的なクエリのリライトプロセス、インデックス最適化、ジョインの列挙、分散計画の最適化などが含まれます。
opt_traceログは以下の情報を記録します:
transformer:
- 各リライトルールがリライト前後のSQLを報告します。
- 各リライトルールがリライトされたりされなかったりした詳細な理由(hintの制御や何らかの条件が満たされていない場合など)。
optimizer:
- 使用された統計情報
- ベーステーブルパス生成ログ(プロセス条件、行数、コスト推定情報、skyline剪枝ルールプロセスを含む)
- join orderの詳細な列挙プロセス
- top演算子の割り当て、最適化プロセス
同時に、ログは各モジュール終了時に時間とメモリ使用量を記録します:
SECTION TIME USAGE: 233135 us
TOTAL TIME USAGE: 233135 us
SECTION MEM USAGE: 48744 KB
TOTAL MEM USAGE: 62961 KB
- SECTION TIME USAGEは、前の最適化ステップ終了から現在の最適化ステップ終了までに使用された時間を表します。
- TOTAL TIME USAGEは、クエリ最適化開始から現在の最適化ステップ終了までに使用された時間を表します。
- SECTION MEM USAGEは、前の最適化ステップ終了から現在の最適化ステップ終了までに使用されたテナントメモリを表します。
- TOTAL MEM USAGEは、クエリ最適化開始から現在の最適化ステップ終了までに使用されたテナントメモリを表します。
この情報により、計画生成に時間とメモリを消費する最適化ステップを迅速に特定し、対応する最適化機能をhintを使用して無効にすることで、問題を迅速に解決できます。これにより、計画生成コストを削減するために無理やりno_rewriteを使用してリライト全体を無効にする必要はなくなりました。
関連ドキュメント
- DBMS_XPLANシステムパッケージの詳細については、DBMS_XPLAN(MySQLモード)およびDBMS_XPLAN(Oracleモード)をご参照ください。