我目前正在将表的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中完成吗?
请记住,数据是正确的(不涉及外部来源),并且在传输过程中不会对数据进行任何更改。
答案 0 :(得分:0)
您的方法看起来很公平,但insert命令生成的事务太大,这就是为什么需要这么长时间。
我在过去处理这个问题的方法是使用游标和批处理机制。
一次只执行100000行操作,您将看到重大改进。
复制完成后,您可以重建引用并最终删除旧表...依此类推。复制数据后,请小心重新设置新表格。