DBMS_XPLANシステムパッケージは、論理計画の最適化追跡など、論理計画管理に関連する機能を提供します。
システムパッケージについて
display_cursor
機能紹介
OceanBaseデータベースは、ユーザーが実行したすべてのクエリの計画(物理計画および論理計画を含む)を保存し、ユーザーが後から問題の調査に利用できるようにします。ユーザーが履歴のクエリ計画を読みやすくするために、OceanBaseデータベースは関連するDBMSパッケージを提供しています。EXPLAIN で生成される論理実行計画とは異なり、ユーザーが実際に実行したクエリ計画はデータベースに常に保存され、ユーザーが接続を切断しても即座に無効になることはありません。デフォルトでは、これらの実行計画は以下の条件を満たした場合にクリーンアップされます:
- メモリ圧力による淘汰:実行計画が多数保存されている場合、システムは古い計画の淘汰をトリガーします。
- 手動クリーンアップ:ユーザーは
ALTER SYSTEM FLUSH PLAN CACHEコマンドを使用して、キャッシュを手動でクリアできます。 - クラスタ再起動:計画キャッシュはクラスタ再起動時に完全にリセットされます。
関連パッケージ関数説明
-- 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:ユーザー接続のセッションID。proxyセッションIDではなく、サーバーのセッションIDです。
- format:計画の形式。上記と同じです。
- svr_ip、svr_port:セッションが存在するノードのIPアドレス。デフォルトは現在のセッションが接続しているノードの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 hintまたはシステム変数で設定された並列度)が該当します。 |
| 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列挙の詳細なプロセス
- トップ演算子の割り当て、最適化プロセス
同時に、ログは各モジュール終了後に時間とメモリ使用量を記録します:
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モード)