我有一個名爲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