![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как побыстрее удалить большую часть записей из таблицы ?
ANB © (2005-05-17 10:50:00)В таблице было 17 миллионов записей. Дамп из-за этого 3.5Г. Поднимается долго. И места на винте маловато. А нужен он только для тестов. Решил оставить не больше миллиона записей. Попробавал удалить одним delete - через час кончился роллбэк сегмент. Поставил на удаление в цикле по 1000 записей с коммитом. Вот так :
declare
i number;
-- 17139893
begin
i := 0;
while (i <= 17000000) loop
delete from PC_EX_JOURNAL tbl where rownum <= 1000;
Commit;
i := i + 1000;
end loop;
end;
Вчера с 15.00 до 10.30 удалилось только 6 миллионов. Пока скрипт работает - мой комп жутко тормозит. Мне уже надоело сидеть в форуме Потрепаться, работать надо. Как бы это ускорить ?
ANB (2005-05-17 11:07:00) [1]Круто. 15 секунд и все готово. Спасибо.
Reindeer Moss Eater (2005-05-17 11:02:00) [2]Если удаление делать прямо из основной таблицы разбивая это на небольшие транзакции, то сегмент отката конечно выдержит. Но журналвсе равно распухнет на весь размер удаляемых данных, так как delete - протоколируемая операция.
Просто транкейт основной тоже не подойдет - он удаляет все записи.
Поэтому только через доп. таблицу.
Reindeer Moss Eater (2005-05-17 10:56:00) [3]В твоем случае правильнее делать так:
Создавать промежуточную таблицу с помощью create table as select .....
Затем транкейт основной таблице.
А затем вставка в нее того, что в промежуточной.
Sergey13 (2005-05-17 10:55:00) [4]Может стОит попробовать переписать нужные записи во временную таблу, затранкейтить исходную и перелить из временной (или переименовать ее если констрейнтов немного)?
ANB (2005-05-17 10:51:00) [5]Поставил отметку Oracle - почему то не села.
ANB (2005-05-17 10:51:00) [6]Поставил отметку Oracle - почему то не села.