Один параллельный запрос Oracle может упростить код и повысить производительность.
declare
execute immediate 'alter session enable parallel dml';
delete /*+ parallel */
from moc_attribute_value
where id in (select id from ORPHANS_MAV);
update OrphansInconsistenDelProgress
set currentTable = 'ORPHANS_MAV',
totalToDelete = sql%rowcount;
commit;
end;
/
В общем, мы хотим либо позволить Oracle разбить задачу на части, либо использовать наши собственные фрагменты. Кажется, что оригинальный код выполняет обе функции: он считывает данные в виде фрагментов, а затем передает каждый блок для дальнейшего разделения на параллельное удаление. Этот подход порождает множество мелких деталей, и Oracle, вероятно, тратит много времени на такие вещи, как координация потоков.
Удаление большого количества строк стоит дорого, потому что нет способов избежать REDO и UNDO. Возможно, вы захотите изучить использование параметров DDL, таких как усечение раздела или удаление и повторное создание таблицы. (Но будьте осторожны при воссоздании объектов, сложно полностью воссоздать сложные объекты. Мы склонны забывать такие вещи, как привилегии и параметры таблиц.)
Настройка параллелизма и больших заданий сложна. Важно использовать лучшие инструменты мониторинга, чтобы гарантировать, что Oracle запрашивает, выделяет и использует правильное количество параллельных процессов и что план выполнения верен. Одним из сильных преимуществ использования одного оператора SQL является то, что вы можете использовать отчеты мониторинга SQL в реальном времени для мониторинга прогресса. Если у вас есть лицензии Diagnostics and Tuning Pack, найдите SQL_ID
в GV$SQL
и сгенерируйте отчет с помощью select dbms_sqltune.report_sql_monitor('your SQL_ID here');
.