Mam dwa zapytania t-sql przy użyciu SqlServer 2005. Jak mogę zmierzyć, ile czasu zajmuje wykonanie każdego z nich?
Korzystanie ze stopera nie wystarcza.
Mam dwa zapytania t-sql przy użyciu SqlServer 2005. Jak mogę zmierzyć, ile czasu zajmuje wykonanie każdego z nich?
Korzystanie ze stopera nie wystarcza.
Odpowiedzi:
Jednym z uproszczonych sposobów mierzenia „czasu, który upłynął” między zdarzeniami jest po prostu pobranie aktualnej daty i godziny.
W SQL Server Management Studio
SELECT GETDATE();
SELECT /* query one */ 1 ;
SELECT GETDATE();
SELECT /* query two */ 2 ;
SELECT GETDATE();
Aby obliczyć upływ czasu, możesz pobrać te wartości dat do zmiennych i użyć funkcji 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;
To tylko jedno podejście. Czas, jaki upłynął, można również uzyskać dla zapytań za pomocą programu SQL Profiler.
SET @t1 = GETDATE();
u góry zapytania, a następnie SET @t2 = GETDATE();SELECT 'NOTE 1',DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;SET @t1 = GETDATE();
wklejam w rozsądnych punktach zapytania (odpowiednio edytując „UWAGA 1”). Traktowanie selekcji jako punktów przerwania, a nie pomiarów, jest semantycznie identyczne z twoim podejściem (chociaż ostateczny zestaw @ t1 jest fałszywy, a to zakłada, że wszystkie zapytania powinny być mierzone). Jest to czysto mentalna optymalizacja / typowanie (jedna wklej na punkt przerwania, a nie dwie wklejki na zapytanie).
Jeśli chcesz dokładniejszego pomiaru niż powyższa odpowiedź:
set statistics time on
-- Query 1 goes here
-- Query 2 goes here
set statistics time off
Wyniki będą w oknie Wiadomości .
Aktualizacja (2015-07-29):
Na popularne żądanie napisałem fragment kodu, którego można użyć do mierzenia czasu uruchomienia całej procedury składowanej, a nie jej składników. Chociaż zwraca to tylko czas potrzebny do ostatniego uruchomienia, istnieją dodatkowe statystyki zwrócone przez, sys.dm_exec_procedure_stats
które również mogą mieć wartość:
-- 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.
from: 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]
Innym sposobem jest użycie wbudowanej funkcji SQL Server o nazwie, Client Statistics
która jest dostępna poprzez Menu> Zapytanie> Uwzględnij statystyki klienta .
Możesz uruchomić każde zapytanie w oddzielnym oknie zapytania i porównać wyniki, które są podane w Client Statistics
zakładce tuż obok Messages
zakładki.
Na przykład na poniższym obrazku pokazuje, że średni czas, jaki upłynął, aby uzyskać odpowiedź serwera na jedno z moich zapytań, wynosi 39 milisekund.
Możesz przeczytać wszystkie 3 sposoby uzyskiwania czasu wykonania tutaj . Może być nawet konieczne wyświetlenie w Estimated Execution Plan
ctrlLcelu dalszego zbadania zapytania.
jeszcze lepiej, będzie to mierzyć średnią z n iteracji zapytania! Doskonały do dokładniejszego czytania.
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
się MILLISECOND
i wyczyścić cache każdym razem po włożeniu między liniami begin
i declare @t0 ...
: CHECKPOINT; DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE;
. Działa jak urok i dokładnie to, czego szukałem. +1
Kliknij ikonę Statystyki, aby wyświetlić, a następnie uruchomić zapytanie, aby uzyskać czasy i dowiedzieć się, jak wydajne jest Twoje zapytanie