【问题标题】:SQL Server import faster than bulk importSQL Server 导入比批量导入更快
【发布时间】:2012-10-06 23:08:45
【问题描述】:

我有一个大型(约 50Gb,约 3 亿行)制表符分隔文件,我想将其导入到 SQL Server 表中,其中包含以下列:char(10), varchar(512), nvarchar(512), nvarchar(512)

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

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

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

【问题讨论】:

  • 批量导入是最快的方式
  • 批量插入绝对是最快的。听起来可能是内存或 IO 限制,因为我在更短的时间范围内加载了更大的集合。是否可以选择并行拆分文件并加载到分区中?
  • 您是否已经遵循documentation 中关于优化批量导入的建议?你有什么版本的 SQL Server?

标签: sql-server bulkinsert sqlbulkcopy


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您是否尝试过并行加载数据?这是一个简单的 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) 在数据流任务中,插入目标目标表。

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-17
        • 2013-10-29
        • 1970-01-01
        • 2017-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多