SQL Server导入比批量导入更快

时间:2012-10-16 19:01:42

标签: sql-server bulkinsert sqlbulkcopy

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

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

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

或者是否有某些条件会减慢它,我可以删除或更改?

3 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

您是否尝试并行加载数据?这是一个简单的SSIS解决方案:

1)安装SSIS行号生成器(http://www.konesans.com/products/row-number-transformation.aspx)   2)创建一个SSIS包来读取文件。   3)在数据流任务中,读取源文件。   4)在数据流任务中,插入行号生成器。   5)在数据流任务中,使用行号插入条件拆分并创建多个线程(即rownumber%3 == 0,rownumber%3 == 1,rownumber%3 == 2)。   6)在数据流任务中,插入目标目标表。

希望这有帮助。