在MS Sql Server中执行长时间运行的架构更改(或数据更新)的最佳方法是什么?

时间:2016-10-13 20:45:25

标签: sql sql-server tsql

我需要改变大表(数百万行)上列的大小。它将被设置为nvarchar(n)而不是nvarchar(max),因此根据我的理解,它不会是一个很长的变化。但是,由于我将在生产中这样做,所以我想了解它的后果需要很长时间。

我是否应该从SSMS点击F5,就像执行普通查询一样?如果我的机器崩溃会怎么样?还是去睡觉?进行长时间运行更新的一般最佳做法是什么?它应该被安排为服务器上的工作吗?

由于

1 个答案:

答案 0 :(得分:3)

请不要只是按F5。我这样做了一次,丢失了表中的所有数据。根据更改,为您创建的更新语句实际上将数据存储在内存中,删除表,创建具有所需更改的新表,并从内存中填充数据。但是在我的情况下,我做的一个更改是添加一个唯一约束,因此填充失败,并且当语句结束时,内存中的数据被删除。这给我留下了新的空表。

我会创建您正在更改的表,以及您想要的更改,作为新表。然后在新表中选择*,然后在单个语句中重命名表。如果在运行时有可能将数据输入到表中并且这是一个问题,您可能需要锁定表。

根据表的大小和语句的持续时间,您可能希望以后保存锁定和重命名,并在新表的初始填充后执行新数据的差异填充并重命名表格。

很抱歉这篇长篇文章。

编辑: 此外,如果连接因持续时间而超时,则在DB服务器上本地运行insert语句。您也可以创建一个作业并运行它,但它基本上是相同的。