Gibt es eine feste Regel, nach der entschieden werden muss, welche Spalten in welcher Reihenfolge in den nicht gruppierten Index aufgenommen werden sollen? Ich lese gerade diesen Beitrag https://stackoverflow.com/questions/1307990/why-use-the-include-clause-when-creating-an-index und ich fand , dass für die folgende Abfrage:
SELECT EmployeeID, DepartmentID, LastName
FROM Employee
WHERE DepartmentID = 5
Das Poster schlug vor, einen Index wie diesen zu erstellen:
CREATE NONCLUSTERED INDEX NC_EmpDep
ON Employee(EmployeeID, DepartmentID)
INCLUDE (Lastname)
Hier kommt meine Frage, warum wir so keinen Index erstellen können
CREATE NONCLUSTERED INDEX NC_EmpDep
ON Employee( EmployeeID, DepartmentID, LastName)
oder
CREATE NONCLUSTERED INDEX NC_EmpDep
ON Employee( EmployeeID, LastName)
INCLUDE (DepartmentID)
und was das Plakat dazu veranlasst, die LastName-Spalte beizubehalten. Warum nicht andere Spalten? und wie soll man entscheiden, in welcher Reihenfolge wir die Spalten dort behalten sollen?
sql-server
sql-server-2005
sql-server-2008
index
Gemeinschaft
quelle
quelle
Antworten:
Dieser Indexvorschlag von marc_s ist falsch. Ich habe einen Kommentar hinzugefügt. (Und es wurde auch meine Antwort angenommen!)
Der Index für diese Abfrage wäre
Ein Index ist in der Regel
Woher:
WHERE, JOIN, ORDER BY, GROUP BY etc
quelle
NonKeyColList
Bestellung spielt keine Rolle.KeyColList
Die Reihenfolge sollte in der Reihenfolge der Häufigkeit liegen, in der sie voraussichtlich in Abfragen verwendet werden. Siehe meine Notizen zu meiner Antwort unten, aber es ist wieLast Name, First Name, Middile Initial
in einem Telefonbuch. Sie benötigen das erste Feld, um das zweite Feld zu finden.JNK und gbn haben großartige Antworten gegeben, aber es lohnt sich auch, das große Ganze zu betrachten - und sich nicht nur auf eine einzelne Abfrage zu konzentrieren. Obwohl diese spezielle Abfrage möglicherweise von einem Index (# 1) profitiert:
Dieser Index hilft überhaupt nicht, wenn sich die Abfrage geringfügig ändert, z. B .:
Dies würde den Index (# 2) benötigen:
Stellen Sie sich vor, Sie hätten 1.000 Mitarbeiter in Abteilung 5. Wenn Sie den Index 1 verwenden, um alle Smiths zu finden, müssen Sie alle 1.000 Zeilen in Abteilung 5 durchsuchen, da die enthaltenen Spalten nicht Teil des Schlüssels sind. Mithilfe von Index 2 können Sie direkt zu Abteilung 5, Nachname Smith, navigieren.
Der Index Nr. 2 eignet sich daher besser für die Bearbeitung eines größeren Bereichs von Abfragen. Die Kosten sind jedoch ein aufgeblähterer Indexschlüssel, der die nichtblättrigen Seiten des Index vergrößert. Jedes System wird anders sein, daher gibt es hier keine Faustregel.
Als Randnotiz sei darauf hingewiesen, dass, wenn EmployeeID der Clustering-Schlüssel für diese Tabelle war - unter der Annahme eines Clustered-Index -, Sie EmployeeID nicht einschließen müssen - dies ist in allen nicht-Clustered-Indizes der Fall, was bedeutet, dass Index 2 genau dies könnte Sein
quelle
Ich bin mir nicht sicher, wie du zu dem ersten gekommen bist. Für diese Abfrage würde ich Folgendes verwenden:
In SQL gibt es für so ziemlich alles keine "harte und schnelle Regel".
In Ihrem Beispiel verwendet der Index jedoch nur das Feld,
DepartmentID
weil es in derWHERE
Klausel enthalten ist.Die anderen Felder müssen von dort aus einfach erreichbar sein. Sie wählen basierend
DepartmentID
darauf, dassINCLUDE
diese Felder am Blattknoten des Index vorhanden sind.Sie möchten keine anderen Beispiele verwenden, da diese für diesen Index nicht funktionieren.
Stellen Sie sich einen Index wie ein Telefonbuch vor. Die meisten Telefonbücher sind nach Nachname, Vorname und mittlerer Initiale sortiert. Wenn Sie den Vornamen einer Person kennen, aber nicht deren Nachnamen, ist das Telefonbuch nicht gut, da Sie nicht anhand der Reihenfolge des Telefonbuchindex nach dem Vornamen suchen können.
Die
INCLUDE
Felder sind wie Telefonnummer, Adresse usw. andere Informationen für jeden Eintrag im Buch.BEARBEITEN:
Um weiter zu klären, warum man nicht benutzt:
Dieser Index ist nur nützlich, wenn Sie entweder
EmployeeID
oder BEIDEEmployeeID
undLastName
in IhrerWHERE
Klausel haben. Dies ist so ziemlich das GEGENÜBER von dem, was Sie für diese Abfrage benötigen.quelle
Möglicherweise können Sie den Index (employee_id, department_id) weiterhin verwenden, aber Sie müssen eine 'Dummy'-Zeile in den where-Ausdruck einfügen, z. B .: "employee_id = employee_id)
Benutze den "alten" Trick?
Wählen Sie * aus Employee emp,
wobei emp.employee_id = emp.employee_id
und emp.department_id = 5
(Ich konzentriere mich also nicht auf den Include-Teil von Lastname, sondern darauf, ob der Schlüssel ja / oder nicht verwendet wird.)
Mit freundlichen Grüßen,
Miguell
quelle