1

我有一个大的(~50Gb,~3 亿行)制表符分隔文件,我想将它导入到带有列的 SQL Server 表中:char(10), varchar(512), nvarchar(512), nvarchar(512).

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

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

或者是否有某种情况会减慢它的速度,我可以删除或更改?

4

3 回答 3

2

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

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

验证服务器上有足够的内存来处理如此大的数据负载。

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

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

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

于 2012-10-16T19:39:06.053 回答
2

在过去的几周里,我自己一直在努力优化一个非常大的负载。BULK INSERT 是最快的方法,我发现 BCP 与 SSIS 或 TSQL 批量插入相反,但是您可以做一些事情来调整它。

  • 尝试提高/降低每批设置的行数,以转移 CPU 和内存之间的资源压力(越高将减少 CPU,越低将减少内存)。
  • 如果有聚集索引,或非聚集索引删除它们并在插入后重新创建它们
  • 使用 .NET 工具将 TSV 拆分为较小的文件,然后将它们并行加载到表中。这要求表是堆(已删除聚集索引)
  • 确保它被最低限度地记录。对于堆,这需要 TABLOCK,对于聚集索引,它需要跟踪标志 610,并且要求数据长袍与聚集索引键的顺序相同。两者都需要 SIMPLE 或 BULK LOGGED 恢复模型
于 2012-10-16T19:41:50.397 回答
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) 在数据流任务中,插入目标目标表。

希望这可以帮助。

于 2013-07-17T04:46:38.370 回答