MS SQL Удалить записи старше месяца - PullRequest
0 голосов
/ 04 июня 2018

У меня есть данные, хранящиеся в базе данных MS SQL.Я хочу удалить все записи старше определенной даты.Для этого используется сервис, который отправляет запрос один раз в день, например:

delete from [log].[HttpRequestLogEntries] where DateTimeUtc < dateadd(day, -3, getutcdate())

, и он работает нормально, но очень медленно.В моей таблице может быть более 10kk строк и удаление может занять несколько часов для работы.Как решить эту проблему наилучшим образом?

1 Ответ

0 голосов
/ 04 июня 2018

Если не существует индекса с первым столбцом [DateTimeUtc], вы можете попробовать добавить его.Индексирование столбца в критериях поиска улучшило производительность массового удаления в некоторых наших базах данных.Компромисс заключается в том, что для поддержки записей индекса для вставок и обновлений может потребоваться дополнительное время.

Попробуйте удалить меньше строк за раз.Если вы удалите более 5000 строк одновременно, запрос на удаление может попытаться перейти к блокировке таблицы .Если есть много одновременных действий, попытка получить блокировку таблицы может заблокироваться, в то время как другие запросы завершены.

Например, этот цикл удаляет максимум 4000 строк за раз:

declare @RowCount int = 1
while @RowCount > 0
begin
    delete top (4000)
    from [log].[HttpRequestLogEntries]
    where DateTimeUtc < dateadd(day, -3, getutcdate())

    select @RowCount = @@rowcount
end

Также проверьте наличие триггеров базы данных.Если триггер срабатывает при удалении строк, возможно, код в триггере вызывает большую задержку.

...