优化 BLOB 数据的 BCP 性能

Mar*_*ith 14 performance sql-server bcp

我正在计划将 2TB 数据库实时迁移到分区表的过程。从广义上讲,该系统是一个文档存储,大部分空间分配给 50kb 到 500kb 之间的 LOB,一小部分在 500kb 到 1MB 范围内。部分迁移将涉及从旧数据库到新数据库的 BCPing 数据。

BCP 是首选方法,因为数据中的当前/历史鸿沟允许在最终切换之前分阶段(在较安静的时期)提取较旧的数据,从而最大限度地减少对实时系统的影响。数据量和存储可用性排除了对分区方案的原位重建

由于 BLOB 内容,我怀疑通过尝试使用 KILOBYTES_PER_BATCH 而不是 ROWS_PER_BATCH 可能会获得一些性能提升。BCP文档中建议SQL可以根据这个值优化操作。

我找不到关于这些优化的性质或从哪里开始测试的任何指导。在没有建议的情况下,我将尝试在 4/8/16/32/64mb 边界处进行短期运行。

可能会从更改数据包大小(BCP -a 参数,而不是服务器级别设置)中获得一些收益,但我倾向于将其提高到最大 65535,除非有人有更公式化的方法。

Mar*_*ian 13

这不是对您问题的直接回答,但是有些文章您会从阅读它们中受益(以防您没有先找到它们 :-))。它们是关于使用 bcp/bulk copy 加载大量数据。我已经阅读了所有内容,但没有找到任何关于 KILOBYTES_PER_BATCH 的详细信息,它们都在使用 ROWS_PER_BATCH,但我相信您会找到其他有用的信息。

  • 在不到 1 小时内加载 1TB(来自 SQL CAT 团队)-来自此处的建议列表(引用):

  • 运行与可用 CPU 一样多的加载进程。如果您有 32 个 CPU,则运行 32 个并行负载。如果您有 8 个 CPU,则运行 8 个并行负载。

  • 如果您可以控制输入文件的创建,请将它们的大小设置为可以被要并行运行的加载线程数整除的大小。如果要使用切换分区策略,还要确保所有记录都属于一个分区。

  • 如果您在 SQL Server 计算机上运行该进程,请使用 BULK 插入而不是 BCP。

  • 使用表分区可以获得另外 8-10% 的收益,但前提是您的输入文件保证与您的分区功能相匹配,这意味着一个文件中的所有记录必须位于同一分区中。

  • 使用 TABLOCK 来避免一次行锁定。

  • 如果要将多个流导入一个表,请使用 ROWS PER BATCH = 2500 或接近此值的值。

  • 构建大型关系数据仓库的 10 大最佳实践(来自 SQL CAT 团队)——建议(引用):

  • 在初始数据加载期间使用 SIMPLE 或 BULK LOGGED 恢复模型。

  • 使用聚集索引创建分区事实表。

  • 为每个分区创建非索引临时表,并为每个分区创建单独的源数据文件。

  • 并行填充临时表(使用多个 BULK INSERT、BCP 或 SSIS 任务)

  • 在每个临时表上构建一个聚集索引,然后创建适当的 CHECK 约束。

  • 将所有分区切换到分区表中。

  • 在分区表上建立非聚集索引。

  • 数据加载性能指南(来自 SQL CAT 团队)

  • 将批量数据加载到分区表 - SQL Server 最佳实践文章(Technet 文章)

  • SQL Server 2000 增量批量加载案例研究(Technet 文章)

  • 大型快速通道 POC 的经验教训和发现(来自 SQL CAT 团队)

  • SQL Server BCP 的性能调优技巧(作者 Brad McGehee)

  • 性能影响:寻找最佳批量大小(Linchi Shea)

以及明显的 MSDN 参考资料:

根据我的个人经验,我成功地使用并行加载和多个批量大小的测试来快速加载数据。我想只有个人测试才适合你。希望您能在参考资料中找到一些好的建议。