我在 SQL Server 2008 R2 中有一个近十亿行的表。我想将两列的数据类型从 int 更改为 bigint。两次ALTER TABLE zzz ALTER COLUMN yyy
有效,但速度很慢。我怎样才能加快这个过程?我正在考虑将数据复制到另一个表,删除,创建,复制回并切换到简单恢复模式,或者以某种方式使用游标一次 1000 行,但我不确定这些是否真的会导致任何改进。
问问题
27409 次
2 回答
39
根据您所做的更改,有时进行维护窗口会更容易。在该窗口期间(没有人应该能够更改表中的数据),您可以:
- 删除任何指向旧列的索引/约束,并禁用触发器
- 使用新数据类型添加一个新的可为空列(即使它是 NOT NULL)
- 更新新列,将其设置为旧列的值(您可以在单个事务的块中执行此操作(例如,使用 一次影响 10000 行
UPDATE TOP (10000) ... SET newcol = oldcol WHERE newcol IS NULL
)并使用 CHECKPOINT 以避免超出日志) - 更新完成后,删除旧列
- 重命名新列(并在适当时添加 NOT NULL 约束)
- 重建索引和更新统计信息
这里的关键是它允许您在第 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 回答