Contexto
Tenho experimentado particionamento de tabelas e encontrei muitas surpresas. Atualmente, estou lendo o máximo de documentação que posso, mas há uma quantidade chocante dela . Acho que estou no segundo de seis white papers. Não vi essa pergunta mencionada em nenhum lugar da documentação.
O Problema
Usando DROP_EXISTING = ON
, parece que algumas tabelas podem ser particionadas no local. Por exemplo, posso fazê-lo funcionar com um índice clusterizado exclusivo. No entanto, não posso fazer o mesmo com uma chave primária. Este guia concorda com minha conclusão e diz que particionar uma tabela com uma chave primária no local requer a remoção da chave primária primeiro. É como se houvesse uma restrição de sintaxe em vez de uma de funcionalidade.
Minha pergunta é esta: Quando uma tabela pode ser particionada sem descartar nada antes do particionamento? Em outras palavras, quando o particionamento pode ser feito no local?
Não estou perguntando especificamente sobre o que pode ser feito com DROP_EXISTING
em particular. Esse foi apenas um método que encontrei.
Suponha o SQL Server 2022. Não me importa se a operação é online ou não. Tenho uma pergunta diferente para algo bem parecido.
Código de demonstração
Em grande parte roubado de Paul White
CREATE PARTITION FUNCTION PF (integer)
AS RANGE RIGHT
FOR VALUES
(
10000, 20000, 30000, 40000, 50000
);
GO
CREATE PARTITION SCHEME PS
AS PARTITION PF
ALL TO ([PRIMARY]);
GO
CREATE TABLE dbo.T1
(
c1 integer NOT NULL,
c2 integer NOT NULL,
c3 integer NOT NULL,
CONSTRAINT PK_T1
PRIMARY KEY CLUSTERED (c1, c2, c3)
);
CREATE TABLE dbo.T2
(
c1 integer NOT NULL,
c2 integer NOT NULL,
c3 integer NOT NULL,
INDEX UIX_T2 UNIQUE CLUSTERED (c1, c2, c3)
);
GO
CREATE TABLE dbo.T3
(
c1 integer NOT NULL,
c2 integer NOT NULL,
c3 integer NOT NULL,
INDEX UIX_T3 UNIQUE NONCLUSTERED (c1, c2, c3)
);
GO
/* These work */
CREATE CLUSTERED INDEX UIX_T2 ON dbo.T2 (c1, c2, c3)
WITH (DROP_EXISTING = ON) ON PS(C1)
GO
CREATE NONCLUSTERED INDEX UIX_T3 ON dbo.T3 (c1, c2, c3)
WITH (DROP_EXISTING = ON) ON PS(C1)
GO
/* But I could never get the primary key to! */
Acima, você pode particionar índices exclusivos no lugar. No entanto, nada que eu tenha pensado em tentar funciona para chaves primárias. Tenho quase certeza de que isso REBUILD
também pode fazer isso.
Você pode usar
CREATE INDEX...WITH DROP_EXISTING=ON
a sintaxe para particionar uma restrição de chave primária existente ou índice de restrição exclusivo similarmente a um índice sem restrição. As ressalvas são que a definição de chave de índice especificada deve corresponder à chave de restrição existente, a coluna de particionamento deve ser parte da chave de índice exclusiva (um requisito para todos os índices particionados exclusivos) e a especificação clusterizada/não clusterizada deve ser a mesma do índice existente.Este código particionará o índice de restrição de chave primária do seu DDL de exemplo.