2009-08-10 2 views
2

Unter der Annahme, die folgenden:SQL Server Indexverwendung Frage

/* 

drop index ix_vouchers_nacsz on dbo.vouchers; 
drop index ix_vouchers_nacsz2 on dbo.vouchers; 

create index ix_vouchers_nacsz on dbo.Vouchers(
    FirstName, LastName, 
    Address, Address2, City, 
    State, Zip, Email 
); 

create index ix_vouchers_nacsz2 on dbo.Vouchers(
    Email, FirstName, LastName, 
    Address, Address2, City, 
    State, Zip 
); 

*/ 

select count(firstname) from vouchers 
    with (index(ix_vouchers_nacsz)) 
where 
    firstname = 'chris' and 
    lastname = '' and 
    address = '' and 
    address2 = '' and 
    city = '' and 
    state = '' and 
    zip = '' 

select count(firstname) from vouchers 
    with (index(ix_vouchers_nacsz2)) 
where 
    firstname = 'chris' and 
    lastname = '' and 
    address = '' and 
    address2 = '' and 
    city = '' and 
    state = '' and 
    zip = '' 

Warum das zweite Index Ergebnis in einem Index-Scan, während die ersten Ergebnisse in einem Index suchen? Welchen Unterschied macht die Reihenfolge der Schlüssel?

Antwort

5

Der zweite Index beginnt mit dem E-Mail-Feld, aber Sie filtern nicht nach E-Mails. Das macht den Index nutzlos.

Ein Index ist in der Regel ein b-tree, mit dem Sie eine binary search tun können. Der B-Baum ist nach seinen Indexfeldern sortiert. Wenn Sie also das erste Feld kennen, können Sie es schnell nachschlagen. Innerhalb der gleichen Werte des ersten Feldes können Sie das zweite Feld sehr schnell nachschlagen.

Es ist wie ein Telefonbuch, das nach Nachnamen sortiert ist. Sie können damit nicht nach einer bestimmten Telefonnummer suchen.

+0

ausgezeichneter Punkt, ja, die Einbeziehung der Spalte "E-Mail" in den Index, der nie verwendet wird macht es für diese Abfrage unbrauchbar –

+0

Ich habe eine andere Abfrage, die die E-Mail-Spalte verwendet. Ich habe diesen Index in der Hoffnung hinzugefügt, dass beide Abfragen ihn dann verwenden könnten, anstatt zwei große Indizes zu haben. Sollte ich stattdessen nur zwei Indizes erstellen? – Chris

+1

Basierend auf den Informationen in der Frage, würde ich zwei Indizes für (Vorname, Nachname) und (E-Mail) erstellen. Diese Indizes sollten eine Zeile fast eindeutig identifizieren. – Andomar

0

Das Anwenden der 'Telefonbuch' Analogie kann beim Verständnis helfen.

Der erste Index ist ein "Telefonbuch" sortiert nach FirstName, dann Nachname und so weiter. Wenn Sie gebeten werden, Chris in diesem Telefonbuch nachzuschlagen, können Sie alle Chris 'zusammen mit dem Index aufgelistet finden.

Im zweiten Index, ist ein Telefonbuch nach "Telefonnummern" sortiert (oder E-Mail genauso einfach), dann Vorname, dann Nachname und so weiter. Wenn Sie gebeten haben, dieses Telefonbuch zu verwenden, um Einträge mit dem Vornamen von Chris zu suchen, Ihr Glück ist das Telefonbuch nicht auf diese Weise sortiert! Wenn Sie gebeten werden, nach der E-Mail-Adresse [email protected] zu suchen und Chris zu benennen, können Sie die E-Mail-Adresse zuerst suchen und nach übereinstimmenden Namen suchen.

0

Im Fall von Index "die Reihenfolge der Spalten im Index", "Spalte Reihenfolge in Where-Klausel" wird viel. Sie können folgende Link verweisen:

http://ashishkhandelwal.arkutil.com/sql-server/quick-and-short-database-indexes/

• Best Practices Indizes verwenden • Wie beste Leistung Form Indizes erhalten • Clustered-Index Überlegungen • Nonclustered Indizes Überlegungen

Ich bin sicher, dass dies helfen wird, Sie bei der Planung für den Index.