SQL插入2亿条记录

时间:2016-11-24 02:47:35

标签: sql sql-server tsql

在尝试从事实表中选择

之后,我尝试将大约200M条记录插入到表中
  

System.OutOfMemoryException

以下是我的查询:

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

上述SELECT的结果返回200M记录,这些记录将插入表格中。

有人可以建议替代方案吗?

6 个答案:

答案 0 :(得分:2)

如上所述,不要马上完成所有事情。用较小的记录逐步完成它。以下是其他人做同样事情的示例:https://dba.stackexchange.com/questions/53831/large-insert-into-select-from-gradually-gets-slower

答案 1 :(得分: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;

答案 2 :(得分:1)

您可以批量执行此操作,例如每次执行一年或半年 以下是一次获得一年的数据。

     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

答案 3 :(得分:1)

如果您的目标表上有索引,请删除它们并在插入后创建它们。

答案 4 :(得分:1)

使用SQL Server Integration Services

  

Integration Services包含丰富的内置任务和转换功能;用于构建包的工具;以及用于运行和管理包的Integration Services服务。您可以使用图形化Integration Services工具创建解决方案,而无需编写任何代码。或者,您可以对广泛的Integration Services对象模型进行编程,以编程方式创建包,并编写自定义任务和其他包对象。

enter image description here

答案 5 :(得分:0)

尝试插入较小的记录集。从选择2012年全部开始。错误是因为没有足够的内存来分配。您的选择查询占用了所有内存,这就是我建议选择较少数据的原因。