在SQL Server 2008中使用Insert语句插入大量数据时出错



我正在尝试将记录插入到具有大量数据的表中

文件描述:

Size : 65.0 MB
Records count : 10000

我的样本数据:

INSERT INTO tbldata(col1,col2,col3)values(col1,col2,col3)
GO
INSERT INTO tbldata(col1,col2,col3)values(col1,col2,col3)
GO
INSERT INTO tbldata(col1,col2,col3)values(col1,col2,col3)
GO
INSERT INTO tbldata(col1,col2,col3)values(col1,col2,col3)
GO
.......
INSERT INTO tbldata(col1,col2,col3)values(col1,col2,col3)
GO
INSERT INTO tbldata(col1,col2,col3)values(col1,col2,col3)
GO 
.......
UPTO 10000 ROWS

错误:

Exception of type 'System.OutOfMemoryException' was thrown.(mscorlib)

我尝试过:我验证了这个答案

在SQLServer\Properties\Memory下,有一个"每次查询的最小内存"设置。您可以临时提高这个数字,以帮助增加GO语句之间的记录数。在我的案例中,我将其提高到5000(10000导致系统内存不足错误,不好),所以我选择了5000,经过几次测试,我发现我现在可以导入大约20000行,所以我每20000行放置一个GO语句(大约需要10分钟),我能够在一个查询中导入超过200000行。

SQL Server 2005的最大批处理大小为65536*网络数据包大小(NPS),其中NPS通常为4KB。计算结果为256MB。这意味着您的插入语句平均每条5.8 KB。这似乎不对,但也许里面有多余的空间或不寻常的东西。

我的第一个建议是在每个INSERT语句后面加一个"GO"语句。这将把一批45000条INSERT语句分解为45000个单独的批。这应该更容易消化。要小心,如果其中一个插入失败,你可能很难找到罪魁祸首。您可能希望通过交易来保护自己。如果编辑器具有良好的搜索和替换功能(这将允许您搜索和替换像\r\n这样的返回字符)或宏功能,则可以快速添加这些语句。

第二个建议是使用向导直接从Excel导入数据。向导在后台为您构建一个小SSIS包,然后运行它。不会有这个问题

从内存不足异常获得的引用

最新更新