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

时间:2019-03-22 09:02:13

标签: sql sql-server sql-server-2005

我的分区函数创建正确范围类型的分区。事实证明,在数据迁移之后,partition_number一中的边界值小于我的分区函数中声明的边界。因此,例如,如果我的最小分区键为5,我在分区号1中找到了值1,2,3和4。我需要做的是更改分区函数,并添加边界1,2,3和4。要这样做吗?在这种情况下分割范围有效吗? SQL Server如何将我的数据重新排列在新分区中。仅仅通过改变桌子就能做到吗?我需要做些额外的事情吗?如果出现问题,我需要备份吗?

1 个答案:

答案 0 :(得分:0)

我猜您的情况如下:您有一个范围最小的边界值是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)

现在,如果您在表T中输入值1、2、3、4和5并检查每个分区内的值分布,则会在分区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物理地移到新的目标分区。因此,如果有数百万个这样的行,这将花费一些时间,并且会炸毁您的事务日志。