将分区移动到新文件组

问题描述 投票:0回答:1

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

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

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

边界看起来像下面-

partition data

分区功能如下-

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])
sql-server tsql sql-server-2014 partitioning
1个回答
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上创建一个匹配表,以将所有分区移至新表,然后重命名表。

© www.soinside.com 2019 - 2024. All rights reserved.