Eu tenho uma tabela existente com dados:
dbo.Test (col1,col2,col3....) ON [PRIMARY]
Eu preciso mudar essa tabela para ser particionada assim:
dbo.Test(col1,col2,col3....) ON Ps_Date(Col2)
Como posso conseguir isso sem descartar e recriar a tabela?
Você não especifica se sua tabela tem um índice clusterizado ou não, então vamos percorrer todas as opções.
Vou usar esta função de partição de exemplo, esquema de partição e tabela:
1. Sua tabela possui um índice clusterizado que não foi criado por uma restrição.
Este é o caso mais fácil. Você pode simplesmente usar a
CREATE INDEX
instrução com aDROP_EXISTING
cláusula para mover a tabela para o esquema de partição.Suponha para o exemplo que este índice clusterizado tenha sido criado:
Para particionar esta tabela, o índice clusterizado inclui a coluna de partição (pt no nosso caso) como parte da chave. Essa instrução altera o índice clusterizado para incluir a coluna de partição e a particiona ao mesmo tempo:
A
DROP_Existing
cláusula remove automaticamente o índice existente antes de criar o novo. Isso é preferível a um separadoDROP INDEX
, pois faz com que os índices não clusterizados sejam reconstruídos apenas uma vez.2. Sua tabela tem um índice clusterizado que faz parte de uma restrição
PRIMARY KEY
ouUNIQUE
e contém a coluna de partição como parte da chaveEste ainda é fácil e muito semelhante ao anterior.
Suponha que essa
PRIMARY KEY
restrição tenha sido criada na tabela:Agora você pode simplesmente executar o mesmo script de recriação que usamos em 1:
3. A tabela tem um índice clusterizado que não inclui a coluna de partição, mas foi criado como parte de uma restrição
PRIMARY KEY
ouUNIQUE
Azar. Você não pode alterar a definição de a
PRIMARY KEY
ouUNIQUE
restrição após o fato. Sua única opção é descartar a restrição e recriá-la incluindo a coluna de partição ou criar um índice clusterizado independente da restrição que inclui a coluna de partição. No segundo caso, você pode recriar a restriçãoNONCLUSTERED
sem incluir a coluna de partição. Como agora essa restrição não está alinhada (o que significa que seu índice de suporte não é particionado), você precisa especificar onde colocá-la no disco.Suponha que a tabela tenha uma chave primária como esta:
Para particionar esta tabela, você deve primeiro eliminar a restrição:
Em seguida, você precisa criar o índice clusterizado particionado:
Se você optar por recriar a
PRIMARY KEY
restrição não alinhada, poderá fazê-lo assim:4. Sua tabela não possui um índice clusterizado
Neste caso é recomendado na maioria dos casos apenas criar um índice clusterizado para estabelecer o particionamento. Você pode usar a instrução create index vista anteriormente para isso:
No entanto, se você tiver um bom motivo para não criar um índice clusterizado, poderá se safar com a seguinte abordagem de duas etapas. Infelizmente, não há uma maneira direta de fazer essa mudança.
Suponha que sua tabela não tenha um índice clusterizado. Para particionar a tabela, você precisa primeiro criar uma
CLUSTERED UNIQUE
restrição. (Você também pode usar umaCLUSTERED PRIMARY KEY
restrição). Se você tiver uma combinação de colunas exclusiva, essa é uma etapa simples:Depois que a restrição for criada, você pode soltá-la novamente e "mover" a tabela para o novo esquema de partição ao mesmo tempo:
Se você não tiver uma combinação de colunas que seja única, você está sem sorte. Nesse caso, sua única opção é adicionar uma nova coluna e preenchê-la com valores exclusivos. Se a tabela for razoavelmente pequena, você pode fazer algo assim:
No entanto, isso exigirá um bloqueio de tabela exclusivo até que todas as linhas sejam avaliadas. Dependendo do tamanho da mesa isso pode ser por um bom tempo. Depois que essa coluna for criada, siga as duas etapas acima para primeiro criar a
UNIQUE
restrição e depois soltá-la novamente imediatamente. Depois, você também pode soltar a coluna novamente. Todas essas etapas são bastante intrusivas, então provavelmente é melhor criar apenas um índice clusterizado na tabela. Isso nem precisa ser único.Se você tiver o Enterprise Edition, poderá usar a
WITH(ONLINE=ON)
cláusula na maioria das declarações acima. Isso manterá sua mesa disponível para outras conexões. No entanto, haverá um impacto no desempenho durante esse período.Para particionar uma tabela, você pode seguir os breves passos abaixo:
DROP_EXISTING
a cláusula para recriar o índice clusterizado.ONLINE=ON
opção da instrução CREATE INDEX para minimizar qualquer tempo de inatividade para seu aplicativo. Observe que você verá uma degradação de desempenho enquanto o índice estiver sendo reconstruído usando a opção ONLINE.PARA automatizar o particionamento, você também pode usar o utilitário SQL Server Partition Management ou o SQL Server Partitioned Table Framework disponível no codeplex.
Alguns bons recursos: