Wenn Sie in MS SQL Server einen Index für eine Spalte oder eine Anzahl von Spalten erstellen (ich verwende Version 2005), können Sie festlegen, dass der Index für jede Spalte entweder aufsteigend oder absteigend ist. Es fällt mir schwer zu verstehen, warum diese Wahl überhaupt hier ist. Wäre eine Suche mit binären Sortiertechniken in beiden Fällen nicht genauso schnell? Welchen Unterschied macht es, welche Bestellung ich wähle?
sql
sql-server
optimization
indexing
Joshua Carmody
quelle
quelle
Antworten:
Dies ist vor allem bei der Verwendung mit zusammengesetzten Indizes von Bedeutung:
kann verwendet werden für:
oder:
, aber nicht für:
Ein Index für eine einzelne Spalte kann auf beide Arten effizient zum Sortieren verwendet werden.
Weitere Informationen finden Sie im Artikel in meinem Blog:
Aktualisieren:
Tatsächlich kann dies sogar für einen einzelnen Spaltenindex von Bedeutung sein, obwohl dies nicht so offensichtlich ist.
Stellen Sie sich einen Index für eine Spalte einer gruppierten Tabelle vor:
Der Index für enthält
col1
geordnete Werte voncol1
zusammen mit den Verweisen auf Zeilen.Da die Tabelle geclustert ist, sind die Verweise auf Zeilen tatsächlich die Werte von
pk
. Sie sind auch innerhalb jedes Wertes von bestelltcol1
.Dies bedeutet, dass die Blätter des Index tatsächlich sortiert sind
(col1, pk)
, und diese Abfrage:braucht keine Sortierung.
Wenn wir den Index wie folgt erstellen:
Dann werden die Werte von
col1
absteigend sortiert, aber die Wertepk
innerhalb jedes Werts voncol1
werden aufsteigend sortiert.Dies bedeutet, dass die folgende Abfrage:
kann von serviert werden,
ix_mytable_col1_desc
aber nicht vonix_mytable_col1
.Mit anderen Worten, die Spalten, die eine
CLUSTERED INDEX
in einer Tabelle bilden, sind immer die nachfolgenden Spalten eines anderen Index in dieser Tabelle.quelle
Für einen echten einspaltigen Index macht es aus Sicht des Abfrageoptimierers wenig Unterschied.
Für die Tabellendefinition
Die Abfrage
Verwendet einen geordneten Scan mit Scanrichtung,
BACKWARD
wie im Ausführungsplan ersichtlich. Es gibt jedoch einen kleinen Unterschied darin, dass derzeit nurFORWARD
Scans parallelisiert werden können.Jedoch kann es einen großen Unterschied in Bezug auf die logische Fragmentierung machen . Wenn der Index mit absteigenden Schlüsseln erstellt wird, aber neue Zeilen mit aufsteigenden Schlüsselwerten angehängt werden, kann jede Seite in logischer Reihenfolge angezeigt werden. Dies kann die Größe der E / A-Lesevorgänge beim Scannen der Tabelle erheblich beeinträchtigen und befindet sich nicht im Cache.
Siehe die Fragmentierungsergebnisse
für das Skript unten
Auf der Registerkarte "Räumliche Ergebnisse" können Sie die Annahme überprüfen, dass die späteren Seiten in beiden Fällen aufsteigende Schlüsselwerte aufweisen.
quelle
Die Sortierreihenfolge ist wichtig, wenn Sie viele sortierte Daten abrufen möchten, nicht einzelne Datensätze.
Beachten Sie, dass (wie Sie mit Ihrer Frage vorschlagen) die Sortierreihenfolge in der Regel weitaus weniger wichtig ist als die von Ihnen indizierten Spalten (das System kann den Index in umgekehrter Reihenfolge lesen, wenn die Reihenfolge der gewünschten entspricht). Ich denke selten über die Reihenfolge der Indexsortierung nach, während ich mich über die vom Index abgedeckten Spalten quäle.
@Quassnoi stellt ein gutes Beispiel , wann es ist egal.
quelle