2012-07-26 17 views
99

SqlServer 2005 kullanarak iki t-sql sorgum var. Her birinin kaç kez çalıştırılacağını nasıl ölçeriz?Bir t-sql sorgusu yürütmek için gereken süreyi ölçer

Kronometremi kullanmak onu kesmiyor.

+2

Sql Server Management Studio kullanıyor musunuz? Genelde her sorgu için geçen süreyi, sadece ikinci çözünürlükte de olsa gösterir. Ayrıca bu soruya bakınız: http://stackoverflow.com/questions/8247587/sql-server-management-studio-how-to-get-execution-time-down-to-milliseconds – mellamokb

+0

@mellamokb: ssms kullanıyorum. İkinci çözünürlük çok kaba. – TheMoot

+0

@LittleBobbyTables: ssms içinde koşuyorum. bir durağı nasıl kullanırım? – TheMoot

cevap

100

Olaylar arasındaki "geçen sürenin" ölçülmesine yönelik basit bir yaklaşım, geçerli tarih ve saati almaktır. SQL Server Management Studio

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

yılında

Eğer değişkenlere bu tarih değerlerini yakalamak olabilir, geçen süreleri hesaplamak ve DATEDIFF işlevini kullanmak için:

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; 

sadece bir yaklaşımdır. Ayrıca, SQL Profiler kullanarak sorgular için geçen süreleri alabilirsiniz.

+0

Sql Profiler belgesini bunun nasıl yapılacağını araştırdım ama okuma saatlerine ihtiyaç duymadan doktora bulamadım. "Dummies için Profiler" bağlantısını önerebilir misin? – TheMoot

+0

@TheMoot Biliyorum geç kaldım ama MSDN bağlantıları "[Konu] Dummies için" ihtiyaçlarınız için mükemmel :). Buna bir göz atmaya çalışın [Nasıl Yapılır: SQL Profiler Kullanılır] (https://msdn.microsoft.com/en-us/library/ff650699.aspx) –

+0

Başkalarının bunu sql yönetim stüdyosunda kullanma sorunları oldu mu? Test için saklı bir prosedürde yaklaşık 15 sorguya ekledim ve çalışması çok uzun sürüyor. 7 dakikada iptal ettim ve eklenen tüm zamanlayıcılar sadece 2 dakika oldu. Bu yüzden bazı geri dönüş metin önbellek sorunu olduğunu düşünüyorum ya da belki çok fazla için tüm tarihçeleri hesaplamak için çok uzun sürüyor. –

170

Yukarıdaki cevap daha doğru bir ölçüm isterseniz:

set statistics time on 

-- Query 1 goes here 

-- Query 2 goes here 

set statistics time off 

sonuç Mesajları pencere olacaktır.

Güncellemesi (2015/07/29): Yoğun istek üzerine

, sana bileşenlerinden çok kendisine zaman bütün bir saklı yordam çalıştırmak kullanabileceğiniz bir kod parçacığını yazdım.

-- 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) 
+2

Sadece veritabanına erişiminiz salt okunursa, bu işlev kullanılamaz. 'SET İSTATİSTİKLERİ ZAMANINDA, kullanıcıların Transact-SQL deyimini yürütmek için uygun izinlere sahip olması gerekir. SHOWPLAN izni gerekli değildir. ' from: http://technet.microsoft.com/en-us/library/ms190287.aspx – Rob

+4

Saklı bir yordamın yürütmesi gereken tüm zamanı görebildiğim bir yol var mı? Şu anda çok sayıda tek ölçüm görüyorum. – Rookian

+1

@Rookian, Size yardımcı olmak için cevaba bir kod ekledim. –

8
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(NS,@StartTime,@EndTime) AS [Duration in millisecs] 

daha iyi You can also See this solution

+6

Bu, nanosaniye cinsinden zaman verir. Milisaniye DATEDIFF (MS, @ StartTime, @ EndTime) – d512

6

, bu ortalamasını ölçecek: Bu sadece son dönemde aldığı zaman döndürür rağmen, yine de faydalı olabilir sys.dm_exec_procedure_stats tarafından döndürülen ek durum yer alacak Sorunuzun tekrarı! 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 
+2

"MICROSECOND" öğesini "MILLISECOND" olarak değiştirdim ve "begin" ile "declare @ t0 ..." arasında aşağıdaki satırları eklediğim her zaman önbelleği temizledim: ' CHECKPOINT; DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE; '. Cazibe ve tam olarak aradığım şey gibi çalışır. +1 –

+1

Kayıtlı bir prosedüre kademeli performans ayarlaması yapmak için yr snippet'i kullanıyorum, çok kaygan! – JayJay

+0

İkinize de teşekkürler. Uzun zamandır sql yapıyorum, ilginç bir dil. Ama ne zaman bir tuhaflık olduğunu ve onları avantajınıza göre nasıl döndürdüğünüzü bilirseniz, çok fazla XD yardımcı olur. – HumbleWebDev

İlgili konular