私はoracle 9iで作業しています。私は約135,000,000のレコードを持つテーブルを持っています。 10,000,000行すべて索引付けされています。oracleで多数のデータを含むクエリを削除する
新しいビジネス要件として、これから約70,000,000行を削除する必要があります。
私は別のテーブルとして削除する行のバックアップを作成しました。
Table1 <col1, col2........> -- main table (135,000,000 rows)
Table2 <col1, col2........> -- backup table (70,000,000 rows)
下記の削除クエリを試行しました。
Delete from table1 t1 where exists (select 1 from table2 t2 where t2.col1 = t1.col1)
ですが、無限の時間がかかります。
はその後も、まだ以上12時間稼動してい
declare
cursor c1 is
select col1 from table2;
c2 c1%rowtype;
cnt number;
begin
cnt :=0;
open c1;
loop
fetch c1 into c2;
exit when c1%notfound;
delete from table1 t1 where t1.col1 = c2.col1;
if cnt >= 100000 then
commit;
end if;
cnt:=cnt+1;
end loop;
close c1;
end;
を試してみました。まだ完了していません。
table1に複数のインデックスがあり、table2にcol1のインデックスがあることに注意してください。すべてのテーブルとインデックスが分析されます。
このシナリオに対して最適化の方法があるかどうかを教えてください。
ありがとうございます。
あなたのコードが本当にそうであれば、100000行後のすべての行にコミットします。これはおそらくあなたが望むものではなく、遅くなります。 コミット後にあなたのcnt:= 0を設定してください –
yaカウンターをリセットする必要があります。しかし、私はインデックスを削除し、トップの回答として再作成することをお勧めします。 –