2012-04-04 9 views
3

Sagen, ich habe eine typische Kundentabelle;TSQL Indizes auf Suchfelder, sollte ich Id

Id Int Identity Primary Key, 
FirstName varchar(255), 
LastName varchar(255), 
Phone VarChar(30) 

So Primärschlüssel erzeugt einen gruppierten eindeutigen Index für Id.

Um die Suche schneller zu machen, möchte ich den Namensfeldern Indizes hinzufügen.

Meine Frage ist, ob ich die ID zu diesen Indizes hinzufügen sollte oder diese Indizes sich sowieso an den Primärschlüssel binden werden.

Zum Beispiel;

Create Index IX_Customer_FirstLastName On Customers(FirstName, LastName, Id) 

... ist das übertrieben?

Ist das Folgende mehr oder weniger effizient?

Create Index IX_Customer_FirstLastName On Customers(FirstName, LastName) 

TIA

+0

Wonach würden Sie suchen? Immer auf vollen Vornamen/Nachnamen oder einzeln oder ...? –

+0

Nun, es ist eher eine allgemeine Frage. Bietet es Vorteile, wenn das Primärschlüsselfeld in einem anderen Index einer Tabelle enthalten ist? –

+0

Im Allgemeinen nicht, die Antwort von @MichaelFredrickson deckt es ziemlich viel ab. –

Antwort

2

Es wäre nicht sinnvoll, die ID zu Ihrem anderen Index hinzuzufügen. Es wäre nur hilfreich, wenn Sie eine große Anzahl von Zeilen mit identischen firstNamelastName Kombinationen haben, und Sie wussten bereits die ID ...

Aber wenn Sie bereits wissen, dass die ID für die Datensätze, die Sie für die Suche sind, werden Sie könnte nur mit Ihrem Clustered-Index suchen.

Darüber hinaus enthält jeder nicht gruppierte Index bereits einen Wert für den gruppierten Index, sodass er die Zeile mit dem gruppierten Index nachschlagen kann, nachdem er mit dem nicht gruppierten Index gefunden wurde. You wouldn't have to include ID in your non-clustered index if you wanted to make it a covering index for the fields (FirstName, LastName, Id)

Abschließender Hinweis, wenn Sie einen einzelnen Index mit FirstName und LastName machen, wird dieser Index nur bei Suchanfragen verwendet werden, die FirstName umfassen, die Vorderkante des Index. Wenn Sie nur mit LastName oder nur FirstName Suchen durchführen möchten, erstellen Sie zwei Indizes, einen für jede Spalte.

+0

Dank Michael, die Tatsache, dass nicht geclusterte Indizes auf den Clustered-Index zeigen, beantwortet meine Frage. Wenn ich darf, möchte ich nur diese Frage etwas erweitern. Wenn der Primärschlüssel ein UniqueIdentifier ist, würde ich ihn aus Leistungsgründen nicht gruppiert machen. Würden Sie immer noch empfehlen, die ID der nachfolgenden Indizes zu belassen? –

+0

Ich würde immer noch nicht die 'ID' Teil des Index, wenn Sie [' INCLUDE'] (http://msdn.microsoft.com/en-us/library/ms188783.aspx) die ID in der Reihenfolge um den Index abzudecken, dann könnte das vertretbar sein ... aber ich gehe davon aus, dass dieser Fall wahrscheinlich unwahrscheinlich ist und dass Sie die ID aus diesem Grund wahrscheinlich nicht aufnehmen müssen. Ich würde jedoch davon abraten, Ihr PK zu einem eindeutigen Bezeichner zu machen, da [selbst bei Verwendung eines nicht gruppierten Indexes mit einer GUID immer noch eine große Fragmentierung auftritt] (http://www.sqlskills.com/BLOGS/PAUL/). Post/Clustered-oder-Nonclustered-Index-auf-ein-Random-GUID.aspx). –

+0

Danke Michael, Die Wahl von UniqueIdentifier an einem Projekt liegt nicht in meiner Hand. Ich habe zumindest die Clustered-Indizes für sie in nicht-Clustered konvertiert! –

Verwandte Themen