哪些因素会降低SQL Server 2000作业的性能?

时间:2008-10-04 09:10:20

标签: sql-server performance

我们目前正在运行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还创建和删除用于保存某些记录的临时表。

注意:如果我提供的信息不完整,请回复,如果可能,我很乐意添加更多信息。

3 个答案:

答案 0 :(得分:1)

唯一不明确的是ArchiveItems还删除了数据库中的数据。删除SQL Server中的行是一项非常昂贵的操作,会导致数据库出现大量锁定情况,可能会导致表和数据库锁定,这通常会导致超时。
如果您要删除数据,您可以执行的操作是:

  • 在相关行上设置“逻辑”删除标记,并在查询中将其视为读取数据
  • 批量执行删除操作。我发现(在我的应用程序中)在每个事务中删除大约250行可以提供更快的操作,比单独发布250 delete命令花费的时间少得多

希望这会有所帮助,但是从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提示。