Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pourquoi sélectionner la clause Top pourrait entraîner des coûts de longue durée

Il existe d'autres discussions sur stackoverflow sur ce même sujet (liens en bas). Comme indiqué dans les commentaires ci-dessus, cela pourrait avoir quelque chose à voir avec les index et l'optimiseur confus et utilisant le mauvais.

Ma première pensée est que vous faites un select top serviceid from (select *....) et l'optimiseur peut avoir des difficultés à pousser la requête jusqu'aux requêtes internes et à utiliser l'index.

Envisagez de le réécrire sous

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

Dans votre requête, la base de données essaie probablement de fusionner les résultats et de les renvoyer, puis de la limiter aux 10 premiers dans la requête externe. Dans la requête ci-dessus, la base de données n'aura qu'à rassembler les 10 premiers résultats car les résultats sont fusionnés, ce qui permet de gagner beaucoup de temps. Et si servicerequestID est indexé, il sera sûr de l'utiliser. Dans votre exemple, la requête recherche la colonne servicerequestid dans un ensemble de résultats qui a déjà été renvoyé dans un format virtuel non indexé.

J'espère que cela a du sens. Alors qu'hypothétiquement, l'optimiseur est censé prendre n'importe quel format dans lequel nous mettons SQL et trouver la meilleure façon de renvoyer des valeurs à chaque fois, la vérité est que la façon dont nous assemblons notre SQL peut vraiment avoir un impact sur l'ordre dans lequel certaines étapes sont effectuées sur le DB.

SELECT TOP est lent, quel que soit ORDER BY

Pourquoi faire un top(1) sur une colonne indexée dans SQL Server est-il lent ?