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

Perché selezionare la clausola Top potrebbe comportare costi di tempo lunghi

Ci sono altre discussioni sullo stackoverflow sullo stesso argomento (link in fondo). Come notato nei commenti sopra, potrebbe avere qualcosa a che fare con gli indici e l'ottimizzatore che si confonde e usa quello sbagliato.

Il mio primo pensiero è che stai eseguendo un serviceid superiore selezionato da (seleziona *....) e l'ottimizzatore potrebbe avere difficoltà a spingere la query fino alle query interne e utilizzare l'indice.

Considera la possibilità di riscriverlo come

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

Nella tua query, il database sta probabilmente cercando di unire i risultati e restituirli e POI limitarlo ai primi 10 nella query esterna. Nella query precedente il database dovrà raccogliere solo i primi 10 risultati mentre i risultati vengono uniti, risparmiando un sacco di tempo. E se servicerequestID è indicizzato, sarà sicuro di usarlo. Nel tuo esempio, la query cerca la colonna servicerequestid in un set di risultati che è già stato restituito in un formato virtuale non indicizzato.

Spero che abbia senso. Mentre ipoteticamente l'ottimizzatore dovrebbe prendere qualsiasi formato in cui inseriamo SQL e capire il modo migliore per restituire valori ogni volta, la verità è che il modo in cui mettiamo insieme il nostro SQL può davvero influire sull'ordine in cui vengono eseguiti determinati passaggi sul DB.

SELECT TOP è lento, indipendentemente da ORDER BY

Perché l'esecuzione di un top(1) su una colonna indicizzata in SQL Server è lenta?