2012-04-21 16 views
42

Ho una tabella denominata countries e definisco la colonna country_name univoca creando un "indice/chiave" di tipo "Chiave univoca" su SQL Server 2008 R2.Indice chiave univoco su SQL Server 2008

Ma non ho le seguenti domande:

  1. sarà la creazione di “Index/Chiave” di tipo “Chiave Unica” creare automaticamente un indice non cluster su questa colonna?
  2. se cambio il tipo da "Chiave univoca" a "Indice" e mantengo il valore IsUnique come "Sì", quindi ci saranno differenze?
  3. quindi perché ci sono due opzioni "Chiave Unica" e "Indice" Penso che i due siano gli stessi?

risposta

59

Un vincolo univoco è implementato dietro le quinte come un indice univoco, quindi non importa come lo si specifica. Io tendo ad implementarlo semplicemente come:

ALTER TABLE dbo.foo ADD CONSTRAINT UQ_bar UNIQUE(bar); 

Alcune persone creano invece un indice univoco, ad es.

CREATE UNIQUE INDEX IX_UQ_Bar ON dbo.foo(bar); 

La differenza è nel intenzioni - se si sta creando il vincolo di far rispettare le regole/aziendali di unicità, si crea un vincolo, se si sta facendo in modo di aiutare le prestazioni delle query, potrebbe essere più logico creare un indice unico Di nuovo, sotto le coperte è la stessa implementazione, ma la strada che prendi per arrivarci può aiutarti a documentare le tue intenzioni.

Penso che ci siano più opzioni per aderire ad entrambe le precedenti funzionalità di Sybase nonché per aderire allo standard ANSI (anche se i vincoli univoci non aderiscono allo standard 100%, poiché consentono solo un valore NULL - a l'indice univoco, d'altra parte, può aggirare questo problema aggiungendo una clausola WHERE (WHERE col IS NOT NULL) su SQL Server 2008 e versioni successive).

+0

Non sono sicuro se si tratta solo di differenziazione delle informazioni, ma 'sys.indexes' ha la colonna' is_unique_constraint' per indicare se l'indice è definito come un vincolo invece di un indice univoco. –

+1

@Andre Sì, questa è una colonna nei metadati, in modo che un * utente * possa dire se è stato originariamente dichiarato come un vincolo. Questo non ti dice nulla sull'intenzione e l'implementazione fisica dell'indice stesso e l'applicazione dell'unicità sono le stesse. –

10

Un'ulteriore cosa da ricordare è che se si crea un indice, è possibile specificare colonne incluse, questo può aiutare il codice SQL a lavorare più velocemente se c'è qualche ricerca per nome paese.

CREATE UNIQUE NONCLUSTERED INDEX IX_UQ_Bar 
ON dbo.foo (
    bar 
) 
INCLUDE (foo_other_column) 
GO 

SELECT foo_other_column FROM Foo WHERE bar = 'test' 

SQL server memorizzerà "foo_other_column" nell'indice stesso. In caso di vincolo univoco, per prima cosa troverà l'indice di "test", quindi cercherà la riga nella tabella foo e solo lì ci vorrà "foo_other_column".

Problemi correlati