MS SQL删除早于月份的记录

时间:2018-06-04 15:28:39

标签: sql-server sql-delete

我有数据存储在ms sql数据库中。我想删除所有早于某个日期的记录。 为此,使用的服务每天发送一次请求,例如:

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

它工作正常,但速度很慢。在我的表中可能超过10kk行,删除可能需要数小时才能完成工作。 如何以最佳方式解决这个问题?

1 个答案:

答案 0 :(得分:4)

如果没有[DateTimeUtc]第一列的现有索引,您可以尝试添加一个。对搜索条件中的列建立索引可以提高某些数据库的批量删除性能。权衡是插入和更新可能需要额外的时间来维护索引条目。

考虑一次删除较少的行。如果一次删除超过5,000行,则删除查询可能会尝试escalate to a table lock。如果存在大量并发活动,则获取表锁的尝试可能会在其他请求完成时阻止。

例如,此循环一次最多删除4,000行:

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

    select @RowCount = @@rowcount
end

另外,检查数据库触发器。如果在删除行时触发了触发器,则触发器中的代码可能会导致长时间延迟。