Я работаю над 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)
, но это занимает бесконечные часы.
затем попытался
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 есть несколько индексов и индекс на col1 на таблице2. анализируются все таблицы и индексы.
Просьба сообщить, есть ли способ оптимизации для этого сценария.
Спасибо, ребята.
Если ваш код действительно выглядит так, вы будете фиксировать для каждой строки после строки 100000, что, вероятно, не то, что вы хотите, и будет медленным, конечно. Задайте свой cnt: = 0 после фиксации –
Ya counter требует перезагрузки Я думаю, что это была опечатка. Но я предпочел отказаться от индексов и воссоздать, поскольку главный ответ –