在保持在线状态时对 4TB 表进行分区(SQL Server 标准版)

Jam*_*ley 6 sql-server partitioning

我们有一个当前大小约为 4TB 的表。我们希望在这个表上引入分区。该表已经聚集在我们希望分区的键上。

选项似乎是

  • 使用 ALTER TABLE SWITCH 将表的数据切换到只有一个分区(零成本)的范围分区表。然后为我们希望引入的每个分区调用 ALTER PARTITION FUNCTION(绝对不是零成本)
  • 使用 DROP_EXISTING=ON 重新创建聚集索引

我们没有使用 SQL Enterprise,因此无法在线执行此操作。

运行这些查询会锁定整个表。

  • 即使我们接受了锁定,我们也没有真正的方法来估计这需要多长时间(以及我们是否可以在一个周末及时完成)
  • 大多数数据是存档数据,只有一小部分数据实际上是“实时”的,并且在锁定时会出现问题。试图找出是否有一种使用 ALTER PARTITION 和 ALTER TABLE SWITCH 的策略,允许我们用在临时表上交换的数据来完成大部分工作。
  • 任何人都可以提出一种我们可以逐步做到这一点的方法吗?

谢谢!

Dav*_*oft 4

该表是仅追加的(新行,不更新现有行)

使用 ALTER TABLE SWITCH 将表的数据切换到范围分区表,该表只有一个分区用于所有现有数据,但新插入将落在新分区中。例如,迄今为止的所有行都位于一个大分区中,但将来新的行将落入每月分区中。

然后也许稍后你有时间来分割大分区。如果您使用 RANGE RIGHT 分区方案,则可以将小分区从大分区的右侧拆分出来。如果您使用 RANGE LEFT,您可以从左侧分割出小分区。

或者,在切换到新表后,您可以将旧单个分区中的数据插入到新的正确分区的临时表中。插入完成后,您可以截断大分区,拆分现在为空的分区以匹配临时表,然后切换临时表。由于旧分区中的数据是只读的,因此您可以执行插入时间。那么截断、分割、切入都是元数据操作。