在现有范围右分区中添加分区左边界 table

add partition left boundary in an existing range right partitioned table

我的分区函数创建右范围类型的分区。数据迁移后发现 partition_number 中有一个边界值小于我的分区函数中声明的边界。因此,例如,如果我的最小分区键是 5,我在分区号 1 中找到值 1、2、3 和 4。我需要做的是改变我的分区函数,添加边界 1、2、3 和 4.How我要这样做吗?在这种情况下拆分范围是否有效? sql 服务器将如何在新分区中重新安排我的数据。它会通过改变 table 来完成这项工作吗?我需要做一些额外的事情吗?我是否需要备份以防出现问题?

我猜您的情况如下:您有一个右范围分区,其最低边界值为 5,并且 table 以这种方式进行分区,例如:

create partition function pf (int) as range right for values (5)
create partition scheme ps as partition pf to ([PRIMARY], [PRIMARY])
create table T (part_key int constraint PK_T primary key)
on ps (part_key)

现在,如果您将值 1、2、3、4 和 5 输入 table T 并检查每个分区内值的分布,您会发现 1、2、3 和 4在分区 1 中,5 在分区 2 中:

insert T values (1), (2), (3), (4), (5)
select part_key, $partition.pf(part_key) as partition from T

要在其自己的分区中获取每个值,您需要做的是: - 为每个新分区添加一个新的目标文件组,并且 - 从最高值开始拆分分区范围

这可能看起来像:

alter partition scheme ps next used [PRIMARY]
alter partition function pf() split range (4)

alter partition scheme ps next used [PRIMARY]
alter partition function pf() split range (3)

alter partition scheme ps next used [PRIMARY]
alter partition function pf() split range (2)

现在,如果您再次检查您的值分布,您会看到所有不同的值最终都在一个单独的分区中:

select part_key, $partition.pf(part_key) as partition from T

但是,请注意,这伴随着数据移动,即所有具有分区键值 1-4 的行都需要从原始分区 2 物理移动到它们的新目标分区。因此,如果有数百万这样的行,这将需要一些时间并且会破坏您的事务日志。