代码之家  ›  专栏  ›  技术社区  ›  RussellH

SQL Server中的批量更新和提交频率

  •  3
  • RussellH  · 技术社区  · 17 年前

    我的数据库背景主要是Oracle,但我最近一直在帮助一些SQL Server工作。我的团队继承了一些SQL Server DTS包,这些包每天都会加载和更新大量数据。目前,它在SQL Server 2000中运行,但很快将升级到SQL Server 2005或2008。大规模更新运行太慢。

    4 回复  |  直到 17 年前
        1
  •  2
  •   Peter K Peter K    17 年前

    我使用过SQL Server2000/2005、DB2、ADABAS,以上都是适用的。我真的看不出Oracle的工作方式有什么不同。

    在单个表扫描中发出frequest提交比运行具有较小处理数的多个扫描更可取,因为通常如果需要表扫描,即使只返回一小部分,也会扫描整个表。

    远离快照。快照只会增加IO的数量,并争夺IO和CPU

        2
  •  1
  •   beach    17 年前

    一般来说,我发现批量更新更好——通常在100到1000之间。这一切都取决于你的表的结构:外键?触发器?或者只是更新原始数据?你需要进行实验,看看哪种情况最适合你。

    如果我使用纯SQL,我会做这样的事情来帮助管理服务器资源:

    SET ROWCOUNT 1000
    WHILE 1=1 BEGIN
        DELETE FROM MyTable WHERE ...
        IF @@ROWCOUNT = 0
            BREAK
    END
    SET ROWCOUNT 0
    

    在这个例子中,我正在清除数据。只有当您可以限制或以其他方式选择性地更新行时,这才适用于UPDATE。(或者只将xxxx行数插入到可以对其进行JOIN的辅助表中。)

    但是,是的,尽量不要一次更新xx百万行。这需要很长时间,如果发生错误,所有这些行将被回滚(这需要额外的很长时间)

        3
  •  0
  •   Sam Saffron James Allen    17 年前

    假如 或 你有桌锁 (tablockx)与所有涉及的表相比,批次的表现可能会更差。特别是当批处理强制进行表扫描时。

    一个需要注意的是,非常复杂的查询通常会消耗tempdb上的资源,如果tempdb空间不足(因为执行计划需要一个非常复杂的哈希连接),你就有大麻烦了。

        4
  •  0
  •   HLGEM    17 年前

    当您迁移到SQL Server 2005或2008时,您将需要重做SSIS中的所有DTS包。我想你会惊喜地发现SSIS可以快得多。