【问题标题】:What factors that degrade the performance of a SQL Server 2000 Job?哪些因素会降低 SQL Server 2000 作业的性能?
【发布时间】:2010-09-15 06:18:35
【问题描述】:

我们目前正在运行一个每天晚上 10 点归档数据的 SQL 作业。然而,最终用户抱怨从晚上 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 还创建和删除用于保存一些记录的临时表。

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

【问题讨论】:

    标签: sql-server performance


    【解决方案1】:

    唯一不清楚的是 ArchiveItems 是否也从数据库中删除或不删除数据。在 SQL Server 中删除行是一项非常昂贵的操作,会导致数据库上出现大量锁定条件,并且可能会出现表和数据库锁定,这通常会导致超时。
    如果您要删除数据,您可以执行以下操作:

    • 在相关行上设置一个“逻辑”删除标志,并在您执行读取数据的查询中考虑它
    • 批量执行删除。我发现(在我的应用程序中)在每个事务中删除大约 250 行可以提供更快的操作,比以单独的方式发出 250 删除命令花费的时间要少得多

    希望这会有所帮助,但是从 SQL Server 归档和删除数据是一项非常艰巨的工作。

    【讨论】:

    • >唯一不清楚的是 ArchiveItems 是否也删除了我所做的数据库中的数据。抱歉,如果忘记在描述中添加它。
    【解决方案2】:

    虽然 ArchiveItems 进程正在删除 100 条记录,但它正在锁定表。确保您有索引以使删除快速运行;在该时间范围内运行 Profiler 会话并查看需要多长时间。如果它正在执行表扫描或索引扫描以查找记录,您可能需要在日期字段上添加索引。

    在最终用户方面,您可以在查询中添加 READUNCOMMITTED 或 NOLOCK 提示;这允许查询在删除发生时运行,但有可能返回即将被删除的记录。

    还要考虑不同的工作时间范围;找到用户活动最少的时间,或者在维护窗口中每月只归档一次。

    【讨论】:

      【解决方案3】:

      正如另一张海报提到的,DELETE 缓慢通常是由于没有合适的索引,或者需要重建合适的索引。

      在 DELETE 期间,锁升级 ROW -> PAGE -> TABLE 的情况并不少见。你减少了锁定

      • 添加 ROWLOCK 提示(但请注意 它可能会消耗更多内存)

      • 随机排列 已删除(减少锁升级 可能)

      • 最简单的:在 归档项目

        虽然有些条件 开始

        删除一些行

        -- 给其他进程一个机会... 等待延迟'000:00:00.250'

        结束

      如果删除发生在其他活动发生期间,并且您希望保持数据的完整性,我不会使用 NOLOCK 提示。

      【讨论】:

        猜你喜欢
        • 2011-09-15
        • 2016-08-18
        • 1970-01-01
        • 1970-01-01
        • 2019-02-22
        • 2014-01-12
        • 1970-01-01
        • 1970-01-01
        • 2016-02-25
        相关资源
        最近更新 更多