Qual é a diferença entre a criação de um índice UNIQUE como “índice” ou como “restrição” no SQL Server?

StackOverflow https://stackoverflow.com/questions/222065

Pergunta

Ao criar um índice sobre a coluna que vai ser UNIQUE (mas não a chave primária da tabela), deixe-servidor SQL é me escolher algumas opções:

1) eu posso escolher para ser um constrangimento ou um índice.
Eu estou supondo que isto significa que se eu defini-lo como restrição, não vai usá-lo ao consultar, só quando escrevendo. No entanto, a única maneira eficiente que eu posso pensar para SQL Server para impor essa restrição é realmente construindo um índice. Qual é a utilidade para esta opção?

2) Além disso, se eu defini-lo como "índice", que vamos me especificar que ele deve ignorar chaves duplicadas. Este é o mais intrigante para mim ...
Eu novamente acho que significa o oposto de restrição. Isso provavelmente significa "usá-lo ao consultar, mas nem sequer verificar quando se escreve".
Mas então por que eu defini-lo como único?
Eu estou supondo que há algumas otimizações SQL Server pode fazer, mas eu gostaria de entender melhor.

Alguém sabe o que exatamente SQL Server faz com essas opções?
O que é o caso de uso para a criação de um índice para ser único, mas ignoram chaves duplicadas?

NOTA: Isto é para SQL Server 2000


EDIT: De acordo com o que você disse, no entanto ... Se eu criar uma restrição, ela pode ser usada para acelerar as consultas que filtram usando os campos na restrição

?

Obrigado!

Foi útil?

Solução

Uma restrição UNIQUE é parte do padrão ISO / ANSI SQL, enquanto que os índices não são porque o padrão é a implementação agnóstico. SQL Server, em comum com a maioria SQL SGBDs, irá utilizar um índice para implementar uma restrição UNIQUE.

Provavelmente, usando UNIQUE em vez de índice em um script SQL é ligeiramente mais portátil, mas como sempre a sintaxe de propriedade não deve ser descartada se provids oportunidades de otimização etc.

Outras dicas

SQL Server irá criar um índice para implementar restrições UNIQUE. Você pode ver uma referência para o índice exclusivo que é usada para impor restrições exclusivas no sys.key_constraints vista (em 2005 - desculpe, eu não sei o equivalente 2000). Mas ambas as versões usará o índice ao consultar.

A diferença é que, se você criar um índice que você tem mais controle sobre como ele é construído. Em particular, você pode incluir colunas adicionais que podem ser procurados com frequência junto com a chave.

Ambas as opções permitem que você "ignorar chaves duplicadas" na existente dados, mas ambos irão gerar um erro se você tentar inserir um new valor que duplica um existente um.

Não há nenhuma diferença prática entre uma restrição exclusiva e um índice exclusivo que não seja o fato de que a restrição exclusiva também é listado como um objeto de restrição no banco de dados.

De acordo com MSDN, não há diferenças significativas entre a criação de um índice exclusivo através de uma restrição exclusiva, ou explicitamente a criação usando instrução CREATE UNIQUE INDEX. Em ambos os casos, os dados são validados para a singularidade da mesma forma, e também o otimizador de consulta não tratá-los de forma diferente. Como boa prática, use restrição exclusiva se a integridade dos dados é o objetivo, outro uso sábio instrução CREATE UNIQUE INDEX diretamente.

aqui é um excelente artigo e um vídeo explicando a diferença entre ambas as abordagens.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top