Хранимая процедура. Как быстро удалить большое число записей по критерию, если delete затупливает?
Есть хранимая процедура, которая вычищает раз в неделю старые данные из таблиц. Delete очень сильно снижает быстродействие (несколько сотен тысяч записей требуется удалить), truncate тоже нельзя использовать. Вопрос- есть ли какие хитрости на этот счёт, типа bulk например (мне кажется подошло бы)? Может брать по тысяче записей в delete и зациклить? У заказчика еще Win Server 2003 старенькие, что еще более ухудшает процесс. Очень надеюсь на вашу помощь)
Анастасия Носова: Без запроса конечно судить трудно, но возможно что запрос содержит вложенные запросы в фильтрации, а также тяжелые JOIN. Я так понимаю что строки на удаление выбираются не только по дате, но и по некоторым косвенным признакам. Может добавить запросик в текст вопроса?
DECLARE Employee_Cursor CURSOR FOR
select IterationCallsID FROM ViewOfClearingCache
OPEN Employee_Cursor;
FETCH NEXT FROM Employee_Cursor INTO @eid;
WHILE @@FETCH_STATUS = 0
BEGIN
delete
from IterationCalls
where IterationCalls.id = @eid;
FETCH NEXT FROM Employee_Cursor;
END;
CLOSE Employee_Cursor;
DEALLOCATE Employee_Cursor;
--Удаляем старые задания на обзвон
delete
from IterationCalls
where IterationCalls.id in (select top 100 IterationCallsID FROM ViewOfClearingCache)
--Удаляем старые звонки
delete
from Calls
where Calls.id in (select CallsID FROM ViewOfClearingCache)
--Удаляем мертвые итерации
delete
from Iteration
where Iteration.id (select Iteration.id FROM Iteration WHERE ImportDateTime < 2015-07-30 in select IterationID FROM ViewOfClearingCache)
--Удаление мертвых заданий на обзвон
delete
from CallsIBS
where CallsIBS.id in (select CallsIBS.id FROM CallsIBS LEFT OUTER JOIN Calls ON CallsIBS.id = Calls.CallIBSId where CallIBSId is NULL)
Сколько всего записей у вас в таблице?
Проиндексированы ли поля, по которым выбираются записи на удаление.
Если вы удаляете большую часть данных - возможно имеет смысл перенести только нужные данные в отдельную таблицу, удалить старую таблицу, переименовать новую таблицу в старую, построить необходимые индексы.