web-gelistirme-sc.com

Bir t-sql sorgusu yürütmek için gereken süreyi ölçün

SqlServer 2005 kullanarak iki t-sql sorgusu var. Her birinin çalışması için ne kadar süreceğini nasıl ölçebilirim?

Kronometremi kullanmak onu kesmiyor.

140
TheMoot

Olaylar arasındaki "geçen zamanı" ölçmek için basit bir yaklaşım, sadece şu anki tarih ve zamanı kapmaktır.

SQL Server Management Studio'da

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

Geçen süreleri hesaplamak için, bu tarih değerlerini değişkenlere alabilir ve DATEDIFF işlevini kullanabilirsiniz:

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;

Bu sadece bir yaklaşım. SQL Profiler kullanarak sorgular için geçen süreleri de alabilirsiniz.

157
spencer7593

Yukarıdaki cevaptan daha doğru bir ölçüm istiyorsanız:

set statistics time on 

-- Query 1 goes here

-- Query 2 goes here

set statistics time off

Sonuçlar Mesajlar penceresinde olacaktır.

Güncelleme (2015-07-29):

Popüler istek üzerine, bileşenleri yerine tüm saklı yordamları çalıştırmak için kullanabileceğiniz bir kod pasajı yazdım. Bu sadece son çalıştırma tarafından harcanan zamanı geri döndürse de, sys.dm_exec_procedure_stats tarafından döndürülen ek değerler de olabilir:

-- 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)[email protected] AND
      (OBJECT_SCHEMA_NAME(object_id,database_id)[email protected] OR @SchemaName IS NULL) AND
      (DB_NAME(database_id)[email protected] OR @DbName IS NULL)
228
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]

Bu çözümü de görebilirsiniz

14
atik sarker

daha da iyisi, bu, sorgunuzun n tekrarlarının ortalamasını ölçer! Daha doğru bir okuma için harika.

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

Zamanlamaları almak ve sorgunuzun ne kadar verimli olduğunu bilmek için sorguyu görüntülemek ve çalıştırmak için İstatistikler simgesine tıklayın.

3
Ashish Patel