我正在练习在 QA 框上拆分分区功能,以便为即将到来的日历年添加新分区。我正在运行 SQL Server 企业版,补丁级别 12.0.4100。这是当前的函数定义...
CREATE PARTITION FUNCTION [PF_UTC](datetime2(7)) AS RANGE LEFT
FOR VALUES (N'2012-01-01T00:00:00.000', N'2012-04-01T00:00:00.000',
N'2012-07-01T00:00:00.000', N'2012-10-01T00:00:00.000',
N'2013-01-01T00:00:00.000', N'2013-04-01T00:00:00.000',
N'2013-07-01T00:00:00.000', N'2013-10-01T00:00:00.000',
N'2014-01-01T00:00:00.000', N'2014-04-01T00:00:00.000',
N'2014-07-01T00:00:00.000', N'2014-10-01T00:00:00.000',
N'2015-01-01T00:00:00.000', N'2015-04-01T00:00:00.000',
N'2015-07-01T00:00:00.000', N'2015-10-01T00:00:00.000',
N'2016-01-01T00:00:00.000', N'2016-04-01T00:00:00.000')
在创建函数时定义了三个分区方案,但只有第一个分区方案在添加数据文件时使用。
CREATE PARTITION SCHEME [PS_UTC_Clustered] AS PARTITION [PF_UTC] TO (
[Partitioned_Pre2012_Clustered]
,[Partitioned_2012Q1_Clustered]
,[Partitioned_2012Q2_Clustered]
,[Partitioned_2012Q3_Clustered]
,[Partitioned_2012Q4_Clustered]
,[Partitioned_2013Q1_Clustered]
,[Partitioned_2013Q2_Clustered]
,[Partitioned_2013Q3_Clustered]
,[Partitioned_2013Q4_Clustered]
,[Partitioned_2014Q1_Clustered]
,[Partitioned_2014Q2_Clustered]
,[Partitioned_2014Q3_Clustered]
,[Partitioned_2014Q4_Clustered]
,[Partitioned_2015Q1_Clustered]
,[Partitioned_2015Q2_Clustered]
,[Partitioned_2015Q3_Clustered]
,[Partitioned_2015Q4_Clustered]
,[Partitioned_2016Q1_Clustered]
,[Partitioned_2016Q2_Clustered]
)
CREATE PARTITION SCHEME [PS_UTC_NonClustered] AS PARTITION [PF_UTC] TO (
[Partitioned_Pre2012_NonClustered]
,[Partitioned_2012Q1_NonClustered]
,[Partitioned_2012Q2_NonClustered]
,[Partitioned_2012Q3_NonClustered]
,[Partitioned_2012Q4_NonClustered]
,[Partitioned_2013Q1_NonClustered]
,[Partitioned_2013Q2_NonClustered]
,[Partitioned_2013Q3_NonClustered]
,[Partitioned_2013Q4_NonClustered]
,[Partitioned_2014Q1_NonClustered]
,[Partitioned_2014Q2_NonClustered]
,[Partitioned_2014Q3_NonClustered]
,[Partitioned_2014Q4_NonClustered]
,[Partitioned_2015Q1_NonClustered]
,[Partitioned_2015Q2_NonClustered]
,[Partitioned_2015Q3_NonClustered]
,[Partitioned_2015Q4_NonClustered]
,[Partitioned_2016Q1_NonClustered]
,[Partitioned_2016Q2_NonClustered]
)
CREATE PARTITION SCHEME [PS_UTC_Text] AS PARTITION [PF_UTC] TO (
[Partitioned_Pre2012_Text]
,[Partitioned_2012Q1_Text]
,[Partitioned_2012Q2_Text]
,[Partitioned_2012Q3_Text]
,[Partitioned_2012Q4_Text]
,[Partitioned_2013Q1_Text]
,[Partitioned_2013Q2_Text]
,[Partitioned_2013Q3_Text]
,[Partitioned_2013Q4_Text]
,[Partitioned_2014Q1_Text]
,[Partitioned_2014Q2_Text]
,[Partitioned_2014Q3_Text]
,[Partitioned_2014Q4_Text]
,[Partitioned_2015Q1_Text]
,[Partitioned_2015Q2_Text]
,[Partitioned_2015Q3_Text]
,[Partitioned_2015Q4_Text]
,[Partitioned_2016Q1_Text]
,[Partitioned_2016Q2_Text]
)
我不打算创建 2016Q3 和 2016Q4 季度,因为我不想招致文件组之间的数据移动。我选择从 1/1/2017 开始并创建一个 2017Q1 文件组。我执行以下命令,预计这将是一个快速的元修改。
--CREATE 2017Q1 FG
USE [master];
ALTER DATABASE [JMQ] ADD FILEGROUP [JMQ_2017Q1];
--ADD 2017Q1 Data Files
ALTER DATABASE [JMQ] ADD FILE (
NAME = N'JMQ_2017Q1_01'
,FILENAME = N'M:\DATA\mssql\data\JMQ_2017Q1_01.ndf'
,SIZE = 1024000 KB
,FILEGROWTH = 1024000 KB
) TO FILEGROUP [JMQ_2017Q1]
--ALTER PARTITION SCHEME NEXT USED FOR NEW FG
USE [JMQ];
ALTER PARTITION SCHEME PS_UTC_Clustered NEXT USED [JMQ_2017Q1];
USE [JMQ];
ALTER PARTITION SCHEME PS_UTC_NonClustered NEXT USED [JMQ_2017Q1];
USE [JMQ];
ALTER PARTITION SCHEME PS_JMQ_UTC_Text NEXT USED [JMQ_2017Q1];
--ALTER PARTITION FUNCTION TO SPLIT RANGE ON 1/1/17 00:00:00
USE [JMQ];
ALTER PARTITION FUNCTION PF_UTC () SPLIT RANGE ('2017-01-01 00:00:00')
但是现在,它已经运行了 90 分钟。我正在通过 Spotlight 观看正在填充新数据文件。我抽查了 Prod 中数据库中所有表的 UTC 日期,并确认没有任何日期是在 2017 年 1 月 1 日之后。我可以理解引擎需要查找/扫描索引以确认没有任何内容必须移动到 FG,但如果没有记录符合移动条件,为什么要移动所有数据?
大概你有行日期之后
2016-04-01
?如果是这样,它们当前驻留在最后一个分区中。将最右侧的范围左侧函数拆分为两个范围将导致日期晚于
2016-04-01
移动到新范围的任何行,因为范围被定义为“范围左侧”。您可以在这个 MSDN 页面上看到一个很好的视觉效果。
这个 MSDN 页面上的
ALTER PARTITION FUNCTION
状态:您需要确保在当前操作结束后添加一个额外的分区,以确保您符合上述最佳实践。
看看 Dan Guzman 关于 Sql Server 分区的精彩帖子
LEFT RANGE
——特别是在拆分 期间发生的事情。以下是亮点: