Je sélectionne certaines lignes d'une fonction de valeur table mais j'ai trouvé une différence de performances massive inexplicable en plaçant SELECT TOP dans la requête.Différence de performances massives SQL avec SELECT TOP x même lorsque x est beaucoup plus élevé que les lignes sélectionnées
SELECT col1, col2, col3 etc
FROM dbo.some_table_function
WHERE col1 = @parameter
--ORDER BY col1
prend plus de 5 ou 6 minutes pour terminer.
Cependant
SELECT TOP 6000 col1, col2, col3 etc
FROM dbo.some_table_function
WHERE col1 = @parameter
--ORDER BY col1
en 4 termine ou 5 secondes.
Cela ne me surprendrait pas si l'ensemble de données renvoyé était énorme, mais la requête particulière impliquée renvoie ~ 5000 lignes sur 200 000. Donc, dans les deux cas, la totalité de la table est traitée, car SQL Server continue jusqu'à la fin en recherchant 6000 lignes auxquelles il n'arrivera jamais. Pourquoi la différence massive alors? Cela a-t-il quelque chose à voir avec la façon dont SQL Server alloue de l'espace en prévision de la taille de l'ensemble de résultats (le TOP 6000 lui donne donc une exigence faible qui est plus facilement allouée en mémoire)? Est-ce que quelqu'un d'autre a été témoin de quelque chose comme ça?
Merci
Avez-vous regardé les plans de requête? Y a-t-il une différence? –
Juste curieux, ce qui arrive à la performance si vous dites SELECT TOP 100 PERCENT ....? –
Je suppose que vous avez des statistiques qui élimine l'optimiseur de requêtes de kelter. L'optimiseur peut, par exemple, décider d'utiliser une analyse de table au lieu d'une recherche d'index s'il pense qu'il y a très peu de lignes dans une table. Pourquoi cela ne concerne pas la requête TOP Je ne sais pas, mais examinons les plans d'exécution. Ceux-ci vous montrent ce que fait le serveur, et cela explique pourquoi on est lent. Il va également vous montrer le nombre estimé et réel de lignes. Si certaines estimations sont très éloignées, mettez à jour les statistiques et réessayez. :) –