Estou praticando a divisão de uma função de partição em uma caixa de controle de qualidade para adicionar novas partições para o próximo ano civil. Estou executando o SQL Server Enterprise Edition, nível de patch 12.0.4100. Aqui está a definição da função atual...
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')
Três esquemas de partição foram definidos no momento da criação da função, mas apenas o primeiro é utilizado com os arquivos de dados adicionados.
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]
)
Não estou planejando criar os trimestres 2016T3 e 2016T4, pois não quero incorrer na movimentação de dados entre os grupos de arquivos. Decidi começar com 01/01/2017 e criar um grupo de arquivos 2017Q1. Eu executo o seguinte, antecipando que será uma metamodificação rápida.
--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')
Mas agora, está funcionando há 90 minutos. Estou observando pelo Spotlight que o novo arquivo de dados está sendo preenchido. Eu verifico as datas UTC em todas as tabelas no banco de dados em Prod e confirmo que nada é datado após 01/01/2017. Entendo que o mecanismo precisa buscar/varrer índices para confirmar que nada precisa ser movido para o FG, mas se nenhum registro estiver qualificado para mover, por que toda a movimentação de dados?
Presumivelmente, você tem linhas datadas depois
2016-04-01
? Nesse caso, eles residem atualmente na última partição.Dividir a função esquerda do intervalo mais à direita em dois intervalos resultará em quaisquer linhas datadas depois de
2016-04-01
serem movidas para o novo intervalo em virtude do fato de os intervalos serem definidos como "intervalo esquerdo".Você pode ver um bom visual disso nesta página do MSDN .
Esta página do MSDN nos
ALTER PARTITION FUNCTION
estados:Você deve certificar-se de adicionar uma partição extra após a conclusão da operação atual para garantir a conformidade com as melhores práticas mencionadas acima.
Dê uma olhada no excelente post de Dan Guzman sobre o particionamento do Sql Server - especificamente o que acontece durante uma
LEFT RANGE
divisão.Aqui estão os destaques: