1

问题

更新数千万行表的列的最佳方法是什么?

1)我看到创建一个新表并在完成后重命名旧表

2)我看到使用临时表批量更新

3)我看到了单笔交易(虽然不喜欢这个)

4)永远不要听游标解决这样的问题,我认为不值得尝试

5)我读过关于从文件加载数据(使用 BCP),但没有读到性能是否更好。不清楚它是否只是复制,或者它是否允许加入一个带有某些东西的大表,然后是公牛复制。

真的很想在这里有一些建议。

优先级是性能

目前我正在测试解决方案 2) 和探索解决方案 5)

附加信息(更新)

谢谢你在这里的批判性思维。

  • 该操作在停机时间内完成。
  • UPDATE 不会导致行转发
  • 所有的表都有索引,平均有 5 个索引,虽然很少有表有 13 个索引。
  • 目标列的概率出现在表索引之一中,例如 50%。
  • 有些表可以重建和替换,有些则不能,因为它们是软件解决方案的一部分,我们可能会失去对这些表的支持。从那些表中,一些得到了触发器。
  • 我需要为 600 多个表执行此操作,其中 ~150 的范围从 80 万到 3500 万行
  • 更新始终在各个字段的同一列中

参考

用于数据传输的 BCP

4

1 回答 1

0

其实这取决于:

  • 关于表包含的索引数
  • UPDATE 操作前后的行大小
  • UPDATE 类型 - 它会到位吗?是否需要修改行长
  • 该操作是否会导致行转发?
  • 桌子有多大?
  • UPDATE 命令的事务日志有多大?
  • 该表是否包含触发器?
  • 可以在停机时间内完成操作吗?
  • 操作过程中会修改表吗?
  • 是否允许最少的日志记录操作?
  • 整个 UPDATE 事务是否适合事务日志?
  • 桌子可以重建和更换新的吗?
  • 在测试环境中操作的时间是什么?
  • 数据库中的可用空间怎么样 - 是否有足够的空间用于表的副本?
  • 要执行什么样的 UPDATE 操作?是否必须执行额外的 SELECT 命令来计算每一行的新值?还是静态变化?

根据测试环境中操作的答案和结果,我们可以认为最快的操作是:

  • 表的最小日志记录副本
  • 就地更新操作,最好是分批进行
于 2018-02-02T21:24:38.413 回答