在巨大的表中更改列类型

时间:2012-05-25 12:43:47

标签: sql sql-server sql-server-2008 sql-server-2008-r2

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

2 个答案:

答案 0 :(得分:29)

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

  1. 删除指向旧列的所有索引/约束,并禁用触发器
  2. 使用新数据类型添加新的 nullable 列(即使它意味着非NULL)
  3. 更新新列设置它等于旧列的值(您可以在单个事务的块中执行此操作(例如,使用UPDATE TOP (10000) ... SET newcol = oldcol WHERE newcol IS NULL一次影响10000行)和CHECKPOINT以避免超出日志)
  4. 完成所有更新后,请删除旧列
  5. 重命名新列(并在适当时添加NOT NULL约束)
  6. 重建索引并更新统计信息
  7. 这里的关键是它允许您在步骤3中以递增方式执行更新,而这在单个ALTER TABLE命令中是无法执行的。

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

    修改

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

答案 1 :(得分:-3)

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