我有一个名为Book的非常大的表(约1300万行)。我想在Book表的一列中设置主键,但因为它是一个非常大的表,服务器在更新期间崩溃。它耗尽内存。所以我创建了一个BookTemp表,我在这个空表中设置所有的主键,然后我想从Book插入数据到BookTemp表。但是,如果我立即做到这一点,内存再次用完。所以我想使用游标为了插入10,000行,然后擦除RAM,但我真的是新的游标,所以在这一点上,我希望你的帮助。使用游标将数据从一个表复制到另一个表
我使用SQL Server 2008 R2
我有一个名为Book的非常大的表(约1300万行)。我想在Book表的一列中设置主键,但因为它是一个非常大的表,服务器在更新期间崩溃。它耗尽内存。所以我创建了一个BookTemp表,我在这个空表中设置所有的主键,然后我想从Book插入数据到BookTemp表。但是,如果我立即做到这一点,内存再次用完。所以我想使用游标为了插入10,000行,然后擦除RAM,但我真的是新的游标,所以在这一点上,我希望你的帮助。使用游标将数据从一个表复制到另一个表
我使用SQL Server 2008 R2
我会用while循环遍历您的临时表建议。例子here应该让你开始。
或者您也可以修改此:
DECLARE @counter AS INT = 0;
DECLARE @batch_size AS INT = 10000;
WHILE (@counter < (SELECT MAX(id) FROM temp_table))
BEGIN
INSERT INTO the_table
SELECT * FROM temp_table
WHERE id BETWEEN @counter AND (@counter + @batch_size - 1);
SET @counter = @counter + @batch_size;
END
当执行以下三个命令将通过清理缓存腾出SQL Server内存。
DBCC FREESYSTEMCACHE
DBCC FREESESSIONCACHE
DBCC FREEPROCCACHE
然而,它可以被用在上去的操作,因此请参阅吹塑查询,将每个10000存储通过执行上述DBCC命令之后清零。
DECLARE @counter INT = 1
DECLARE cur_Data_Transfer CURSOR FOR -- Cursor declared
SELECT column1, column2 -- select desired columns
FROM Book
OPEN cur_Data_Transfer --Opening Cursor
FETCH NEXT FROM cur_Data_Transfer INTO @column1, @column2 --Put values to variable
WHILE @@FETCH_STATUS = 0 -- Faching is success
BEGIN
INSERT INTO BookTemp (column1, column2) -- Inserting to temptable
VALUES(@column1, @column2)
IF @counter = 10000
BEGIN
DBCC FREESYSTEMCACHE -- Clear System Cache
DBCC FREEPROCCACHE -- Clear Proc Cache
SET @counter = 0 -- Restarting counter
END
FETCH NEXT FROM cur_Data_Transfer INTO @column1, @column2
SET @counter = @counter + 1
END
CLOSE cur_Data_Transfer -- Closing cursor
DEALLOCATE cur_Data_Transfer -- De-allocating
服务器崩溃了吗?我*真的*无法想象。也许它变得没有反应,但它肯定不会崩溃。尝试将您的[数据库恢复模型](http://msdn.microsoft.com/zh-cn/library/ms189275.aspx)更改为“简单”,然后再添加主键(先做完整备份以确保安全)。这样操作将不会被记录,并且应该更快地执行。禁用任何触发器也是一个好主意。 – Tomalak