【问题标题】:add partition left boundary in an existing range right partitioned table在现有范围右分区表中添加分区左边界
【发布时间】:2019-08-13 05:35:23
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    我猜您的情况如下:您有一个最低边界值为 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 物理移动到新的目标分区。因此,如果有数百万这样的行,这将需要一些时间并且会炸毁您的事务日志。

    【讨论】:

    • 这很清楚。只有一个问题,我如何选择下一个使用的文件组。 (我的分区是基于天的,而文件组是基于月的)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多