我目前正在尝试将包含大约300多列的1.8亿条记录的文本文件导入到我的sql server数据库中。不用说文件大约70 GB。我已经好几天了,当我接近的时候会发生一些事情,它会对我产生影响。我需要最快捷,最有效的方式来执行此导入。我已经尝试了本来应该是最简单的向导,然后我尝试将其保存为ssis包。我还没有弄清楚如何使用我认为可行的设置进行批量导入。我不断得到的错误是“虚拟内存不足”。我将虚拟内存更改为36演出。我的系统有24个物理内存。请帮帮我。
答案 0 :(得分:1)
如果您正在使用BCP(并且您应该使用这么大的文件),请使用批量大小。否则,BCP将尝试在一个事务中加载所有记录。
按命令行:bcp -b 1000
通过C#:
using (System.Data.SqlClient.SqlBulkCopy bulkCopy =
new System.Data.SqlClient.SqlBulkCopy(sqlConnection))
{
bulkCopy.DestinationTableName = destinationTableName;
bulkCopy.BatchSize = 1000; // 1000 rows
bulkCopy.WriteToServer(dataTable); // May also pass in DataRow[]
}
以下是this MSDN article的重点:
将大型数据文件作为单个批次导入可能会有问题,因此 bcp和BULK INSERT允许您以一系列批次导入数据 其中小于数据文件。每批都是导入的 登录一个单独的交易...
答案 1 :(得分:0)
尝试将SQL Server的最大服务器内存减少到尽可能低的范围。 (右键单击Mgmt Studio中的SQL实例 - >属性 - >内存)。
这可以释放足够的内存用于OS& SSIS处理这么大的文本文件。
我假设整个过程在服务器上本地发生。
答案 2 :(得分:0)
我遇到了与SQL 2012类似的问题,并尝试将大约700万条记录导入(作为测试)到数据库中。我也耗尽了内存,不得不将批量导入减少到更小的部分。需要注意的一点是,导入进程使用的所有内存(无论您采用何种方式)都占用大量内存,并且在重新启动服务器之前不会释放所述系统内存。我不确定这是否是SQL Server的预期行为,但它是您的项目需要注意的事项。
因为我在这个过程中使用了SEQUENCE命令,所以我必须利用保存为sql脚本的T-sql代码,然后小块地使用SQLCMD来减少内存开销。
你必须玩弄适用于你的东西,强烈建议不要一次性运行脚本。
将它分解成较小的部分然后将其导入,这将是一个痛苦的屁股,但从长远来看,你会更快乐。