Я работаю над оракулом 9i. У меня есть таблица с 135 000 000 записей, где каждый раздел имеет ок. 1000000 строк все проиндексировано и все.
Мне нужно удалить около 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)
но это занимает бесконечные часы.
затем попытался
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;
даже он работает уже более 12 часов. и все еще не завершено.
Обратите внимание, что в таблице 1 есть несколько индексов, а в таблице 2 - индекс col1. все таблицы и индексы проанализированы.
Пожалуйста, сообщите, если есть какой-либо способ оптимизации для этого сценария.
Спасибо, ребята.