以最少的停机时间向未分区的表添加分区

Shi*_*tij 3 sql-server partitioning sql-server-2019

我们每个月都尝试过以下方法。

表大小约为 2TB,3000 万行,包含 50 列,因此我们开始重命名旧表并将新表分区为一批 10K 行。对于 1000 万行,大约需要 7 个小时。

我们正在寻找可以在最短停机时间内完成的任何快速有效的方法?任何帮助表示赞赏。

Aar*_*and 7

  • 创建一个具有足够分区的新分区表,以愉快地划分所有现有的和未来某个合理时间的未来数据
  • 创建一个union all包含两个表的视图(可能最简单的方法是重命名当前表并暂时用具有旧表名的视图替换它)
  • 将新写入直接写入新的分区表
    • 希望您通过存储过程或更改目标名称的最小位置控制写入
    • 如果没有,您可以在视图上使用而不是触发器来直接写入分区表
  • 在后台,开始 delete top (@batchsize) output deleted.* into new_table from old_table
    • 这与完成所有工作需要多长时间无关,诀窍是优化批量大小,以便在完成工作和不会导致阻塞时间过长之间取得平衡,并确保在每个日志之间放入一些日志备份n 批次,如果他们还没有足够频繁地安排(这里有更多信息
  • 回填所有数据后,您可以删除旧表,然后将视图更改为不再union all(或删除它并重命名新表)

如果将所有旧数据回填到新分区方案需要两周时间,那又如何?用户不会等待两周;他们只是在等待任何单个批次(即使如此,这在很大程度上只是查询正在移动的数据的人,而不是新数据)。