更新数千万行表的列的最佳方法

时间:2018-02-02 15:55:07

标签: sql-update sybase-ase sybase-ase15

问题

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

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

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

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

4) 从来没有听过像这样的问题的光标解决方案,我认为这不值得尝试

5)我读过关于从文件加载数据(使用BCP),但是如果性能更好或没有读取则没有读取。目前尚不清楚它是否只是为了复制,或者它是否允许加入一张大桌子,然后再用牛皮复制。

我真的希望在这里有一些建议。

优先级是性能

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

其他信息(更新)

谢谢你们在这里的批判性思考。

  • 操作在停机时间完成。
  • 更新不会导致行转发
  • 所有的表都是索引,平均有5个索引,尽管很少有表格 像13个索引一样。
  • 目标列的概率出现在其中一个表中 索引类似于50%。
  • 有些表可以重建和替换,有些则不能,因为它们 成为软件解决方案的一部分,我们可能会失去对它们的支持。 从这些表中可以看到一些触发器。
  • 我需要为超过600个表格执行此操作,其中~150范围 80万至3500万行
  • 更新始终位于各个字段的同一列中

参考

BCP for data transfer

1 个答案:

答案 0 :(得分:0)

实际上取决于:

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

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

  • 表的最小日志副本
  • 优选分批进行UPDATE操作