SQL批量更新到包含许多索引的大型表

时间:2018-05-22 17:11:54

标签: sql sql-server tsql sql-optimization

我们有一个包含18列的表,其中7列为列,行数超过1亿。它有6个非聚集索引,其中5个具有我需要更新的列。

主键(clustered)是一个uniqueidentifier,名为EntityID

我需要使用包含我需要同步的值的不同表来更新此表上的一个位标志。我的经理让我写更新以批量运行,因为即使是最小的更新也需要一段时间,因为表中的所有索引和剪切行数。他还要求更新运行基于EntityID排序的ASC,他提到了一些关于减少正在读取的页面的内容。

我已经编写了5个不同版本的已分类批量更新,并且它们可以正常工作,但我很有兴趣看看是否已经有一个很好的模板我可以用来做这个。

2 个答案:

答案 0 :(得分:1)

select 1 
while(@@rowcount > 0)
begin
    update top (100000) t
    set t.bit = s.bit 
    from table t 
    join tbls s 
      on s.EntityID = t.EntityID 
     and t.bit != s.bit
end

我建议不要排序。让查询优化器做它的事情。

如果你有任何t.bit为null我会单独进行,因为or会降低更新速度。

我建议您禁用所有索引,更新,然后在索引中启用。

答案 1 :(得分:0)

您需要进行一些测试,这实际上取决于您是否可以在此期间停止其他查询,但通常 更快

  • 删除索引
  • 执行插入/更新
  • 重新创建索引