繁体   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