23

我在 SQL Server 2008 R2 中有一个近十亿行的表。我想将两列的数据类型从 int 更改为 bigint。两次ALTER TABLE zzz ALTER COLUMN yyy有效,但速度很慢。我怎样才能加快这个过程?我正在考虑将数据复制到另一个表,删除,创建,复制回并切换到简单恢复模式,或者以某种方式使用游标一次 1000 行,但我不确定这些是否真的会导致任何改进。

4

2 回答 2

39

根据您所做的更改,有时进行维护窗口会更容易。在该窗口期间(没有人应该能够更改表中的数据),您可以:

  1. 删除任何指向旧列的索引/约束,并禁用触发器
  2. 使用新数据类型添加一个新的可为列(即使它是 NOT NULL)
  3. 更新新列,将其设置为旧列的值(您可以在单个事务的块中执行此操作(例如,使用 一次影响 10000 行UPDATE TOP (10000) ... SET newcol = oldcol WHERE newcol IS NULL)并使用 CHECKPOINT 以避免超出日志)
  4. 更新完成后,删除旧列
  5. 重命名新列(并在适当时添加 NOT NULL 约束)
  6. 重建索引和更新统计信息

这里的关键是它允许您在第 3 步中以增量方式执行更新,而您无法在单个 ALTER TABLE 命令中执行此操作。

这假设该列在数据完整性中没有发挥主要作用——如果它涉及一堆外键关系,那么还有更多步骤。

编辑

另外,只是大声想知道,我没有对此进行任何测试(但将其添加到列表中)。我想知道页面+行压缩是否会有所帮助?如果将 INT 更改为 BIGINT,则在适当的压缩后,SQL Server 仍应将所有值视为仍然适合 INT。同样,我还没有测试这是否会使更改更快或更慢,或者首先添加压缩需要多长时间。只是把它扔在那里。

于 2012-05-25T12:49:56.630 回答
-6

如果您使用的是 SQL Server Management Studio 之类的东西,您只需转到数据库中的表,右键单击,选择“设计”,然后选择要编辑的列:将其设置为 bigint 并点击保存。更改整个列,但以前的值将保持不变。这对于允许表“从”int 到 bigint 是有好处的,但据我所知不会更改现有数据。

于 2015-01-10T06:28:37.217 回答