Я точно не являюсь пользователем базы данных, и большая часть моей работы с db была с MySQL, так что простите меня, если что-то в этом вопросе невероятно наивно.
Мне нужно удалить 5.5 миллионов строк из таблицы Oracle, содержащей около 100 миллионов строк. У меня есть все ID строк, которые мне нужно удалить во временной таблице. Если бы это было всего несколько тысяч строк, я бы сделал это:
DELETE FROM table_name WHERE id IN (SELECT id FROM temp_table);
COMMIT;
Есть ли что-нибудь, о чем я должен знать, и/или делать по-другому, потому что это 5,5 миллионов строк? Я думал о выполнении цикла, что-то вроде этого:
DECLARE
vCT NUMBER(38) := 0;
BEGIN
FOR t IN (SELECT id FROM temp_table) LOOP
DELETE FROM table_name WHERE id = t.id;
vCT := vCT + 1;
IF MOD(vCT,200000) = 0 THEN
COMMIT;
END IF;
END LOOP;
COMMIT;
END;
Прежде всего - это то, что я думаю, что это - пакетная обработка составляет 200 000 штук за раз? Предполагая, что это так, я по-прежнему не уверен, что лучше создать 5.5 миллионов SQL-операторов и совершить в партиях 200 000, или иметь один оператор SQL и совершить все сразу.
Идеи? Лучшие практики?
РЕДАКТИРОВАТЬ. Я запустил первый вариант, один оператор удаления, и для разработки потребовалось всего 2 часа. Исходя из этого, он поставил в очередь на производство.