sql >> Database teknologi >  >> RDS >> Sqlserver

Hvorfor vælge Top-klausul kan føre til lange tidsomkostninger

Der er andre stackoverflow-diskussioner om det samme emne (links nederst). Som nævnt i kommentarerne ovenfor kan det have noget at gøre med, at indekser og optimeringsværktøjet bliver forvirret og bruger den forkerte.

Min første tanke er, at du laver et udvalgt top serviceid fra (vælg *....), og optimeringsværktøjet kan have svært ved at skubbe forespørgslen ned til de indre forespørgsler og gøre brug af indekset.

Overvej at omskrive det som

select top 10 ServiceRequestID  
from  big_table_1
inner join big_table_2 cap2
on cap1.servicerequestid = cap2.customerreferencenumber
and big_table_1.statusid = 2

I din forespørgsel forsøger databasen sandsynligvis at flette resultaterne og returnere dem og SÅ begrænse den til top 10 i den ydre forespørgsel. I ovenstående forespørgsel skal databasen kun samle de første 10 resultater, da resultaterne bliver flettet, hvilket sparer masser af tid. Og hvis servicerequestID er indekseret, vil det være sikker på at bruge det. I dit eksempel leder forespørgslen efter servicerequestid-kolonnen i et resultatsæt, der allerede er returneret i et virtuelt, uindekseret format.

Håber det giver mening. Selvom det hypotetisk set er meningen, at optimeringsværktøjet skal tage det format, vi sætter SQL i, og finde ud af den bedste måde at returnere værdier på hver gang, er sandheden, at den måde, vi sammensætter vores SQL på, virkelig kan påvirke den rækkefølge, som visse trin udføres i. DB.

SELECT TOP er langsom, uanset BESTIL BY

Hvorfor er det langsomt at lave en top(1) på en indekseret kolonne i SQL Server?



  1. Lokal midlertidig tabel i Oracle 10 (for omfanget af Stored Procedure)

  2. Fordele og ulemper ved at bruge lagrede procedurer

  3. at tilføje RMySQL-pakke til R mislykkes (på Windows)?

  4. Kan ikke installere mysql-python (nyere versioner) i Windows