Beställer efter id
använder förmodligen en klustrad indexskanning när du beställer efter datetime
använder antingen sortering eller indexsökning.
Båda dessa metoder är långsammare än en klustrad indexsökning.
Om din tabell är klustrad av id
, i princip betyder det att det redan är sorterat. Posterna finns i en B+Tree
som har en länkad lista som länkar sidorna i id
ordning. Motorn bör bara gå igenom den länkade listan för att få posterna sorterade efter id
.
Om id
s infogades i sekventiell ordning, betyder detta att den fysiska ordningen på raderna kommer att matcha den logiska ordningen och den klustrade indexsökningen kommer att vara ännu snabbare.
Om du vill att dina poster ska sorteras efter datetime
, det finns två alternativ:
- Ta alla poster från tabellen och sortera dem. Långsamheten är uppenbar.
- Använd indexet på
datetime
. Indexet lagras i ett separat utrymme på skivan, detta betyder att motorn måste växla mellan indexsidorna och tabellsidorna i en kapslad loop. Den är också långsammare.
För att förbättra beställningen kan du skapa ett separat täckande index på datetime
:
CREATE INDEX ix_mytable_datetime ON mytable (datetime) INCLUDE (field1, field2, …)
, och inkludera alla kolumner du använder i din fråga i det indexet.
Det här indexet är som en skuggkopia av din tabell men med data sorterade i annan ordning.
Detta gör det möjligt att bli av med nyckeluppslagningarna (eftersom indexet innehåller all data) som kommer att göra ordning efter datetime
lika snabbt som det på id
.
Uppdatering:
Ett nytt blogginlägg om detta problem: