2017-09-07 1 views
2

Ich habe einen nicht geclusterten, nicht eindeutigen Index für eine Spalte (Datum) in einer großen Tabelle (16 Millionen Zeilen) erstellt, erhalte jedoch im Vergleich zur exakt gleichen Abfrage, die erzwungen wird, sehr ähnliche Abfragegeschwindigkeiten Verwenden Sie keine Indizes.Index verringert Anzahl der gelesenen Zeilen; Keine Leistungsverbesserung

Abfrage 1 (verwendet index):

SELECT * 
FROM testtable 
WHERE date BETWEEN '01/01/2017' AND '03/01/2017' 
ORDER BY date 

Abfrage-2 (kein Index):

SELECT * 
FROM testtable WITH(INDEX(0)) 
WHERE date BETWEEN '01/01/2017' AND '03/01/2017' 
ORDER BY date 

Beiden Abfragen, um die gleiche Menge an Zeit zu laufen, und das gleiche Ergebnis. Wenn Sie den Ausführungsplan für jedes Element betrachten, beträgt die Anzahl der gelesenen Zeilen von Abfrage 1
~ 4 Millionen Zeilen, wobei Abfrage 2 106 Millionen Zeilen liest. Es scheint, dass der Index funktioniert, aber ich bekomme keine Leistungsvorteile daraus.

Irgendwelche Ideen, warum dies ist, oder wie meine Abfragegeschwindigkeit in diesem Fall zu erhöhen wäre sehr geschätzt.

+1

brauchen Sie wirklich alle Spalten? Bring nur ein paar und teste es nochmal. Sie können Spalten zum Index hinzufügen, das heißt Deckungsindex. – Horaciux

+0

Was ist der Datentyp von 'Datum'? – Lamak

+1

Sie verwenden den Index eindeutig nicht ausschließlich, da Sie alle Spalten einbeziehen. Das bedeutet, dass der NC-Index Ihre Abfrage nicht abdeckt. Wenn Sie also Ihren Index verwenden, kehren Sie immer noch zum Clustered-Index zurück Felder. – Eli

Antwort

0

erstellen Indizes mit eingeschlossenen Spalten: die Funktionalität von nicht gruppierten Indizes in SQL Server zu erweitern, indem Sie SQL Server Management Studio oder Transact-SQL Cover index

In diesem Thema wird beschrieben, wie enthalten (oder nonkey) Spalten hinzufügen. Durch das Einschließen von Nicht-Schlüsselspalten können Sie Nonclustered-Indizes erstellen, die mehr Abfragen abdecken. Dies liegt daran, dass die Nicht-Schlüsselspalten folgende Vorteile bieten:

  • Sie können Datentypen sein, die nicht als Indexschlüsselspalten zulässig sind.
  • Sie werden vom Datenbankmodul bei der Berechnung der Anzahl der Indexschlüsselspalten oder der Indexschlüsselgröße nicht berücksichtigt.
  • Ein Index mit Nicht-Schlüsselspalten kann die Abfrageleistung erheblich verbessern, wenn alle Spalten in der Abfrage als Schlüssel- oder Nichtschlüsselspalten im Index enthalten sind. Leistungssteigerungen werden erzielt, da der Abfrageoptimierer alle Spaltenwerte im Index finden kann. Auf Tabellen- oder Clustered-Index-Daten wird nicht zugegriffen, was zu weniger Festplatten-I/O-Operationen führt.

    +0

    Wenn ich meinen Datumsbereich auf 8 Monate erweiterte, gab Abfrage 2 die Ergebnisse schneller zurück als Abfrage 1, was für mich keinen Sinn ergibt. Ich habe dann meine Select-Anweisung auf die Datumsspalte beschränkt, und Abfrage 2 ist immer noch etwas schneller. Irgendwelche Gedanken? – Joey