簡體   English   中英

SQL插入2億條記錄

[英]SQL to insert 200 Million records

在從事實表中進行選擇后,我試圖將大約 200M 記錄插入到表中,但是

System.OutOfMemoryException

以下是我的查詢:

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

上述SELECT的結果返回 200M 記錄,這些記錄要插入到表中。

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

如前所述,不要一次做所有的事情。 用較小的記錄逐步完成它。 這是其他人做同樣事情的示例: https ://dba.stackexchange.com/questions/53831/large-insert-into-select-from-gradually-gets-slower

你可以分批做,比如每次做一年或半年以下是一次獲取一年的數據。

     DECLARE @StartYear INT =2012,@EndYear INT =2016,@iYear INT 
     SET @iYear=@StartYear+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

發生錯誤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;

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

使用SQL Server 集成服務

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

在此處輸入圖像描述

嘗試插入較小的記錄集。 從選擇所有 2012 年開始。由於沒有足夠的內存分配,錯誤被拋出。 您的選擇查詢占用了所有內存,這就是我建議選擇較少數據的原因。

前段時間我需要將大約 2000 萬行從一個表插入到另一個表。 我的解決方案是將插入拆分為小段 SQL 語句。 使用打印命令,我生成了數千個查詢並順利完成了我的遷移。 我這樣做的詳細方法在這里https://yarkul.com/how-smoothly-insert-millions-of-rows-in-sql-server/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM