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?