Mesurer le temps nécessaire pour exécuter une requête t-sql

156

J'ai deux requêtes t-sql utilisant SqlServer 2005. Comment puis-je mesurer combien de temps il faut à chacune pour s'exécuter?

Utiliser mon chronomètre ne le coupe pas.

TheMoot
la source
2
Utilisez-vous Sql Server Management Studio? Il affiche généralement le temps écoulé pour chaque requête, mais uniquement avec une deuxième résolution. Voir également cette question connexe: stackoverflow.com/questions/8247587/…
mellamokb

Réponses:

174

Une approche simpliste pour mesurer le «temps écoulé» entre les événements consiste simplement à saisir la date et l'heure actuelles.

Dans SQL Server Management Studio

SELECT GETDATE();
SELECT /* query one */ 1 ;
SELECT GETDATE();
SELECT /* query two */ 2 ; 
SELECT GETDATE(); 

Pour calculer les temps écoulés, vous pouvez saisir ces valeurs de date dans des variables et utiliser la fonction DATEDIFF:

DECLARE @t1 DATETIME;
DECLARE @t2 DATETIME;

SET @t1 = GETDATE();
SELECT /* query one */ 1 ;
SET @t2 = GETDATE();
SELECT DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;

SET @t1 = GETDATE();
SELECT /* query two */ 2 ;
SET @t2 = GETDATE();
SELECT DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;

C'est juste une approche. Vous pouvez également obtenir les temps écoulés pour les requêtes à l'aide de SQL Profiler.

