将分区移动到新文件组

时间:2019-10-31 14:34:12

标签: sql-server tsql sql-server-2014 partitioning

我有一个按日期划分的大表。 我们有8个分区,每个分区都位于不同的文件组上,其中一个文件组为PRIMARY。

我想用一个名为'FG_odsvr_misc'的新文件组替换PRIMARY文件组,并从分区模式中删除PRIMARY。

在不使用新分区功能创建新表的情况下如何实现?

边界看起来像下面-

How to apply constraints in MongoDB?

分区功能如下-

CREATE PARTITION FUNCTION [fn_odstable1](numeric(9,0)) 
AS RANGE LEFT FOR VALUES (20151231, 20161231, 20171231, 20181231, 20191231, 20201231, 20211231)

分区方案如下-

CREATE PARTITION SCHEME [sch_odstable1] AS PARTITION [fn_odstable1] 
TO ([FG_odsvr_pre_2016], [FG_odsvr_2016], [FG_odsvr_2017], [FG_odsvr_2018], [FG_odsvr_2019], [FG_odsvr_2020], [FG_odsvr_2021], [PRIMARY])

1 个答案:

答案 0 :(得分:0)

好的。您在PRIMARY文件组上拥有的分区就是所谓的“永久分区”

摘自Dan Guzman的表分区最佳实践:

  

您可能不知道每个分区方案都有一个永久性   永远无法删除的分区。这是一个   RANGE RIGHT功能和RANGE LEFT的最后一个分区。是   创建新分区时请牢记此永久分区   涉及多个文件组时的方案,因为该文件组位于   该永久分区的创建时间是在   分区方案已创建,无法从方案中删除。

     

。 。

     

考虑包含超出预期范围的数据的映射分区   到没有基础文件的虚拟文件组。这将保证   数据完整性非常类似于检查约束,因为   不能插入允许范围。如果您必须容忍错误   数据而不是直接拒绝它,而是映射这些分区   到通用文件组(例如DEFAULT或专门指定的文件组)   为此目的。

http://www.dbdelta.com/table-partitioning-best-practices/

由于这是RANGE LEFT分区方案,因此可以通过在比表中存在的最大值更大的边界点处拆分最右边的分区,将所有数据从PRIMARY移出到新文件组。

ALTER PARTITION SCHEME sch_odstable1 NEXT USED [FG_odsvr_2022];  
ALTER PARTITION FUNCTION fn_odstable1() SPLIT RANGE (20221231);  

尽管如此,最右边的分区仍将位于PRIMARY上。您只需要创建将来的分区,然后再使它们保持空白即可。如果需要,可以创建一个新的分区方案

alter database current add filegroup no_files_cant_be_used

CREATE PARTITION SCHEME [sch_odstable2] AS PARTITION [fn_odstable1] 
TO ([FG_odsvr_pre_2016], [FG_odsvr_2016], [FG_odsvr_2017], [FG_odsvr_2018], [FG_odsvr_2019], [FG_odsvr_2020], [FG_odsvr_2021], [FG_odsvr_2022], no_files_cant_be_used)

然后在新方案ALTER TABLE SWITCH上创建一个匹配表,以将所有分区移至新表,然后重命名表。