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.
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.
Réponses:
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.
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).
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_stats
qui 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)
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
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]
Une autre méthode consiste à utiliser une fonctionnalité intégrée de SQL Server nommée, Client Statistics
accessible 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 Statistics
onglet juste à côté de l' Messages
onglet.
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.
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.
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
MICROSECOND
à MILLISECOND
et pour effacer le cache à chaque fois de lignes suivantes I inséré entre begin
et declare @t0 ...
: CHECKPOINT; DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE;
. Fonctionne comme du charme et exactement ce que je recherchais. +1
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