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.
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.
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)
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]
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
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.