Oracle11での削除は非常に遅いです。テーブルは外部キーによってリンクされており、すべての外部キー制約には削除カスケードが設定されています。
このDELETE FROM TOP_LEVEL_TABLE WHERE SOMETHING = 'whatever'
のようなステートメントで説明ボタンを押すと、他に30個のテーブルが含まれている場合でも、TOP_LEVEL_TABLE
の関与のみが表示されます。
より現実的な結果を得るにはどうすればよいですか?
これは不可能だと思います。
私が間違っていなければ、オプティマイザーは、ステートメントが他のテーブルにも「触れる」ことさえ知りません(または少なくとも知りようとはしません)。
明示的に文書化されていませんが、次の マニュアルからの引用 SQLステートメントで「参照されている」テーブルについてのみ説明しています(強調は私のものです)。
行ソースツリーは、実行プランの中核です。次の情報が表示されます。
-テーブルの順序 ステートメントによって参照されます
-ステートメントに記載されている各テーブルのアクセス方法
.。
重要な部分は、「ステートメントによって参照されるテーブル」だと思います。 「依存」テーブルについては言及されていません。
編集:
その情報を抽出する必要がある場合は、おそらくセッションをトレースしてTKPROF出力を確認する必要があります。
実行プランに含まれるテーブル全体を表示することはできません。 (カスケード外部キー制約による)ロックされたオブジェクトが考慮事項である場合は、次のクエリが役立ちます。
SYSTEM
スキーマで次のクエリを同時に実行し、それを更新して、どの依存テーブルが関与してロックされているかを確認します(場合によっては、tkprof
をチェックするよりも簡単です)。
SELECT l.OS_USER_NAME,
sys_context('userenv','ip_address') IP ,
NVL(l.Oracle_username, '(Oracle)') Oracle_USER_NAME,
obj.OBJECT_TYPE,
OBJECT_NAME,
Decode(l.locked_mode,
0, 'None',
1, 'Null (NULL)',
2, 'Row-S (SS)',
3, 'Row-X (SX)',
4, 'Share (S)',
5, 'S/Row-X (SSX)',
6, 'Exclusive (X)',
l.locked_mode) locked_mode ,
v.SID "SESSION_ID(SID)" ,
v.SERIAL# ,
v.INST_ID ,
'ALTER SYSTEM KILL SESSION '''||v.SID ||','||v.SERIAL# ||',@'|| v.INST_ID||''' IMMEDIATE; ' KILL_COMMAND
from v$locked_object l ,
dba_objects obj ,
gv$session v
where obj.OBJECT_ID=l.OBJECT_ID
and v.SID = l.SESSION_ID
and obj.OBJECT_NAME not like '%DR$%';