SQL Server 数据类型更改

3
在SQL Server中,我们有一张包含8000万条记录的表,目前有3个列数据类型为float。现在我们需要将float数据类型列更改为Decimal列。如何以最小的停机时间进行操作?
我们执行了通常的ALTER语句来更改数据类型,但日志文件已被填满并即将出现系统内存异常。因此,请告诉我更好的解决方法。
我们不能使用这种技术:创建3个新的临时列,按批更新现有数据,并删除现有列,然后将临时列重命名为实时列。
3个回答

1

我在我的一个项目中已经完全做到了同样的事情。以下是您可以遵循的步骤,其中包括最少的日志记录、最少的停机时间和最小的复杂性。

  1. 创建一个新表,使用相同的列名(如果需要索引,请在数据加载到新表后创建),但不同的名称,使用新的数据类型。例如,现有表为EMPLOYEE,则新表名应为EMPLOYEE_1。请注意,所有约束条件,如外键等,都可以在加载之前或之后创建,这不会对性能产生任何影响。但建议不要创建,因为现有表已经有了,所以你需要在重命名表之后重新命名所有约束条件。

  2. 记住,在新数据类型中具有最大精度,其最大精度值与现有表中可用的最大精度值相同。

  3. 使用SSIS快速加载选项将数据从现有表加载到新表中,以便在临时数据库中不会发生日志记录。

  4. 在停机期间将旧表重命名为EMPLOYEE_2,并将EMPLOYEE_1重命名为EMPLOYEE。

  5. 更改外键、默认值或任何其他约束条件的表定义。

  6. 上线并在较低的负载时间内为表创建索引。

通过使用这种方法,我们已经改变了表数据类型,其中有超过数十亿条记录。使用此方法,您可以最小化停机时间,并且登录到tempDB作为SSIS快速加载选项将不会记录任何内容到数据库中。

0

这段内容太长了,不适合作为评论。

以下是几种可能的解决方案:

最简单的方法是放弃。好吧,几乎是这样,但请按照以下步骤操作:

  • 将现有列重命名为其他名称(例如,_col
  • 添加一个计算列来进行转换。

如果数据很少被修改(因此您只需要读取访问权限),则可以创建一个新表。也就是说,将数据复制到具有正确类型的新表中,然后删除原始表并将新表重命名为旧名称。

您还可以通过交换表空间而不是重命名表来执行类似的操作。


0

另一种方法可能是:

  • 向表中添加一个具有正确数据类型的新列。
  • 将浮点列中的值批量插入到十进制列中,但每次处理 x 条记录。
  • 完成所有操作后,删除浮点列并将十进制列重命名为浮点列的名称。

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