我正在计划将 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。
这不是对您的问题的直接回答,但有些文章您会从阅读它们中受益(以防您没有先找到它们:-))。它们是关于使用 bcp/批量复制加载大量数据。我已经阅读了所有内容,但没有找到任何关于 KILOBYTES_PER_BATCH 的详细信息,它们都在使用 ROWS_PER_BATCH,但我相信您会找到其他有用的信息。
在不到 1 小时内加载 1TB(来自 SQL CAT 团队) - 来自此处的建议列表(引用):
运行与可用 CPU 一样多的加载进程。如果您有 32 个 CPU,请运行 32 个并行加载。如果您有 8 个 CPU,请运行 8 个并行加载。
如果您可以控制输入文件的创建,请将它们的大小设置为可以被您要并行运行的加载线程数整除。如果要使用切换分区策略,还要确保所有记录都属于一个分区。
如果您在 SQL Server 计算机上运行进程,请使用 BULK insert 而不是 BCP。
使用表分区可以再增加 8-10%,但前提是您的输入文件必须保证与您的分区功能相匹配,这意味着一个文件中的所有记录必须位于同一个分区中。
使用 TABLOCK 避免一次锁定行。
如果要将多个流导入一个表,请使用 ROWS PER BATCH = 2500 或接近此值的值。
构建大型关系数据仓库的 10 大最佳实践(来自 SQL CAT 团队)- 建议(引用):
在初始数据加载期间使用 SIMPLE 或 BULK LOGGED 恢复模式。
使用聚集索引创建分区事实表。
为每个分区创建非索引临时表,并为填充每个分区单独的源数据文件。
并行填充临时表(使用多个 BULK INSERT、BCP 或 SSIS 任务)
在每个临时表上构建一个聚集索引,然后创建适当的 CHECK 约束。
将所有分区 SWITCH 到分区表中。
在分区表上构建非聚集索引。
数据加载性能指南(来自 SQL CAT 团队)
将批量数据加载到分区表中 - SQL Server 最佳实践文章(Technet 文章)
SQL Server 2000 增量批量加载案例研究(Technet 文章)
大型快速通道 POC 的经验教训和发现(来自 SQL CAT 团队)
SQL Server BCP 的性能调优技巧(作者 Brad McGehee)
性能影响:寻找最佳批量大小(作者:Linchi Shea)
以及明显的 MSDN 参考资料:
以我个人的经验,我成功地使用并行加载和几个批量大小的测试来实现快速数据加载。我想只有个人测试适合你。希望您能在参考资料中找到一些好的建议。