2011-11-24 42 views
0

我有一个名为Book的非常大的表(约1300万行)。我想在Book表的一列中设置主键,但因为它是一个非常大的表,服务器在更新期间崩溃。它耗尽内存。所以我创建了一个BookTemp表,我在这个空表中设置所有的主键,然后我想从Book插入数据到BookTemp表。但是,如果我立即做到这一点,内存再次用完。所以我想使用游标为了插入10,000行,然后擦除RAM,但我真的是新的游标,所以在这一点上,我希望你的帮助。使用游标将数据从一个表复制到另一个表

我使用SQL Server 2008 R2

+1

服务器崩溃了吗?我*真的*无法想象。也许它变得没有反应,但它肯定不会崩溃。尝试将您的[数据库恢复模型](http://msdn.microsoft.com/zh-cn/library/ms189275.aspx)更改为“简单”,然后再添加主键(先做完整备份以确保安全)。这样操作将不会被记录,并且应该更快地执行。禁用任何触发器也是一个好主意。 – Tomalak

回答

1

我会用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 
0

当执行以下三个命令将通过清理缓存腾出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 
相关问题