1.背景
SQLが最適化する場合、Navicatやplsql Explain Planなどの実行プランを使用することがよくありますが、実際には結果は推定値にすぎないため、テスト環境の実行が速くなり、本番環境の速度が遅くなります。
以下に示すように:
AUTOTRACEまたはEXPLAINPLAN FORを使用して取得された実行プランは、PLAN_TABLEから取得されます。PLAN_TABLEはセッションレベルの一時テーブルであり、内部の実行プランはSQLの実際の実行プランではなく、オプティマイザーによってのみ推定されます。
実際の実行計画は見積もられるべきではなく、実際に実行されるべきです。SQL実行実行プランは共有プール、特にデータディクショナリVS QLPLANに存在し、A-Timeの実行プランはVSQL_PLANから、A-Timeの実行プランはVSQLPLANから、A-の実行プランは時間は実際の実行プランであるVSQL_PLANから取得され、AUTOTRACEおよびEXPLAIN PLAN FORを介して取得された実行プランは、オプティマイザーによって推定された実行プランのみです。(注1)
2.では、実際の実行計画を取得するにはどうすればよいですか?
まず、動的パフォーマンスビューにアクセスできる必要があります。次のステートメントを使用して認証できます
grant select any dictionary to QAS_R_BIZ;
権限を取得したら、次の手順に分けて実行します(スーパー管理者は必要ありません)
2.1次のステートメントを実行します
alter session set statistics_level = all;
(この手順は現在のセッションウィンドウで有効です。省略できます。以下で説明します)
2.2最適化するSQLを実行します。
select /* gather_plan_statistics */ R.RU_ID AS ruId,
R.MU_ID AS muId,
R.RU_NAME AS ruShortName,
D.YW_DM AS YWDM,
D.yws AS YWDMCOUNT
from T_REGIONAL_UNIT r
LEFT JOIN T_MANAGE_UNIT m
on r.MU_ID = m.MU_ID
left join (select YW_DM, sum(YW_DM_COUNT) as yws, SWJGDM
from T_DAILY_SELF_SERVICE_HALL_YWS
where SNAPSHOT_DATE between
TO_DATE('2020-01-14 00:00:00', 'YYYY-MM-DD HH24:MI:SS') AND
TO_DATE('2020-12-14 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
group by YW_DM, SWJGDM) D
on m.MU_CODE = D.SWJGDM
where 1 = 1
and r.parent_ID = 10000
order by r.display_index, D.YW_DM
前の手順を実行しない場合は、ステートメントに/ + collect_plan_statistics /を追加する必要があります。
2.3実行されたステートメントのSQLIDを調べます。次に例を示します。
select * from v$sql where sql_text like '%gather_plan_statistics%'
結果は次のとおりです。
2.4 SQLIDに基づいて実行計画を見つける
select * from table(dbms_xplan.display_cursor( '3ayyrp8bkzmb6'、null、 'allstats last'));
効果は次のとおりです。
それをコピーしてnotepad ++に貼り付けます。すべてのクエリ結果を表示するには、[最後のページを取得]ボタンをクリックし、左上隅をクリックしてすべてを選択することを忘れないでください。
メモ帳またはnotepad ++に貼り付けます。効果は次のとおりです。
A-RowsやA-Timeなどのフィールドがさらにあることがわかります。
Startsは、この操作の実行数を表します
。E-Rowsは、オプティマイザーによって推定された行数を表します。つまり、通常の実行プラン
の行数です。A-Rowsは、実際の行数を
表します。A-Timeは、累積された合計を表します。時間。通常の実行プランとは異なり、通常の実行プランの時間は偽物ですが、A-Timeは本物です。
バッファは累積論理読み取りを意味します。
読み取りは累積物理読み取りを意味します。
実際の実行プランは、A-Time(リアルタイム)、A-Rows(実際の行番号)、Starts(ステップ実行時間)など、SQL実行に関する実際の情報を提供します。データベース以外の開発者にとっては、非常に直感的で便利です。