sql >> Database >  >> RDS >> Sqlserver

Waarom zou het selecteren van de Top-clausule tot langdurige kosten kunnen leiden?

Er zijn andere stackoverflow-discussies over hetzelfde onderwerp (links onderaan). Zoals opgemerkt in de opmerkingen hierboven, kan het iets te maken hebben met indexen en de optimalisatie die in de war raakt en de verkeerde gebruikt.

Mijn eerste gedachte is dat je een select top service-id doet van (selecteer *....) en de optimizer kan moeite hebben om de query naar de inner queries te duwen en de index te gebruiken.

Overweeg het te herschrijven als

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

In uw zoekopdracht probeert de database waarschijnlijk de resultaten samen te voegen en terug te sturen en DAARNA te beperken tot de top 10 in de buitenste zoekopdracht. In de bovenstaande query hoeft de database alleen de eerste 10 resultaten te verzamelen terwijl de resultaten worden samengevoegd, wat veel tijd bespaart. En als servicerequestID is geïndexeerd, zal het deze zeker gebruiken. In uw voorbeeld zoekt de query naar de kolom servicerequestid in een resultatenset die al is geretourneerd in een virtuele, niet-geïndexeerde indeling.

Hoop dat dat logisch is. Hoewel hypothetisch verondersteld wordt dat de optimizer het formaat moet aannemen waarin we SQL plaatsen en de beste manier vinden om elke keer waarden te retourneren, is de waarheid dat de manier waarop we onze SQL samenstellen echt van invloed kan zijn op de volgorde waarin bepaalde stappen worden uitgevoerd op de DB.

SELECTEER TOP is traag, ongeacht ORDER BY

Waarom is een top(1) op een geïndexeerde kolom in SQL Server traag?



  1. Fout:Tabelruimte voor tabel xxx bestaat. VERWIJDER de tabelruimte vóór het IMPORTEREN

  2. Activeer trigger bij update van columnA of ColumnB of ColumnC

  3. Standaardwaarde van datetime-veld in SQL Server toevoegen aan een tijdstempel

  4. Inloggen bij Microsoft SQL Server Fout:18456