Estou tentando criar uma tabela particionada onde o particionamento é determinado por OrderDate
. Estou tentando criar um clustered index
on OrderDate
e um nonclustered primary key
on OrderID
. Mas recebo um erro dizendo:
Msg 1908, Nível 16, Estado 1, Linha 1 A coluna 'OrderDate' está particionando a coluna do índice 'PK_OrderID'. As colunas de partição para um índice exclusivo devem ser um subconjunto da chave de índice. Msg 1750, Nível 16, Estado 0, Linha 1 Não foi possível criar restrição. Veja os erros anteriores.
Como modificar isso para que funcione:
CREATE TABLE dbo.Orders
(
OrderID INT NOT NULL ,
Name NVARCHAR(20) NULL ,
OrderDate DATE NOT NULL ,
)
ON PartSchemeOrders(OrderDate)
CREATE CLUSTERED INDEX IX_OrderDate
on dbo.Orders (OrderDate)
on PartSchemeOrders(OrderDate)
ALTER TABLE dbo.Orders
ADD CONSTRAINT PK_OrderID PRIMARY KEY NONCLUSTERED (OrderID)
Como diz a mensagem de erro, qualquer índice exclusivo alinhado à partição deve incluir a chave de particionamento na chave de índice. Esse requisito existe para que o mecanismo possa impor exclusividade nas atualizações sem verificar todas as partições.
No seu caso, isso significa incluir
OrderDate
na chave de índice não clusterizado ou ter um índice não alinhado. Ambas são escolhas potencialmente válidas, dependendo de suas circunstâncias. Para preservar o alinhamento, suas definições de tabela e índice seriam:É claro que isso altera a exclusividade imposta pelo índice não clusterizado. Agora, apenas a combinação de
OrderID
eOrderDate
tem a garantia de ser única. É teoricamente possível adicionarOrderID
s duplicados, desde queOrderDate
sejam diferentes. Se essa mudança de semântica é aceitável para você depende de suas circunstâncias, mas é algo para estar ciente.A alternativa é ter a chave primária não clusterizada não alinhada:
Isso preserva a exclusividade de
OrderID
sozinho e tem alguns benefícios com consultas que calculamMIN
ouMAX
agregam usando o índice, mas você perde a capacidade deSWITCH
particionar dentro e fora sem descartar a chave primária e recriá-la após a operação de alternância.Você pode ler mais sobre particionamento nesta seção dos Manuais Online e mais sobre questões de índices alinhados e não alinhados nesta excelente resposta de Remus Rusanu.