削除は、削除された行全体を保存する必要があるため、ロールバック(元に戻す)スペースの使用に関して最もコストのかかる操作です(一方、挿入ステートメントを元に戻すには、データベースにROWIDを保存する必要があります)。問題の最も簡単な解決策は、UNDO表領域にファイルを追加することです。
しかし、あなたは言う
「セグメントのサイズを大きくできません」
これは少し驚くべきことです。結局のところ、最近のディスクは安価です。恐らくあなたはあなたが近づくのが怖い怒っているDBAを持っていますか?しかし、DBAは、データベースを維持できるようにデータベースをプロビジョニングする義務を果たしていません。率直に言って、元に戻るスペースが不十分なVLDB(ペタバイトやゼタバイトの最近でも、1億行のテーブルがそのように数えられる)を持っているのはばかげています。
しかし、データセンターでミントタウルスを髭を生やさないのであれば、コードを変更するだけです。これが1つのオプションです。これを考えると...
select id
from tableB
where tableB.column1='somevalue'
and tableB.date between date1 and date2
... 100万行を返すため、から削除しようとする行が多すぎるtableA場合は、より少ない行を返すサブクエリを試すことができます。演習の目的上、toで指定された範囲は30日であると想定していますdate1。date2それに応じて、次のコードを調整する必要があります。
for i in 1..10 loop
delete from tableA
where tableA.fk in (select id
from tableB
where tableB.column1='somevalue'
and tableB.date between date1 + (3 * (i-1)) and date1 + (3 * i)
;
commit;
end loop
これにより、選択が10個の3日間のチャンクに分割されます。この方法でそれを行うにははるかに長い時間がかかりますが、Undoテーブルスペースを爆破するべきではありません。