2010-07-21 19 views
41

Sono interessato ad apprendere quale tecnica gli sviluppatori preferiscono utilizzare per forzare l'unicità in SQL Server: UNICO CONSTRAINT o UNICO INDICE. Dato che c'è poca differenza nell'implementazione fisica di ciascuno, come si decide quale sia il migliore?Vincolo univoco rispetto all'indice univoco

Ci sono motivi diversi dalle prestazioni per valutare la soluzione migliore?

Ci sono vantaggi di gestione del database per uno o l'altro?

risposta

30

questo articolo di MSDN confronto tra i due è per SQL Server 2000: http://msdn.microsoft.com/en-us/library/aa224827(SQL.80).aspx

Per la maggior parte degli scopi, non c'è alcuna differenza - il vincolo è implementato come un indice sotto le coperte. E anche se esiste la possibilità di disabilitare il vincolo, in realtà non funziona in SQL Server.

È importante solo se si desidera modificare elementi come FILLFACTOR, ecc. Per il modo in cui si desidera implementare il vincolo univoco.

SQL Server 2008+ ha aggiunto INCLUDE per fornire indici di copertura più efficienti. Indici filtrati = vincolo univoco su un sottoinsieme di righe/ignora più null ecc.

+2

L'articolo è buono. È interessante che conclude "che non c'è alcuna differenza pratica" oltre ai meta-dati. – bobs

+0

tut, tut, citando MSDN per SQL Server 2000 – gbn

+2

@gbn: vero, ma qualcosa è cambiato? –

26

Sono not significantly different. Quando si crea un vincolo univoco, SQL Server creerà automaticamente un indice univoco.

Con la sintassi per la creazione di un indice, si può avere un migliore controllo definente un indice univoco per specificare la cluster/cluster, incluso colonne, filegroup, filtraggio dell'indice (SqlSvr2008), ecc

Un vincolo è preferibile in più casi perché esprime l'intento dell'unicità: è un vincolo. Un indice non trasmette questo intento.

Per quanto riguarda la gestibilità, l'impatto è minimo. È possibile gestire l'indice (ricostruzione, reorg) come se fosse stato creato indipendentemente dal vincolo. L'unica differenza è che il vincolo dipende dall'indice, quindi per eliminare l'indice, devi anche eliminare il vincolo.

+1

+1 Direi anche coerenza, così come spesso si finisce per cambiare un vincolo in un indice in ogni caso per aggiungere un INCLUSO – gbn

1

Un unico vincolo implica univocità e la rimozione del vincolo rimuoverà l'indice creato dal motore. Un indice può essere modificato per rimuovere la sua unicità e hai ancora il tuo indice. Penso che si possa presumere che la maggior parte delle colonne su cui si imporrebbe l'unicità sarebbe anche utile come indice per ragioni di rendimento; ergo, io uso per lo più indici univoci. Io uso i vincoli univoci solo sulle colonne che devono essere uniche ma che servono scarsamente per le prestazioni (ad esempio un varchar (200) che deve essere univoco); in tal caso, voglio sottolineare chiaramente che deve essere unica, ma probabilmente non è un'idea così buona da cercare nonostante l'indice sottostante.

2

I miei due centesimi: vorrei utilizzare un vincolo quando volevo descrivere la logica aziendale e un indice quando volevo migliorare le prestazioni. Il fatto che possano essere implementati uguali in un DBMS non significa che la distinzione tra i motivi per la definizione di questi oggetti non sia significativa.