2012-05-31 11 views
19

voglio creare Index In SQL Server 2008 R2 in Colonna1 e Column2 Qual è la differenza di sotto query:Differenza di creare indice utilizzando includere colonna o non usare

  1. non comprendono

    CREATE NONCLUSTERED INDEX [IX_1] ON [dbo].[MyTable] 
    (
        [Column1] ASC, 
        [Column2] ASC 
    ) ON [PRIMARY] 
    
  2. o includere:

    CREATE NONCLUSTERED INDEX [IX_2] ON [dbo].[MyTable] 
    (
        [Column1] ASC 
    ) 
    INCLUDE ([Column2]) ON [PRIMARY] 
    

risposta

23

Nel primo viene aggiunto Column2 alla chiave dell'indice. Nella seconda non è possibile aggiungere (*) alla chiave, nel qual caso verrà visualizzata solo nelle pagine foglia indice. Ciò può consentire la ricerca dell'indice per Column1 ma evitare la necessità di tornare alla tabella di base (bookmark lookup/key lookup) per recuperare il valore per Column2.

vale a dire che rende index2 "copertura" per le query quali

SELECT Column1,Column2 
FROM [dbo].[MyTable] 
WHERE Column1 = 'X' 

E copre anche le query quali

SELECT Column1,Column2 
FROM [dbo].[MyTable] 
WHERE Column1 = 'X' AND Column2 = 'Y' 

Ma index1 potrebbe funzionare meglio per la seconda query in quanto si può chiedere sulle due colonne direttamente (al contrario di essere in grado di cercare su Column1, quindi, è necessario valutare tutte le righe corrispondenti a livello di indice per vedere se soddisfano il predicato Column2). Se Column2 non viene mai utilizzato come un predicato di ricerca rispetto a tale indice e le query su tale indice non trarrebbero vantaggio dall'avere Column2 ordinato, allora dovrebbe essere aggiunto come colonna INCLUDE per mantenere la dimensione della chiave verso il basso e ridurre il numero di pagine nell'indice.

(*) Il motivo dico "potrebbe non" di cui sopra è perché se Column2 è (in parte) la chiave di indice cluster è will still be added there anyway per un indice non cluster non è stato creato con l'opzione UNIQUE.

+0

grazie mille. –

Problemi correlati