SQL Server数据类型更改

时间:2017-03-23 12:13:50

标签: sql sql-server-2008 types database-administration

在SQL Server中,我们拥有8000万条记录的表,现在有3列数据类型浮动。现在我们需要将float数据类型列更改为Decimal列。如何以最短的停机时间进行?

我们执行了通常的ALTER语句来更改数据类型,但日志文件已填满并进入系统内存不足异常。所以请让我更好地解决这个问题。

我们无法使用这种技术类似:创建3个新的临时列并批量更新现有数据并删除现有列并将临时列重命名为实时列。

3 个答案:

答案 0 :(得分:1)

我在我的一个项目中做了完全相同的事情。以下是您可以遵循的步骤,其中最小的日志记录,最短的停机时间和最低的复杂性。

  1. 使用具有相同列名的新数据类型创建新表(如果表需要在新表中加载数据时创建索引,则不使用索引)但名称不同。例如,现有表是EMPLOYEE,那么新表名应为EMPLOYEE_1。请记住所有约束,例如外键,以及在加载之前或加载之后可以创建的所有约束都不会影响性能方面的任何因素。但是建议不要创建,因为现有表具有重命名表后重命名的约束名称。

  2. 请记住,新数据类型的最大精度为现有表格中可用的最大精度值。

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

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

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

  6. 上线并在桌面上以较低的加载时间创建索引。

  7. 通过使用这种方法,我们改变了表数据类型,其中我们有超过数十亿条记录。使用这种方法可以减少停机时间并登录tempDB,因为SSIS快速加载选项不会记录数据库中的任何内容。

答案 1 :(得分:0)

评论太长了。

其中一种方法可行。

最简单的方法是放弃。差不多,但要做到以下几点:

  • 将现有列重命名为其他内容(例如,_col
  • 添加执行转换的计算列。

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

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

答案 2 :(得分:0)

另一种方式可能是:

  • 使用正确的数据类型向表中添加新列。
  • 将float列中的值插入到十进制列中,但是在x个记录的批量中执行。
  • 完成所有操作后,删除浮点列并将十进制列重命名为浮点列名称。