Data una tabella con una chiave primaria, ad esempio:
CREATE TABLE Customers (
CustomerID int NOT NULL PRIMARY KEY,
FirstName nvarchar(50),
LastName nvarchar(50),
Address nvarchar(200),
Email nvarchar(260)
--...
)
abbiamo una chiave primaria univoca attivata CustomerID
.
Tradizionalmente potrei aver bisogno di alcuni indici di copertura aggiuntivi; ad esempio per trovare rapidamente un utente tramite uno CustomerID
o Email
:
CREATE INDEX IX_Customers_CustomerIDEmail ON Customers
(
CustomerID,
Email
)
E questi sono i tipi di indici che ho creato per decenni.
Non è necessario per essere unico, ma in realtà lo è
L'indice stesso esiste per evitare una scansione della tabella; è un indice di copertura al fine di favorire le prestazioni (l'indice non è presente come un vincolo per rafforzare l'unicità).
Oggi ho ricordato un po 'di informazioni: SQL Server può usare il fatto che:
- una colonna ha un vincolo di chiave esterna
- una colonna ha un indice univoco
- un vincolo è attendibile
per aiutarlo a ottimizzare l'esecuzione della query. In effetti, dalla Guida alla progettazione dell'indice di SQL Server :
Se i dati sono univoci e si desidera applicare l'univocità, la creazione di un indice univoco anziché un indice non univoco sulla stessa combinazione di colonne fornisce ulteriori informazioni per Query Optimizer in grado di produrre piani di esecuzione più efficienti . In questo caso è consigliabile creare un indice univoco (preferibilmente creando un vincolo UNIQUE).
Dato che il mio indice multi-colonna contiene la chiave primaria, questo indice composito sarà di fatto univoco. Non è un vincolo che ho particolarmente bisogno di far applicare SQL Server durante ogni inserimento o aggiornamento; ma il fatto è che questo indice non cluster è unico.
C'è qualche vantaggio nel contrassegnare questo indice unico di fatto come realmente unico?
CREA UN INDICE UNICO IX_Customers_CustomerIDEmail SU Clienti ( Identificativo del cliente, E-mail )
Mi sembra che SQL Server possa essere abbastanza intelligente da rendermi conto che il mio indice è già unico in quanto contiene la chiave primaria.
- Ma forse non lo sa, e c'è un vantaggio per l'ottimizzatore se dichiaro comunque l'indice come unico.
- Tranne forse ciò potrebbe ora portare a rallentamenti durante inserimenti e aggiornamenti, dove deve eseguire controlli di unicità - dove prima non aveva mai dovuto prima.
- A meno che non sappia che l'indice è già garantito come unico, poiché contiene la chiave primaria.
Non riesco a trovare alcuna guida da Microsoft su cosa fare quando un indice composito contiene la chiave primaria.
I vantaggi di indici univoci includono:
- L'integrità dei dati delle colonne definite è garantita.
- Vengono fornite ulteriori informazioni utili per Query Optimizer.
Devo contrassegnare un indice composito come unico se contiene già la chiave primaria? O SQL Server può capirlo da solo?