2016-11-24 171 views
0

我試圖從一個事實表做了選擇後插入各地200M記錄到一個表,但一個SQL插入200萬條記錄

的System.OutOfMemoryException

以下是我的查詢:

Select 
    ProductID, 
    SaleDate, 
    Quantity 
from 
    dbo.Product 
where 
    SaleDate BETWEEN '2012-01-01' AND '2016-01-01'; 

上述SELECT的結果返回200M記錄這是在表中被插入。

有人可以提出一種替代方案嗎?

+1

哪裏'insert'? –

+0

我沒有包含INSERT,因爲INSERT是使用自定義插件執行的。該插件獲取SELECT的結果並插入到目標表中。 –

+0

什麼自定義插件? – scsimon

回答

0

嘗試插入較小的記錄集。從選擇2012年的全部開始。由於沒有足夠的內存來分配,所以錯誤是拋出的。您的選擇查詢耗盡了所有內存,這就是爲什麼我建議選擇較少的數據。

1

發生錯誤System.OutOfMemoryException是因爲SSMS沒有足夠的內存來分配大的結果。如果可能,請使用row_number()嘗試一小組數據。

SELECT * FROM (
    Select ROW_NUMBER() OVER(ORDER BY ProductID,SaleDate,Quantity) AS rowid, 
    ProductID,SaleDate,Quantity 
    from dbo.Product where SaleDate BETWEEN '2012-01-01' AND '2016-01-01' 
    ) foo 
WHERE rowid BETWEEN 1 AND 500000; 
1

你可以在批處理中做到這一點,例如每次做一年或半年 以下是獲得一年數據的一次。

 DECLARE @StartYear INT =2012,@EndYear INT =2016,@iYear INT 
    SET @[email protected]+1 
    WHILE @iYear<@EndYear 
    BEGIN 
     Select ProductID,SaleDate,Quantity from dbo.Product where SaleDate BETWEEN DATEADD(yy,@iYear-1900,0) AND DATEADD(yy,@iYear+1-1900,0); 
     SET @iYear+=1 
    END 
1

如果您的目標表上有索引,請將其刪除並在插入後創建它們。

1

使用SQL Server Integration Services

Integration Services包括一組豐富的內置任務和轉換;用於構建包的工具;以及用於運行和管理軟件包的Integration Services服務。您可以使用圖形集成服務工具來創建解決方案,而無需編寫一行代碼;或者您可以編寫大量的Integration Services對象模型以編程方式創建程序包並編寫自定義任務和其他程序包對象。

enter image description here