SQL Server导入比批量导入更快

bulkinsert sqlbulkcopy sql-server

我有一个大的(~50Gb,~300毫升行)制表符分隔文件,我想导入到SQL Server表中,列为: char(10), varchar(512), nvarchar(512), nvarchar(512)

使用T-SQL,SSIS或C# SqlBulkCopy类批量导入它大约需要一天时间。

有没有更快的方法来加载这些数据?

或者可能有一些条件减慢它,我可以删除或更改?

一般承认的答案

如果要插入现有表,请在导入之前删除所有索引,然后在导入后重新创建它们。

如果您使用的是SSIS,则可以调整批处理和提交大小。

验证服务器上是否有足够的内存用于如此大的数据加载。

在本地服务器上执行加载操作(在本地复制文件,不要通过网络加载)。

将目标数据库和事务日志自动增长选项配置为合理的值,例如一次几百MB的块(对于主数据文件.mdf,默认值通常增长1MB)。增长操作缓慢/昂贵,因此您希望尽量减少这些。

确保您的数据和日志文件位于快速磁盘上,最好是在单独的LUN上。理想情况下,您希望将日志文件放在日志文件中的镜像单独LUN上(您可能需要与存储管理员或主机提供商联系以获取选项)。


热门答案

我过去几周一直在与优化非常大的负载进行斗争。 BULK INSERT是我用BCP发现的最快的方式,而不是SSIS或TSQL Bulk Insert,但你可以做些什么来调整它。

  • 尝试提高/降低每批次的行设置,以在CPU和内存之间移动资源压力(更高将减少CPU,更低将减少内存)。
  • 如果存在聚簇索引,或者非聚簇索引删除它们并在插入后重新创建它们
  • 使用.NET工具将TSV拆分为较小的文件,然后将它们并行加载到表中。这需要表是一个堆(Clustered index drop)
  • 确保记录最少。对于堆,这需要TABLOCK,对于聚簇索引,它需要跟踪标志610并且要求数据长袍的排序与聚簇索引密钥相同。要么需要SIMPLE还是BULK LOGGED恢复模型



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因