MS SQL 删除超过一个月的记录

Ser*_*aev 1 sql-server sql-delete

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

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

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

Pau*_*ams 5

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

考虑一次删除更少的行。如果您一次删除超过 5,000 行,则删除查询可能会尝试升级为表锁。如果存在大量并发活动,则在其他请求完成时获取表锁的尝试可能会阻塞。

例如,此循环最多一次删除 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
Run Code Online (Sandbox Code Playgroud)

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