il semble que la requête s'exécute instantanément Il se peut que le plan de requête permette de commencer à retourner les lignes rapidement.
Par exemple, si vous faites SELECT * FROM a_large_table
, vous verrez immédiatement des lignes, mais la récupération de l'ensemble de résultats prendra un certain temps. Quel est le temps d'exécution réel rapporté par Mgmt Studio (indiqué dans la barre d'état une fois la requête terminée)?
Si vous souhaitez tester les performances de la requête sans récupérer les données sur le client, vous pouvez effectuer SELECT INTO #temp_table
. Cela nécessiterait des E/S supplémentaires, mais vous donnerait quand même une assez bonne estimation du temps d'exécution.
UPD.
Vous pouvez également exécuter quelque chose comme SELECT COUNT(*) FROM (<your query here>)
ou SELECT SUM(<some field>) FROM (<your query here>)
- avec un peu de chance, le serveur exécutera la requête et agrègera le résultat, effectuant essentiellement le même travail et un peu plus. Mais il est très facile de fausser les résultats de cette façon - l'optimiseur de requêtes est intelligent, et vous devez être très prudent pour être sûr de mesurer ce que vous voulez mesurer (car mesurer une requête avec un plan d'exécution différent n'a aucun sens)).
Je vous suggère de réfléchir à nouveau sur ce que vous voulez mesurer et pourquoi. Dans un scénario réel, vous n'êtes pas intéressé par la durée "pure" de la requête, car vous ne voulez jamais supprimer le résultat de la requête (le résultat est la raison pour laquelle vous avez besoin de cette requête, n'est-ce pas?). Vous devez donc soit renvoyer le résultat au client, soit le stocker quelque part, soit le joindre à une autre table et ainsi de suite. En général, vous souhaitez mesurer l'exécution de la requête, y compris le temps utilisé pour traiter son résultat.
Un dernier avis. Si vous espérez que vous pouvez forcer le serveur à exécuter cette requête en 1 seconde parce que vous pensez que le serveur ne fait rien pendant les 13 secondes suivantes, vous avez tort. Comme ils le disent, SELECT n'est pas cassé.
Ce qui peut aider est l'optimisation des requêtes - et pour une seule requête, un profileur ne vous aidera pas beaucoup. Analysez le plan de requête, ajustez la structure de votre table, essayez de réécrire la requête, postez une autre question sur SO en cas de problème.
Les outils de gestion signalent que la requête a pris 14 secondes, mais comme je l'ai dit, je peux faire défiler la vue des résultats instantanément. Existe-t-il un autre moyen de tester cela sans écrire sur une table temporaire? –
Cela signifie que la requête entière prend 14 secondes, mais les lignes que vous voyez sont retournées plus rapidement. Il est difficile d'expliquer cela en détail sans regarder votre plan de requête et vos données, mais ce comportement n'est pas surprenant. – VladV
Pour éviter de jouer avec 'SELECT INTO' ou d'ajouter des agrégats fictifs à la requête, il y a une option dans SSMS" Supprimer les résultats après exécution " –