Qual è la differenza tra la creazione di un indice UNIQUE come "indice" o come "vincolo" in SQL Server?

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

Domanda

Quando si crea un indice su una colonna che sarà UNICA (ma non la chiave primaria della tabella), SQL Server mi permetta di scegliere alcune opzioni:

1) Posso scegliere che sia un Vincolo o un Indice.
Immagino che questo significhi che se lo imposto come vincolo, non lo userà durante l'interrogazione, solo durante la scrittura. Tuttavia, l'unico modo efficace a cui riesco a pensare che SQL Server imponga tale vincolo è in realtà la creazione di un indice. A che serve questa opzione?

2) Inoltre, se lo imposto come " index " ;, mi consente di specificare che dovrebbe ignorare le chiavi duplicate. Questo è il più sconcertante per me ...
Suppongo di nuovo che significhi l'opposto del vincolo. Probabilmente significa "utilizzarlo durante le query, ma non controllare nemmeno quando si scrive".
Ma allora perché dovrei impostarlo come UNICO?
Immagino che ci siano alcune ottimizzazioni che SQL Server può fare, ma vorrei capirlo meglio.

Qualcuno sa esattamente cosa fa SQL Server con queste opzioni?
Qual è il caso d'uso per impostare un indice su Unico, ma ignora le chiavi duplicate?

NOTA: questo è per SQL Server 2000


MODIFICA: Secondo quanto hai detto, tuttavia ... Se creo un vincolo, verrà utilizzato per accelerare le query che filtrano utilizzando i campi nel vincolo?

Grazie!

È stato utile?

Soluzione

Un vincolo UNIQUE fa parte dello standard SQL ISO / ANSI, mentre gli indici non sono perché lo standard è indipendente dall'implementazione. SQL Server, in comune con la maggior parte dei DBMS SQL, utilizzerà un indice per implementare un vincolo UNIQUE .

Probabilmente, usare UNIQUE anziché indicizzare in uno script SQL è leggermente più portatile ma come sempre la sintassi proprietaria non dovrebbe essere esclusa se offre opportunità di ottimizzazione ecc. .

Altri suggerimenti

SQL Server costruirà un indice per implementare i vincoli UNIQUE. Puoi vedere un riferimento all'indice univoco utilizzato per imporre vincoli univoci nella sys.key_constraints vista (nel 2005 - scusate, non conosco l'equivalente del 2000). Ma entrambe le versioni utilizzeranno l'indice durante le query.

La differenza è che se crei un indice hai più controllo su come è costruito. In particolare, puoi includere colonne aggiuntive che possono essere cercate frequentemente insieme alla chiave.

Entrambe le opzioni ti consentiranno di "ignorare le chiavi duplicate" sui dati esistenti, ma entrambi genereranno un errore se si tenta di inserire un nuovo valore che ne duplica uno esistente.

Non esiste alcuna differenza pratica tra un vincolo univoco e un indice univoco se non il fatto che il vincolo univoco è anche elencato come oggetto vincolo nel database.

Secondo MSDN, non ci sono differenze significative tra la creazione di un indice univoco attraverso un vincolo univoco o la creazione esplicita mediante l'istruzione CREATE UNIQUE INDEX. In entrambi i casi, i dati vengono convalidati per l'univocità allo stesso modo e anche Query Optimizer non li tratta in modo diverso. Come buona pratica, utilizzare un vincolo univoco se l'obiettivo è l'integrità dei dati, in altri casi utilizzare direttamente l'istruzione CREATE UNIQUE INDEX.

Ecco un eccellente articolo e un video che spiega la differenza tra entrambi gli approcci.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top