sql server将大表转储到另一个表中

时间:2014-12-10 15:40:26

标签: sql-server tsql

我目前正在将表的Id字段更改为IDENTITY字段。这很简单:创建临时表,将所有数据复制到临时表,调整表中的所有引用以指向和指向新临时表,删除旧表,重命名临时表原来的名字。

现在我遇到了复制步骤耗时太长的问题。实际上该表没有太多条目(约750万行),但它仍然需要几个小时才能完成。

我目前正在使用如下查询移动数据:

  

SET IDENTITY_INSERT MyTable_Temp ON

     

INSERT INTO MyTable_Temp([Fields])SELECT [Fields] FROM MyTable

     

SET IDENTITY_INSERT MyTable_Temp OFF

我已经将 bcp cmdshell 和以下 BULK INSERT 结合使用,但我不喜欢这个解决方案首先将数据写入临时文件,然后将其转储回新表。

是否有更有效的方法将数据从旧表复制或移动到新表?这可以在“纯粹的”T-SQL中完成吗?

请记住,数据是正确的(不涉及外部来源),并且在传输过程中不会对数据进行任何更改。

1 个答案:

答案 0 :(得分:0)

您的方法看起来很公平,但insert命令生成的事务太大,这就是为什么需要这么长时间。

我在过去处理这个问题的方法是使用游标和批处理机制。

一次只执行100000行操作,您将看到重大改进。

复制完成后,您可以重建引用并最终删除旧表...依此类推。复制数据后,请小心重新设置新表格。