2011-11-24 76 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 
相關問題