在在线环境中对非常大的表进行结构更改

时间:2011-03-04 14:48:14

标签: sql sql-server-2005 tsql

所以这就是我所面对的。

问题

  • 一张大桌子,大约230,000,000 行。
  • 我们要改变 聚类索引和主键 这张桌子给了一个简单的bigint 身份领域。还有一个 空字段被添加到表中, 供将来使用。
  • 现有表格 有一个复合键。为了 争论,让我们说它是2个bigint的。 第一个可能有1或10,000 '儿童'在第二部分 键。

要求

  • 最短的停机时间,最好是 运行所需的时间长度 SP_Rename。
  • 现有行可能会更改 而我们正在复制数据。更新 必须反映在新表中。

  1. 在现有桌子上放置一个触发器, 如果它更新新表中的行 那里已经存在了。
  2. 遍历原始表格,复制数据 进入新表〜一次10,000个。 也许2000的第一部分 旧钥匙。
  3. 副本是 完成后,将旧表重命名为 “ExistingTableOld”和新的 从“NewTable”到“ExistingTable”。 这应该允许存储过程 继续无干预地运行
  4. 计划中是否有任何明显的遗漏,或者我忽略的最佳实践?

2 个答案:

答案 0 :(得分:1)

难题。你的计划听起来不错,但只要你在READ UNCOMMITTED的事务隔离级别运行它以停止生成锁,我就不能完全确定你是否真的需要批处理查询。

答案 1 :(得分:1)

我进行大型架构更改的经验是,在维护窗口期间 - 在晚上/周末 - 当用户从系统启动时 - 最好进行大的更改。就像使用修复选项运行dbcc checkdb一样。然后,当事情向南时,您可以选择在开始升级之前回滚到您提供的完整备份。

列表中的

项目#3 :重命名旧/新表。您可能希望重新编译存储过程/视图。我的经验是执行计划是绑定对象ID而不是对象名称。

考虑表dbo.foo:如果将其重命名为dbo.foo_old,则任何存储过程或用户定义的函数在重新编译依赖对象并且其执行计划重新出现之前不一定会出错。缓存的执行计划继续完美无缺。

sp_recompile是你的朋友。