2010-08-02 18 views
7

Salve esperti del motore SQL Server; per favore condividi con noi un po 'del tuo approfondimento ...Prestazioni del server SQL: indice non cluster + colonne INCLUDE rispetto a indice cluster - equivalente?

A quanto ho capito, le colonne INCLUDE su un indice non in cluster consentono di memorizzare dati non chiave aggiuntivi con le pagine indice.

Sono ben consapevole dei vantaggi in termini di prestazioni che un indice cluster ha su un indice non in cluster semplicemente a causa del 1 passo in meno che il motore deve eseguire in un recupero per arrivare ai dati sul disco.

Tuttavia, poiché le colonne INCLUDE risiedono in un indice non cluster, è possibile che la seguente query abbia essenzialmente le stesse prestazioni tra gli scenari 1 e 2 poiché è possibile recuperare tutte le colonne dalle pagine indice nello scenario 2 anziché mai ricorrere alle pagine di dati della tabella?

QUERY

SELECT A, B, C FROM TBL ORDER BY A 

SCENARIO 1

CREATE CLUSTERED INDEX IX1 ON TBL (A, B, C); 

SCENARIO 2

CREATED NONCLUSTERED INDEX IX1 ON TBL (A) INCLUDE (B, C); 
+0

Che cosa dice il piano di query effettivo quando si passa da un setup di indice all'altro? –

+0

dipenderà dal carico di lavoro complessivo della query che colpisce quella tabella. –

+0

È interessante notare che l'indice non cluster è preferito nel piano di query, ma la possibilità di utilizzare suggerimenti di query, la complessità del motore nel decidere un piano di query ottimale basato sul volume di dati e chissà quali altri fattori lasciano per me un mistero persistente. Sto davvero cercando qualcuno che parli e dica INCLUDE che le colonne non sono tutto ciò che sono incrinate per un motivo o per un altro ... – Tahbaza

risposta

3

Per questo esempio si può reale ottenere prestazioni migliori con l'indice non in cluster. Ma dipende davvero da ulteriori informazioni che non hai fornito. Ecco alcuni pensieri.

SQL Server memorizza le informazioni in pagine da 8 KB; questo include dati e indici. Se la tabella include solo le colonne A, B e C, i dati verranno memorizzati in circa lo stesso numero di pagine di dati e le pagine di indice non in cluster. Tuttavia, se nella tabella sono presenti più colonne, i dati richiederanno più pagine. Il numero di pagine indice non sarebbe diverso.

Quindi, in una tabella con più colonne di quelle richieste dalla query, la query funzionerà meglio con l'indice di copertura non in cluster (indice con tutte le colonne). Sarà in grado di elaborare meno pagine per restituire i risultati desiderati.

Ovviamente, le differenze di prestazioni potrebbero non essere visualizzate finché non si ottiene un numero molto elevato di righe.

5

In effetti un indice non in cluster con colonne di copertura include può svolgere esattamente lo stesso ruolo di un indice cluster. Il costo è al momento dell'aggiornamento: più colonne includono più indici da aggiornare quando un valore di colonna incluso viene modificato nella tabella di base (nell'indice cluster). Inoltre, con più colonne incluse, aumenta la dimensione dei dati: il database diventa più grande e questo può complicare le operazioni di manutenzione.

Alla fine, è necessario trovare un equilibrio tra il valore di copertura degli indici aggiuntivi e più colonne incluse rispetto al costo di aggiornamento e aumento delle dimensioni dei dati.

Problemi correlati