Eu tenho uma tabela do SQL Server que contém mais de 20 bilhões de linhas, com 13 bilhões de linhas na última partição.
A tabela está atualmente particionada de 6 maneiras por um campo "Time":
2011
2012
2013
2014
2015
2016/2017/2018
A partição 2016/2017/2018 precisa ser dividida em suas próprias partições para que haja uma partição 2016, 2017, 2018.
Como isso pode ser feito e, no processo, evitando um crescimento massivo de arquivos de log? O banco de dados está em Simple Recovery e atualmente cada partição está em um grupo de arquivos separado em seu próprio conjunto de discos.
CREATE TABLE [dbo].[Log](
[RefNo] [nchar](7) NOT NULL,
[DevID] [nvarchar](7) NOT NULL,
[Time] [datetime] NOT NULL,
[summary] [float] NULL,
[staging] [float] NULL,
[position] [float] NULL,
CONSTRAINT [PK_Log] PRIMARY KEY CLUSTERED
(
[RefNo] ASC,
[DevID] ASC,
[Time] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = ON, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 96)
)
Abaixo está um script de exemplo para criar as novas partições anuais. Você pode precisar ajustar o script para o nome da função de partição real e novos nomes de grupos de arquivos. Esse método pressupõe que a operação é executada em uma janela de manutenção quando não há inserções na tabela e os dados de 2016 e posteriores não são necessários para consultas.
O resumo das etapas executadas pelo script são:
Há alguns problemas com o particionamento de tabela existente dos quais você deve estar ciente. Por causa da
RANGE LEFT
função, os valores de data e hora que são exatamente meia-noite no primeiro dia do ano serão colocados na partição errada. Por exemplo, uma linha comTime
o valor '2012-01-01T00:00:00' estará na partição 1 junto com os dados do ano 2011 em vez da partição 2 com o restante dos dados do ano 2012 conforme desejado. Isso pode não ser uma preocupação, a menos que você limpe os dados por partição.Esteja ciente de que a última partição se uma
RANGE LEFT
função nunca pode ser removida. A implicação é que o grupo de arquivos da última partição faz parte permanentemente dos esquemas de partição que usam a função. No seu caso, o grupo de arquivosYear6FileGroup
sempre será o último grupo de arquivos dopsYearlyPartition_Log
esquema, embora também possa ser usado para outra partição, como para o ano de 2016 aqui.As partições após a execução do script serão como abaixo e espera-se que a última partição esteja vazia (assumindo que você não tenha dados do ano futuro). Você deve criar a partição para o próximo ano antes do início do ano para evitar dividir uma partição não vazia ou evitar pular por esses aros novamente.
Eu geralmente recomendo uma
RANGE RIGHT
função ao particionar em valores incrementais como datetime porque o comportamento é mais intuitivo. Consulte Práticas recomendadas de particionamento de tabela para esta e outras considerações.