2016-11-24 173 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