Ser*_*aev 1 sql-server sql-delete
我有数据存储在 ms sql 数据库中。我想删除早于某个日期的所有记录。为此,使用了每天发送一次请求的服务,例如:
delete from [log].[HttpRequestLogEntries] where DateTimeUtc < dateadd(day, -3, getutcdate())
它工作正常,但速度很慢。在我的表中可以有超过 10kk 行,删除工作可能需要几个小时。如何以最好的方式解决这个问题?
如果没有第一列 [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)
此外,检查数据库触发器。如果在删除行时触发触发器,则触发器中的代码可能导致长时间延迟。
| 归档时间: |
|
| 查看次数: |
1230 次 |
| 最近记录: |