web-dev-qa-db-fra.com

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

J'ai deux requêtes t-sql à l'aide de SqlServer 2005. Comment puis-je mesurer le temps qu'il faut pour que chacune s'exécute?

Utiliser mon chronomètre ne suffit pas.

140
TheMoot

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.

157
spencer7593

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 l’exécution complète d’une procédure stockée, plutôt que ses composants. Bien que ceci ne retourne que le temps pris par la dernière exécution, il y a des statistiques supplémentaires retourné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)
228
Michael Goldshteyn
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 aussi voir cette solution

14
atik sarker

mieux encore, 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
6
HumbleWebDev

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

3
Ashish Patel