У меня есть таблица PROD_MAIN, которая имеет 750 миллионов записей в одной базе данных. Инфраструктура базы данных является очень простой и не содержит никаких RAC. Это всего лишь 1 база данных. Требование состоит в том, чтобы удалить записи, возраст которых превышает 1 год. Я написал код PL SQL с параллельной подсказкой и массивом. Это займет очень много времени. Пожалуйста, найдите код ниже.Удаление миллионов записей без параллельной подсказки и навального сбора
ALTER SESSION ENABLE PARALLEL DML;
DECLARE
TYPE TABLE_DELETE IS TABLE OF ROWID;
T_DELETE TABLE_DELETE;
CURSOR C_DELETE IS
SELECT /*+ PARALLEL(10) */ ROWID FROM PROD_MAIN WHERE RECORD_DATE < (TRUNC(SYSDATE) - 366);
L_DELETE_BUFFER PLS_INTEGER := 50000;
BEGIN
OPEN C_DELETE;
LOOP
FETCH C_DELETE BULK COLLECT
INTO T_DELETE LIMIT L_DELETE_BUFFER;
FORALL I IN 1..T_DELETE.COUNT
DELETE /*+ PARALLEL(10) */ PROD_MAIN WHERE ROWID = T_DELETE(I);
EXIT WHEN C_DELETE%NOTFOUND;
COMMIT;
END LOOP;
CLOSE C_DELETE;
COMMIT;
END;
ALTER SESSION DISABLE PARALLEL DML;
Я также сделал NOLOGGING на столе. Я создал индексы и собирал стат, но производительность не улучшилась. Итак, есть ли другой способ, по которому я могу удалить миллионы записей в течение 3 - 5 часов?
Какую часть строк вы удаляете? –
@ Justin Cave: Я удаляю строки, которым больше 1 года. При проверке общее количество записей, которые необходимо удалить, составляет 400 миллионов из 750 миллионов. –
ОК. И у вас есть пара часов простоя? Есть ли триггеры на столе? Является ли это родительской или дочерней таблицей в ограничении внешнего ключа? –