В зависимости от конкретных потребностей у вас есть несколько вариантов повышения скорости удаления.
Во-первых, храните группу идентификаторов в массиве PL / SQL и периодически (и в конце) выполняйте либо УДАЛИТЬ массив FORALL, либо УДАЛЯТЬ ИЗ таблицы WHERE ID в (: arr (1),: arr (2) ...)
Во-вторых, сохраняйте идентификаторы в ГЛОБАЛЬНОЙ ВРЕМЕННОЙ ТАБЛИЦЕ и периодически / в конце выполняйте УДАЛЕНИЕ ИЗ таблицы, ГДЕ ИД В (ВЫБОР ИД ИЗ Global_temp_tbl)
Эти два параметра, очевидно, задерживают этап удаления, поэтому могут влиять на SQL внутри цикла, используя эти таблицы.
В-третьих, перейти на статический SQL. Я не вижу здесь преимущества динамического SQL (но вы, возможно, упростили пример так, что преимущество скрыто). Переключение на статическое сократит количество мягких разборов (Oracle хэширует оператор и находит совпадение в своем кэше операторов). Эта экономия может или не может быть значительным в вашем случае. В основном это будет время процессора, но, возможно, некоторое время ожидания, если у вас одновременно запущены другие процессы.
В-четвертых, если издержки мягкого анализа значительны, но есть причина, по которой вы не хотите переключаться на статический SQL, вы можете использовать DBMS_SQL. Там DBMS_SQL.PARSE будет вне цикла, и только компоненты BIND_VARIABLE и EXECUTE будут внутри цикла.