如何在不创建聚集索引的情况下对 SQL Server 中的巨大(15 TB)现有表进行分区

Ala*_*sen 3 sql-server partitioning file filegroup

我正在尝试在 SQL 中对一个大表进行分区。它的大小为 15 TB,包含数百万条记录。主要思想是通过创建新的文件组将即将到来的数据保存到不同的磁盘上,其中当前磁盘无法再扩展。

我创建了所需的文件组、文件、分区架构和分区函数,但是当我创建聚集索引时,它占用了太多空间(超过 200GB)并且仍在运行,所以我停止了它。

我的问题:有没有一种方法可以对现有的大表进行分区,而无需创建占用太多空间的聚集索引?或者有没有办法将新的数据保存到不同的磁盘?

Aar*_*and 7

为了避免创建 15TB 索引(当然,您可以在新磁盘上的新文件组上创建)的痛苦,您可以创建一个新的分区表(或者不分区,如果您不需要管理/归档) / 清除旧数据)从头开始,开始在那里写入所有新的传入数据,然后慢慢地移动数据。

借用我自己的答案

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

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