在Sql Server中将整型主键转换为大整型

11
我们有一个生产表格,拥有七亿七千万行及以上数据。我们想要/需要将主ID列从int类型更改为bigint类型,以便应对未来的增长(并避免32位整数空间耗尽时的突然停止)。
在DEV中进行的实验表明,这并不像简单地修改列那样容易,因为我们需要删除索引,再重新创建。到目前为止,在比PROD规模小一些的DEV中,删除索引的操作已经超过了1个半小时,而此表格是24/7运营的,使其离线如此之久是不可接受的。
有没有其他替代方案?还有其他人遇到类似情况吗?你们是怎么完成的?
编辑:附加信息:
- 主键是聚集的

你的主键也是聚簇键吗? - Martin Smith
3个回答

11

您可以尝试分阶段的方法。

  1. 创建一个新的bigint列
  2. 创建一个插入触发器,以保持新条目与2个列同步
  3. 执行更新操作,将bigint列中的所有空值填充为转换后的值
  4. 将表上的主索引从旧id列更改为新列
  5. 指定任何FK和查询使用新列
  6. 更改新列成为标识列并从第2步中删除插入触发器
  7. 删除旧的ID列

您应该在这7个步骤中分摊痛苦,而不是一次性解决问题。


只是补充一下,外键可以指向唯一索引,而不仅仅是主键,所以4并不是必需的。 - Martin Smith
你可能想在某个时候将新的主键设置为聚集索引。可能是在第4步或第6步。 - Rich Hill
你如何确切地完成第6个任务? - Aaron Bertrand

1
创建一个并行表,使用更长的数据类型来存储新行,并将结果进行 UNION 操作?

0
我需要做的是将数据复制到一个具有所需结构(仅主/聚集键,完成后仅非聚集/外键)的新表中。如果没有足够的空间,您可以将数据 bcp 出来再导回去。您可能需要应用程序停机才能实现这一点。
不起作用的方法:由于主键,无法更改表 Orderhistory 的列 ID bigint。不要删除键并更改列,因为这只会填充日志文件并比复制/bcp 要花费更长时间。
永远不要使用 SSMS 工具设计师更改列属性,它会将表复制到临时表中,然后完成后进行重命名。查找 alter table alter column 语法并使用它,如果您修改了位于表中间的较宽的列,则可能需要进行碎片整理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接