Dada uma tabela com uma chave primária, por exemplo:
CREATE TABLE Customers (
CustomerID int NOT NULL PRIMARY KEY,
FirstName nvarchar(50),
LastName nvarchar(50),
Address nvarchar(200),
Email nvarchar(260)
--...
)
temos uma chave primária exclusiva ativada CustomerID
.
Tradicionalmente, talvez eu precise de alguns índices de cobertura adicionais; por exemplo, para encontrar rapidamente um usuário com um CustomerID
ou Email
:
CREATE INDEX IX_Customers_CustomerIDEmail ON Customers
(
CustomerID,
Email
)
E esses são os tipos de índices que eu criei há décadas.
Não é necessário ser único, mas na verdade é
O próprio índice existe para evitar uma varredura de tabela; é um índice de cobertura para ajudar no desempenho (o índice não existe como uma restrição para impor exclusividade).
Hoje, lembrei-me de um pouco de informações - o SQL Server pode usar o fato de que:
- uma coluna tem uma restrição de chave estrangeira
- uma coluna possui um índice exclusivo
- uma restrição é confiável
para ajudá-lo a otimizar a execução da consulta. De fato, no Guia de Design de Índice do SQL Server :
Se os dados forem exclusivos e você desejar aplicar a exclusividade, a criação de um índice exclusivo em vez de um índice não exclusivo na mesma combinação de colunas fornece informações adicionais para o otimizador de consulta que pode produzir planos de execução mais eficientes . É recomendável criar um índice exclusivo (de preferência criando uma restrição UNIQUE) neste caso.
Dado que meu índice de várias colunas contém a chave primária, esse índice composto será de fato único. Não é uma restrição que eu particularmente precise do SQL Server para impor durante cada inserção ou atualização; mas o fato é que esse índice não clusterizado é único.
Existe alguma vantagem em marcar esse índice exclusivo de fato como realmente único?
CRIAR ÍNDICE UNIQUE IX_Customers_CustomerIDEmail ON Customers ( Identificação do Cliente, O email )
Parece-me que o SQL Server pode ser inteligente o suficiente para perceber que meu índice já é exclusivo em virtude do fato de conter a chave primária.
- Mas talvez ele não saiba disso, e há uma vantagem para o otimizador se eu declarar o índice como único de qualquer maneira.
- Exceto, talvez, que agora possa levar a lentidão durante inserções e atualizações, onde é necessário executar verificações de exclusividade - onde antes nunca era necessário.
- A menos que saiba que o índice já é garantido , ele contém a chave primária.
Não consigo encontrar nenhuma orientação da Microsoft sobre o que fazer quando um índice composto contém a chave primária.
Os benefícios de índices exclusivos incluem o seguinte:
- A integridade dos dados das colunas definidas é garantida.
- Informações adicionais úteis para o otimizador de consulta são fornecidas.
Devo marcar um índice composto como exclusivo se ele já contiver a chave primária? Ou o SQL Server pode descobrir isso por si mesmo?