sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server 2008:Beställning efter datum och tid är för långsam

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:



  1. Hastighet (bulk) Infoga i MySQL med Python

  2. FileUpload kontroll i visual studio och spara bilden i MySql-databasen

  3. Fyller Many2many-fältet (odoo 8)

  4. hur man använder om inte finns när man infogar en rad mysql