我们目前正在运行一个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还创建和删除用于保存某些记录的临时表。
注:如果我提供的信息不完整,请回复,如果可能的话,我很乐意添加更多的信息。
发布于 2008-10-04 09:20:21
唯一不清楚的是,ArchiveItems也从数据库中删除或不删除数据。在Server中删除行是一项非常昂贵的操作,它会导致数据库上的许多锁定条件,可能会有表和数据库锁,这通常会导致超时。
如果要删除数据,您可以做的是:
的方式发出250个delete命令花费的时间要少得多
希望这会有所帮助,但从Server归档和删除数据是一项非常艰巨的工作。
发布于 2008-10-04 11:23:58
当ArchiveItems进程删除100条记录时,它正在锁定表。确保索引已到位,以使delete快速运行;在此时间段内运行Profiler会话,并查看需要多长时间。如果日期字段正在进行表格扫描或索引扫描以查找记录,则可能需要在该字段上添加索引。
在最终用户端,您可以在查询中添加一个READUNCOMMITTED或NOLOCK提示;这允许在删除过程中运行查询,但可能会返回即将删除的记录。
还要考虑作业的不同时间框架;找出用户活动最少的时间,或者在维护窗口期间每月只归档一次。
发布于 2008-10-08 15:27:39
正如另一张海报所提到的,缓慢删除通常是由于没有合适的索引,或者一个合适的索引需要重建。
在删除过程中,通常会将锁升级为行->页->表。你减少锁定
添加行锁提示的memory)
当someCondition开始时
删除一些行
-给其他程序一个机会.WAITFOR延迟'000:00:00.250‘
END
我不会使用NOLOCK提示,如果删除是在发生其他活动期间发生的,并且您希望保持数据的完整性。
https://stackoverflow.com/questions/170021
复制相似问题