sql >> Database >  >> RDS >> Sqlserver

SQL Server 2008:Bestellen op datetime is te traag

Bestellen op id gebruikt waarschijnlijk een geclusterde indexscan tijdens het bestellen op datetime gebruikt sortering of index opzoeken.

Beide methoden zijn langzamer dan een geclusterde indexscan.

Als uw tabel is geclusterd op id , in feite betekent dit dat het al is gesorteerd. De records zijn opgenomen in een B+Tree die een gelinkte lijst heeft die de pagina's in id . linkt bestellen. De engine moet gewoon de gekoppelde lijst doorkruisen om de records te krijgen die zijn geordend op id .

Als de id s zijn in sequentiële volgorde ingevoegd, dit betekent dat de fysieke volgorde van de rijen overeenkomt met de logische volgorde en dat de geclusterde indexscan nog sneller zal zijn.

Als u wilt dat uw records op datetime zijn besteld , zijn er twee opties:

  • Neem alle records uit de tabel en sorteer ze. Traagheid is duidelijk.
  • Gebruik de index op datetime . De index wordt opgeslagen in een aparte ruimte op de schijf, dit betekent dat de engine in een geneste lus moet pendelen tussen de indexpagina's en tabelpagina's. Het is ook langzamer.

Om de volgorde te verbeteren, kunt u een aparte dekkingsindex maken op datetime :

CREATE INDEX ix_mytable_datetime ON mytable (datetime) INCLUDE (field1, field2, …)

, en neem alle kolommen die u in uw zoekopdracht gebruikt op in die index.

Deze index is als een schaduwkopie van uw tabel, maar met gegevens in een andere volgorde gesorteerd.

Dit zal het mogelijk maken om de key lookups te verwijderen (aangezien de index alle data bevat) waardoor bestellen op datetime mogelijk wordt. zo snel als dat op id .

Bijwerken:

Een nieuwe blogpost over dit probleem:



  1. Hoe krijg ik de MIN() van twee velden in Postgres?

  2. Laravel welsprekend krijgt de meest voorkomende waarde in een databasekolom

  3. Hoe maak je een schema in Oracle met SQL Developer?

  4. Bereken de totale tijdsduur op de laatste rij in mysql