Mat*_*DBA 2 sql-server partitioning
我有一个date
使用 RANGE LEFT的简单的基于分区函数...
CREATE PARTITION FUNCTION [PF_YEAR_LEFT](date) AS RANGE LEFT
FOR VALUES (N'1992-12-31', N'1993-12-31', N'1994-12-31')
GO
CREATE PARTITION SCHEME [PS_YEAR_LEFT] AS PARTITION [PF_YEAR_LEFT]
TO ([DATA_1992], [DATA_1993], [DATA_1994], [DATA_1995])
GO
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,文件组 [DATA_1995] 将保留超出最后一个分区边界的值。因此,如果我选择添加新文件组并以这种方式拆分附加边界的功能......
ALTER PARTITION SCHEME [PS_YEAR_LEFT] NEXT USED [DATA_1995]
GO
ALTER PARTITION FUNCTION [PF_YEAR_LEFT]() SPLIT RANGE (N'1995-12-31')
GO
ALTER PARTITION SCHEME [PS_YEAR_LEFT] NEXT USED [DATA_1996]
GO
ALTER PARTITION FUNCTION [PF_YEAR_LEFT]() SPLIT RANGE (N'1996-12-31')
GO
Run Code Online (Sandbox Code Playgroud)
对于超出最高边界的值,文件组 [DATA_1995] 保留在最后一个分区位置。
在最初创建分区方案后是否可以更改最后一个文件组,或者是创建新分区方案并将使用旧方案的所有索引重建为新方案的唯一方法?
在最初创建分区方案后是否可以更改最后一个文件组,或者是创建新分区方案并将使用旧方案的所有索引重建为新方案的唯一方法?
RANGE LEFT
函数的最后一个分区是永久分区,不能删除,RANGE RIGHT
函数的第一个分区也不能删除。这是我的表分区最佳实践文章中详述的考虑因素之一,也是为什么我建议RANGE RIGHT
为增量时间类型使用更直观的函数以及对预期范围内的数据进行明确边界的原因。
您不需要重建现有的表和索引来修复错误命名的文件组。如果您使用脚本添加新分区(注意确保 SPLIT 分区为空),您将得到以下方案:
CREATE PARTITION SCHEME PS_YEAR_LEFT AS PARTITION PF_YEAR_LEFT TO (
[DATA_1992]
, [DATA_1993]
, [DATA_1994]
, [DATA_1995]
, [DATA_1996]
, [DATA_1995]
);
Run Code Online (Sandbox Code Playgroud)
您可以使用虚拟文件组(或 PRIMARY)上的最后一个分区创建一个新方案,创建一个新的对齐表,将除最后一个分区以外的所有分区(如果没有 1997 年以上的数据则为空)切换到新表中,删除旧表,重命名等。示例如下。
CREATE PARTITION SCHEME PS_YEAR_LEFT_NEW AS PARTITION PF_YEAR_LEFT TO (
[DATA_1992]
, [DATA_1993]
, [DATA_1994]
, [DATA_1995]
, [DATA_1996]
, [PRIMARY]
);
GO
CREATE TABLE dbo.YourTable(
DateColumn date
) ON PS_YEAR_LEFT(DateColumn);
GO
CREATE TABLE dbo.YourTable_New(
DateColumn date
) ON PS_YEAR_LEFT_NEW(DateColumn);
GO
DECLARE @Date date = '19921231';
WHILE @Date <= '19961231'
BEGIN
ALTER TABLE dbo.YourTable
SWITCH PARTITION $PARTITION.PF_YEAR_LEFT(@Date)
TO dbo.YourTable_New PARTITION $PARTITION.PF_YEAR_LEFT(@Date);
SET @Date = DATEADD(year,1,@Date);
END;
GO
--drop original table
--drop original partition scheme
--rename new table, constraints, indexes to original name
--update statistics
Run Code Online (Sandbox Code Playgroud)