Bestellung von id
verwendet wahrscheinlich einen Clustered-Index-Scan bei der Bestellung von datetime
verwendet entweder Sortierung oder Index-Lookup.
Beide Methoden sind langsamer als ein Clustered-Index-Scan.
Wenn Ihre Tabelle von id
geclustert wird, bedeutet es im Grunde, dass es bereits sortiert ist. Die Datensätze sind in einem B+Tree
enthalten, der eine verknüpfte Liste aufweist, die die Seiten in der Reihenfolge id
verknüpft. Die Engine sollte nur die verkettete Liste durchqueren, um die von id
bestellten Datensätze zu erhalten.
Wenn die id
s in sequentieller Reihenfolge eingefügt wurden, bedeutet dies, dass die physische Reihenfolge der Zeilen der logischen Reihenfolge entspricht und der Clustered-Index-Scan noch schneller ist.
Wenn Sie Ihre Aufzeichnungen von datetime
bestellt werden, gibt es zwei Möglichkeiten:
- alle Datensätze aus der Tabelle nehmen und sie sortieren. Langsamkeit ist offensichtlich.
- Verwenden Sie den Index auf
datetime
. Der Index wird in einem separaten Bereich der Festplatte gespeichert. Dies bedeutet, dass die Engine in einer verschachtelten Schleife zwischen den Indexseiten und den Tabellenseiten wechseln muss. Es ist auch langsamer.
die Bestellung zu verbessern, können Sie einen separaten abdeckenden Index auf datetime
erstellen:
CREATE INDEX ix_mytable_datetime ON mytable (datetime) INCLUDE (field1, field2, …)
und beinhalten alle Spalten, die Sie in Ihrer Abfrage in diesem Index verwenden.
Dieser Index ist wie eine Schattenkopie Ihrer Tabelle, aber mit Daten in anderer Reihenfolge sortiert.
Dies wird es ermöglichen, die Schlüssel-Lookups loszuwerden (da der Index alle Daten enthält), die die Bestellung von datetime
so schnell machen wie die auf id
.
Update:
Ein frischer Blog-Beitrag zu diesem Problem:
Welche 'RDBMS' verwenden Sie? – Quassnoi
Ich verwende SQL Server 2008 – silent
ist diese Datetime-Spalte in einem separaten Index für sich? Sie sagen "hinzugefügt .. zum Index" ....wenn die Datetime-Spalte z.B. Spaltennr. 3 in einem zusammengesetzten Index, das überhaupt nicht helfen wird, wenn man versucht, durch diese datetime Spalte allein zu bestellen ........ –