我们目前正在运行SQL作业,每天晚上10点归档数据。但是,最终用户抱怨从晚上10点到12点,该页面显示超时错误。
这是作业的伪代码
while @jobArchive = 1 and @countProcecessedItem < @maxItem
exec ArchiveItems @countProcecessedItem out
if error occured
set @jobArchive = 0
delay '00:10'
ArchiveItems存储过程抓取30天前创建的前100个项目,处理并将其存档在另一个数据库中,并删除原始表中的项目,包括与其相关的其他表格。最后使用处理的项目数设置@countProcecessedItem。 ArchiveItems还创建和删除用于保存某些记录的临时表。
注意:如果我提供的信息不完整,请回复,如果可能,我很乐意添加更多信息。
答案 0 :(得分:1)
唯一不明确的是ArchiveItems还删除了数据库中的数据。删除SQL Server中的行是一项非常昂贵的操作,会导致数据库出现大量锁定情况,可能会导致表和数据库锁定,这通常会导致超时。
如果您要删除数据,您可以执行的操作是:
希望这会有所帮助,但是从SQL Server归档和删除数据是一项非常艰巨的工作。
答案 1 :(得分:1)
当ArchiveItems进程正在删除100条记录时,它正在锁定表。确保您有适当的索引以快速删除;在该时间范围内运行Profiler会话并查看需要多长时间。如果正在执行表扫描或索引扫描以查找记录,则可能需要在日期字段上添加索引。
在最终用户方面,您可以在查询中添加READUNCOMMITTED或NOLOCK提示;这允许查询在删除发生时运行,但可以返回即将删除的记录。
同时考虑工作的不同时间表;找到用户活动最少的时间,或者仅在维护时段内每月进行一次归档。
答案 2 :(得分:1)
正如另一张海报所提到的,缓慢的DELETE通常是由于没有合适的索引或合适的索引需要重建而引起的。
在DELETE期间,锁升级ROW并不罕见 - &gt; PAGE - &gt;表。您可以通过
减少锁定添加ROWLOCK提示(但请注意 它可能会消耗更多的内存)
对行进行随机化 删除(使锁升级减少 可能)
最简单:添加短WAITFOR ArchiveItems
尽管有些条件 BEGIN
删除一些行
- 给其他进程一个机会...... WAITFOR DELAY'000:00:00.250'
END
如果在其他活动发生期间发生删除,并且您希望保持数据的完整性,我不会使用NOLOCK提示。