Какую проблему вы пытаетесь решить? Я предполагаю, что вы беспокоитесь о производительности, но вы говорите, что проблема в том, что «журнал заполнится», что может указывать на то, что вы столкнулись с некоторой ошибкой в процессе.
Какая часть данных в таблице удаляется?
Если вы удаляете все данные из таблицы, вы можете вместо этого сделать TRUNCATE
.
TRUNCATE TABLE <<table name>>
- это оператор DDL, который удалит все данные из таблицы. Поскольку это DDL и его нельзя откатить, генерируется очень мало REDO и UNDO (Oracle имеет отдельные средства для REDO и UNDO, а SQL Server помещает оба в один и тот же журнал транзакций).
Если вы удаляете большую часть данных из таблицы, вероятно, было бы эффективнее
INSERT /*+ APPEND */ INTO staging_table( column_list )
SELECT column_list
FROM table_name
WHERE <<criteria for the data to save>>
TRUNCATE TABLE table_name;
INSERT /*+ APPEND */ INTO table_name( column_list )
SELECT column_list
FROM staging_table
Может быть еще эффективнее удалить старую таблицу и переименовать промежуточную таблицу в имя старой таблицы, но это может потребовать воссоздания ряда ограничений и индексов.
Если вы регулярно занимаетесь чем-то вроде архивирования старых данных, другой возможностью будет разделение таблицы по некоторому столбцу даты и периодическое удаление самого старого раздела. Это также очень эффективно, но для него требуется опция разделения, которая является дополнительной опцией по сравнению с лицензией Enterprise Edition.