2012-05-31 5 views
19

I Want Index erstellen In SQL Server 2008 R2 in Column1 und Column2 Was ist der Unterschied von unter Abfrage ist:Differenz von erstellen Index durch umfassen Spalte oder nicht mit

  1. Nicht enthalten

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

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

Antwort

23

In der ersten wird Column2 zum Indexschlüssel hinzugefügt. Im zweiten Fall ist es nicht möglich, (*) dem Schlüssel hinzuzufügen. In diesem Fall wird er nur in den Indexblattseiten angezeigt. Dadurch kann der Index nach Column1 durchsucht werden, Sie müssen jedoch nicht zur Basistabelle (bookmark lookup/key lookup) zurückkehren, um den Wert für Column2 abzurufen.

dh es index2 „Abdeckung“ für Anfragen wie

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

macht Und es deckt Abfragen auch wie

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

Aber index1 kann auch eine bessere Leistung für die zweite Abfrage, da sie suchen können auf den beiden Spalten direkt (im Gegensatz zu nur auf Column1 suchen können, dann müssen alle übereinstimmenden Zeilen auf der Indexblatt Ebene zu prüfen, ob sie das Column2 Prädikat erfüllen). Wenn Column2 niemals als Suchprädikat für diesen Index verwendet wird und Ihre Abfragen für diesen Index nicht von Column2 bestellt werden, dann sollte es als INCLUDE -d Spalte hinzugefügt werden, um die Größe des Schlüssels niedrig zu halten und die Anzahl zu reduzieren Seiten im Index.

(*) Der Grund, warum ich sage, „vielleicht nicht“ oben da ist, wenn Column2 sind (ein Teil) die Clustered-Index Schlüssel es will still be added there anyway für einen nicht gruppierten Index nicht mit der UNIQUE Option erstellt.

+0

vielen Dank. –

Verwandte Themen