Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server 2008:Porządkowanie według daty i godziny jest zbyt wolne

Zamawianie według id prawdopodobnie używa klastrowego skanowania indeksu podczas zamawiania według datetime używa sortowania lub wyszukiwania indeksu.

Obie te metody są wolniejsze niż skanowanie indeksu klastrowego.

Jeśli Twoja tabela jest pogrupowana według id , w zasadzie oznacza to, że jest już posortowany. Rekordy są zawarte w B+Tree który ma połączoną listę łączącą strony w id zamówienie. Silnik powinien po prostu przeszukiwać połączoną listę, aby uzyskać rekordy uporządkowane według id .

Jeśli id s zostały wstawione w kolejności sekwencyjnej, co oznacza, że ​​fizyczna kolejność wierszy będzie zgodna z kolejnością logiczną, a skanowanie indeksu klastrowego będzie jeszcze szybsze.

Jeśli chcesz, aby Twoje rekordy były zamawiane przed datetime , są dwie opcje:

  • Weź wszystkie rekordy z tabeli i posortuj je. Powolność jest oczywista.
  • Użyj indeksu w datetime . Indeks jest przechowywany w oddzielnej przestrzeni na dysku, co oznacza, że ​​silnik musi przechodzić między stronami indeksu a stronami tabeli w zagnieżdżonej pętli. Jest też wolniejszy.

Aby poprawić kolejność, możesz utworzyć osobny indeks obejmujący datetime :

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

i uwzględnij w tym indeksie wszystkie kolumny użyte w zapytaniu.

Ten indeks jest jak kopia w tle Twojej tabeli, ale z danymi posortowanymi w innej kolejności.

Umożliwi to pozbycie się wyszukiwań kluczy (ponieważ indeks zawiera wszystkie dane), które sprawią, że uporządkowanie według datetime tak szybko jak na id .

Aktualizacja:

Nowy wpis na blogu dotyczący tego problemu:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak załadować duży plik płaski do tabeli bazy danych za pomocą usług SSIS?

  2. Jak mogę programowo utworzyć DSN?

  3. Czy Count(*) może kiedykolwiek zwrócić wartość null?

  4. Tożsamość SQL (autonumber) jest zwiększana nawet po wycofaniu transakcji

  5. SQL Server:Zrozumienie funkcji DATEDIFF