spencer7593
la source
J'ai cherché la documentation Sql Profiler sur la façon de faire cela, mais je n'ai pas trouvé de document qui ne nécessitait pas des heures de lecture. Pouvez-vous recommander un lien "Profiler for Dummies"?
TheMoot
@TheMoot Je sais que je suis en retard mais les liens MSDN sont parfaits pour vos besoins "[Subject] for Dummies" :). Essayez de jeter un oeil à ce Comment: utiliser SQL Profiler
John Odom
Quelqu'un d'autre a-t-il eu des problèmes avec l'utilisation de cela dans SQL Management Studio? Je l'ai ajouté à un ensemble d'environ 15 requêtes dans une procédure stockée pour les tests et son exécution prend beaucoup trop de temps. J'ai annulé à 7 minutes et tous les minuteurs additionnés n'étaient que d'environ 2 minutes. Je pense donc qu'il y a un problème de cache de texte de retour ou peut-être qu'il faut trop de temps pour calculer tous les datés pour autant.
MH le
2
@Hanoncs: Il y a un peu de temps utilisé pour évaluer GETDATE () et affecter le résultat à une variable, et un peu de temps pour évaluer le DATEDIFF () et renvoyer le résultat. L'approche simpliste que j'ai proposée était d'obtenir une mesure approximative des requêtes singleton. Je ne recommanderais pas d'utiliser cette approche dans une boucle serrée dans une procédure stockée. Si j'avais une série de requêtes dans une procédure stockée, je pourrais utiliser cette approche pour ajouter une sortie de débogage à certains points judicieux, en ajoutant une colonne discriminante afin que je puisse savoir quelle ligne de la procédure a émis quel résultat.
spencer7593
1
Je colle généralement SET @t1 = GETDATE();en haut de ma requête, puis je la colle SET @t2 = GETDATE();SELECT 'NOTE 1',DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;SET @t1 = GETDATE();à des points judicieux dans la requête (en éditant "NOTE 1" de manière appropriée). Traiter les sélections comme des points d'arrêt plutôt que des mesures est sémantiquement identique à votre approche (bien que l'ensemble final sur @ t1 soit faux, et cela suppose que toutes les requêtes doivent être mesurées). Ceci est purement une optimisation mentale / typage (une pâte par point d'arrêt, plutôt que deux pâtes par requête).
Brian
251

Si vous voulez une mesure plus précise que la réponse ci-dessus:

set statistics time on 

-- Query 1 goes here

-- Query 2 goes here

set statistics time off

Les résultats seront dans la fenêtre Messages .

Mise à jour (2015-07-29):

À la demande générale, j'ai écrit un extrait de code que vous pouvez utiliser pour chronométrer une procédure stockée entière, plutôt que ses composants. Bien que cela ne renvoie que le temps pris par la dernière exécution, il y a des statistiques supplémentaires renvoyées par sys.dm_exec_procedure_statsqui peuvent également être utiles:

-- Use the last_elapsed_time from sys.dm_exec_procedure_stats
-- to time an entire stored procedure.

-- Set the following variables to the name of the stored proc
-- for which which you would like run duration info
DECLARE @DbName NVARCHAR(128);
DECLARE @SchemaName SYSNAME;
DECLARE @ProcName SYSNAME=N'TestProc';

SELECT CONVERT(TIME(3),DATEADD(ms,ROUND(last_elapsed_time/1000.0,0),0)) 
       AS LastExecutionTime
FROM sys.dm_exec_procedure_stats
WHERE OBJECT_NAME(object_id,database_id)=@ProcName AND
      (OBJECT_SCHEMA_NAME(object_id,database_id)=@SchemaName OR @SchemaName IS NULL) AND
      (DB_NAME(database_id)=@DbName OR @DbName IS NULL)
Michael Goldshteyn
la source
2
Notez simplement que cette fonction n'est pas disponible si votre accès à la base de données est en lecture seule. To use SET STATISTICS TIME, users must have the appropriate permissions to execute the Transact-SQL statement. The SHOWPLAN permission is not required. de: technet.microsoft.com/en-us/library/ms190287.aspx
Rob
5
Existe-t-il un moyen de voir tout le temps qu'une procédure stockée doit s'exécuter? En ce moment, je vois beaucoup de mesures uniques.
Rookian
2
@Rookian, j'ai ajouté du code à la réponse pour vous aider.
Michael Goldshteyn
17
DECLARE @StartTime datetime
DECLARE @EndTime datetime
SELECT @StartTime=GETDATE() 

 -- Write Your Query


SELECT @EndTime=GETDATE()

--This will return execution time of your query
SELECT DATEDIFF(MS,@StartTime,@EndTime) AS [Duration in millisecs]

Vous pouvez également voir cette solution

atik sarker
la source
9
Cela donne l'heure en nanosecondes. Milleseconds serait DATEDIFF (MS, @ StartTime, @ EndTime)
d512
11

Une autre méthode consiste à utiliser une fonctionnalité intégrée de SQL Server nommée, Client Statisticsaccessible via Menu> Requête> Inclure les statistiques du client .

Vous pouvez exécuter chaque requête dans une fenêtre de requête séparée et comparer les résultats qui sont donnés dans l' Client Statisticsonglet juste à côté de l' Messagesonglet.

Par exemple, dans l'image ci-dessous, il montre que le temps moyen écoulé pour obtenir la réponse du serveur pour l'une de mes requêtes est de 39 millisecondes.

Résultat

Vous pouvez lire les 3 façons d'acquérir le temps d'exécution ici . Vous devrez peut-être même afficher Estimated Execution Plan ctrlLpour une enquête plus approfondie sur votre requête.

Mohammad Musavi
la source
7

encore mieux, cela mesurera la moyenne de n itérations de votre requête! Idéal pour une lecture plus précise.

declare @tTOTAL int = 0
declare @i integer = 0
declare @itrs integer = 100

while @i < @itrs
begin
declare @t0 datetime = GETDATE()

--your query here

declare @t1 datetime = GETDATE()

set @tTotal = @tTotal + DATEDIFF(MICROSECOND,@t0,@t1)

set @i = @i + 1
end

select @tTotal/@itrs
HumbleWebDev
la source
4
J'ai changé MICROSECONDà MILLISECONDet pour effacer le cache à chaque fois de lignes suivantes I inséré entre beginet declare @t0 ...: CHECKPOINT; DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE;. Fonctionne comme du charme et exactement ce que je recherchais. +1
Daniel Z.
1
J'utilise l'extrait de code yr pour évaluer les modifications de performances incrémentielles d'une procédure stockée, très astucieuse!
JayJay
Merci à vous deux. Je fais sql depuis longtemps maintenant, c'est un langage bizarre. Mais une fois que vous savez quels sont les défauts et comment les faire tourner à votre avantage, eh bien cela aide beaucoup XD
HumbleWebDev
3

Cliquez sur l'icône Statistiques pour afficher, puis exécutez la requête pour obtenir les horaires et connaître l'efficacité de votre requête

Ashish Patel
la source