优化BLOB数据的BCP性能


13

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

BCP是首选方法,因为数据的当前/历史划分允许在最终切换之前分阶段(在较安静的时段)提取较旧的数据,从而将对实时系统的影响降至最低。数据量和存储的可用性排除了对分区方案进行原位重建的麻烦

我怀疑由于BLOB内容的原因,尝试KILOBYTES_PER_BATCH而不是ROWS_PER_BATCH可能会带来一些性能提升。BCP文档中建议SQL可以基于该值优化操作。

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

更改数据包大小可能会带来一些好处(BCP-一个参数,而不是服务器级别设置),但除非有人采用更规范的方法,否则我倾向于将此值提高到最大值65535。

Answers:


12

这不是您问题的直接答案,但是有些文章将使您从阅读它们中受益(以防您没有首先找到它们:-))。它们是关于使用bcp /批量复制加载大量数据的。我已经阅读了所有内容,但没有找到有关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,如果要将多个流导入到一个表中,请使用接近的值。
  • 建立大型关系数据仓库的十大最佳实践(来自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参考:

以我的个人经验,我成功地使用并行加载并以几种批处理大小进行测试来快速加载数据。我想只有个人测试才适合您。希望您能在参考文献中找到一些好的建议。


谢谢玛丽安,我已经从详尽列表中为一些新发现添加了书签。作为一项一次性任务,许多增量/优化步骤没有用,但我可以利用其中的许多技巧。
Mark Storey-Smith,

是的,我有你的感觉,对我来说也是一项一次性的任务,并且在列表中找到了一些有用的东西。虽然这是一项艰巨的任务:-)。您还可以创建一个小型.NET应用程序(如果您熟悉.NET),例如Linchi Shea的另一篇文章:性能影响:最佳插入脚本无法击败BulkCopy。您可能会发现与他所做的相同:-)。
玛丽安

由于似乎没有针对BCP的任何BLOB特定指南,所以我将您非常详尽的答案标记为已接受。再次感谢。
马克·斯托里·史密斯

抱歉,我不能为您提供更多帮助,但我希望您发现其中有用的东西。
玛丽安
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.