Quando quero que uma coluna tenha valores distintos, posso usar uma restrição
create table t1(
id int primary key,
code varchar(10) unique NULL
);
go
ou eu posso usar um índice único
create table t2(
id int primary key,
code varchar(10) NULL
);
go
create unique index I_t2 on t2(code);
As colunas com restrições exclusivas parecem ser boas candidatas a índices exclusivos.
Existem razões conhecidas para usar restrições exclusivas e não usar índices exclusivos?
Respostas:
Sob o capô, uma restrição exclusiva é implementada da mesma maneira que um índice exclusivo - é necessário um índice para atender com eficiência o requisito de impor a restrição. Mesmo que o índice seja criado como resultado de uma restrição UNIQUE, o planejador de consultas poderá usá-lo como qualquer outro índice, se considerar a melhor maneira de abordar uma determinada consulta.
Portanto, para um banco de dados que ofereça suporte a ambos os recursos, a escolha de qual usar usará frequentemente com estilo e consistência preferidos.
Se você planeja usar o índice como um índice (ou seja, seu código pode ser rápido para pesquisar / classificar / filtrar nesse campo), eu explicitamente usaria um índice exclusivo (e comentaria a fonte) em vez de uma restrição para fazer isso clear - dessa maneira, se o requisito de exclusividade for alterado em uma revisão posterior do aplicativo que você (ou algum outro codificador) saberá para garantir que um índice não exclusivo seja colocado no lugar do único (apenas remover uma restrição exclusiva removeria o índice completamente). Além disso, um índice específico pode ser nomeado em uma dica de índice (ie WITH (INDEX (ix_index_name)), o que não acho que seja o caso do índice criado nos bastidores para gerenciar a exclusividade, pois é improvável que você saiba seu nome.
Da mesma forma, se você precisar apenas aplicar a exclusividade como regra de negócios, e não o campo que precisa ser pesquisado ou usado para classificação, eu usaria a restrição novamente para tornar o uso pretendido mais óbvio quando alguém examinar sua definição de tabela.
Observe que, se você usar uma restrição exclusiva e um índice exclusivo no mesmo campo, o banco de dados não será brilhante o suficiente para ver a duplicação; portanto, você terminará com dois índices que consumirão espaço extra e desacelerarão as inserções / atualizações de linhas.
fonte
CREATE TABLE #T(X INT CONSTRAINT PK PRIMARY KEY NONCLUSTERED);SELECT * FROM #T WITH(INDEX(PK)) WHERE X = 1
. Os índices podem ser mais flexíveis, embora essas restrições não suportem todas as opções de índice, comoINCLUDE
colunas d ou índices filtrados.Além dos pontos em outras respostas, aqui estão algumas diferenças importantes entre os dois.
Nota: As mensagens de erro são do SQL Server 2012.
Erros
A violação de uma restrição exclusiva retorna o erro 2627.
A violação de um índice exclusivo retorna o erro 2601.
Desativando
Uma restrição exclusiva não pode ser desativada.
Mas o índice exclusivo por trás de uma restrição de chave primária ou de uma restrição exclusiva pode ser desativado, assim como qualquer índice exclusivo. Brain2000 com ponta de chapéu.
Observe o aviso usual de que desabilitar um índice clusterizado torna os dados inacessíveis.
Opções
Restrições exclusivas oferecem suporte a opções de indexação como
FILLFACTOR
eIGNORE_DUP_KEY
, embora esse não tenha sido o caso para todas as versões do SQL Server.Colunas incluídas
Os índices não clusterizados podem incluir colunas não indexadas (denominado índice de cobertura, este é um grande aprimoramento de desempenho). Os índices por trás das restrições PRIMARY KEY e UNIQUE não podem incluir colunas. @Ypercube.
Filtragem
Uma restrição exclusiva não pode ser filtrada.
Um índice exclusivo pode ser filtrado.
Restrições de chave estrangeira
Uma restrição de chave estrangeira não pode fazer referência a um índice exclusivo filtrado, embora possa fazer referência a um índice exclusivo não filtrado (acho que foi adicionado no SQL Server 2005).
Nomeação
Ao criar uma restrição, a especificação de um nome de restrição é opcional (para todos os cinco tipos de restrições). Se você não especificar um nome, o MSSQL gerará um para você.
Ao criar índices, você deve especificar um nome.
Gorro @ i-one.
Ligações
http://technet.microsoft.com/en-us/library/aa224827(v=SQL.80).aspx
http://technet.microsoft.com/en-us/library/ms177456.aspx
fonte
Para citar o MSDN como uma fonte autorizada:
E...
Outro em: https://technet.microsoft.com/en-us/library/aa224827%28v=sql.80%29.aspx
fonte
Uma das principais diferenças entre uma restrição exclusiva e um índice exclusivo é que uma restrição de chave estrangeira em outra tabela pode fazer referência a colunas que compõem uma restrição exclusiva. Isso não é verdade para índices exclusivos. Além disso, restrições exclusivas são definidas como parte do padrão ANSI, enquanto os índices não são. Por fim, a restrição exclusiva é considerada residir no domínio do design de banco de dados lógico (que pode ser implementado de maneira diferente por diferentes mecanismos de banco de dados), enquanto o índice é um aspecto físico. Portanto, a restrição exclusiva é mais declarativa. Eu preferiria restrições únicas em quase todos os casos.
fonte
No Oracle, uma grande diferença é que você pode criar um índice exclusivo de função, o que não é possível com restrições exclusivas:
Por exemplo
Então,
fk_xyz
é único apenas para o registro que temamount != 0
.fonte
WHERE
cláusula.CREATE UNIQUE NONCLUSTERED INDEX P4_U ON DBO.P4 ( PID ) WHERE TXT = 'qwert' ;
A restrição UNIQUE é preferível ao índice UNIQUE. Quando a restrição não é exclusiva, você precisa usar um índice regular ou não exclusivo. Restrição também é outro tipo de índice. O índice é usado para acesso mais rápido.
Índices exclusivos podem ter cláusulas where. Por exemplo, você pode criar índices para cada ano com base na coluna da data
fonte