SQL Server 数据类型更改

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

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

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

我们不能像这样使用这种技术:创建 3 个新的临时列并批量更新现有数据,删除现有列并将临时列重命名为实时列。

最佳答案

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

  1. 使用具有相同列名的新数据类型创建新表(如果表需要任何索引,则没有索引创建一次数据将加载到新表中)但名称不同。例如,现有表是 EMPLOYEE,那么新表名应该是 EMPLOYEE_1。请记住所有约束,如外键以及您在加载之前或加载之后可以创建的所有内容,它们不会对性能产生任何影响。但建议不要创建,因为现有表具有在重命名表后重命名的约束名称。

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

  3. 使用具有快速加载选项的 SSIS 将数据从现有表加载到新表,这样日志就不会在临时数据库中发生。

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

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

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

通过使用这种方法,我们已经更改了我们拥有超过数十亿条记录的表数据类型。使用这种方法,您可以最大限度地减少停机时间并登录到 tempDB,因为 SSIS 快速加载选项不会在数据库中记录任何内容。

关于SQL Server 数据类型更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42975718/

相关文章:

sql - 仅将时间存储在 HH24 :MM format in a table? 中可能吗?

asp.net - 如何在 Eval 格式字符串中使用单引号

sql - 将 Sybase ASE 特定的 *= 和 =* 转换为 LEFT/RIGHT OUTER JOIN

c++ - 为什么 C++ 模板类型匹配不检索引用限定符 '&'?

sql - 两个连接表之间的关系

sql - 将列转置为表格

tsql - 添加一列并在 SQL Server 2008 中的同一存储过程中更新它

c# - 只从列表 executereader 中获取单个值

scala - 类型符号与Scala反射镜之间的关系

Python:为什么这个数组是一个对象而不是 float ?