使用 ALTER PARTITION FUNCTION 拆分分区表时会发生什么?

问题描述 投票:0回答:1

我试图理解这里分区的整个过程。

CREATE PARTITION FUNCTION LargePF(DATETIME)
AS RANGE LEFT FOR VALUES('2024-06-01', '2024-07-01','2024-08-01', '2024-09-01', '2024-10-01')

我做了6个分区。这些分区具有聚集索引,与分区列相同。最后一个分区表涵盖了“2024-10-01”之后的范围,并且它是空的。

如果我分割最后一个分区并使其范围为(2024-10-01~2024-10-31)和(2024-11-11~),我是否需要重建每个分区的聚集索引?或者新创建的分区本身有聚集索引?新创建的聚集索引是否与现有分区对齐?

sql-server
1个回答
0
投票

有几件事。

假设您已经将表设计为can可以拆分(也就是说所有二级索引也都构建在与聚集索引相同的分区方案上),那么拆分分区功能就足够了去做。也就是说,在您在 2024 年 11 月 1 日引入新分区边界的示例中,该新边界的两侧都将具有正确的索引。

这导致了我的下一件事 - 为了避免让自己头痛,请确保您正在执行这些拆分操作,以便新边界的两侧都是空的。由于术语可能稍微缺乏严格性,执行分区拆分将对您将新边界放在中间的分区执行数据大小操作,以创建两个新分区。在您的示例中,如果 (2024-10-01, ∞) 分区中已有数据,您将在分区拆分上重写任何该数据。但是,如果您在该分区为空时执行拆分操作,则不会遭受该损失。所有这些都是说,提前计划好分割分区以避免写入损失。

最后,根据您的用例,我建议使用

range right
分区函数。使用方括号的集合表示法指示该边界包含在集合中,并使用括号指示该边界在集合中not
partition left
函数创建看起来像
(start, end]
的边界。特别是对于基于时间的分区方案,您通常希望在一个分区中包含所有指定的时间范围。为了使用您的示例,将 2024 年 9 月的全部内容放在一个分区中会很方便。但是,按照您现在使用
partition left
函数的方式,9 月 1 日午夜位于上个月的分区中,10 月 1 日午夜位于本月的分区中。可能不是你想要的!

© www.soinside.com 2019 - 2024. All rights reserved.