我猜您的情况如下:您有一个最低边界值为 5 的正确范围分区,以及一个以这种方式分区的表,例如:
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 输入到表 T 中并检查每个分区内的值分布,您会在分区 1 和 5 中找到 1、2、3 和 4在分区 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 物理移动到新的目标分区。因此,如果有数百万这样的行,这将需要一些时间并且会炸毁您的事务日志。