Mengukur waktu yang diperlukan untuk menjalankan kueri t-sql

156

Saya memiliki dua kueri t-sql menggunakan SqlServer 2005. Bagaimana saya bisa mengukur berapa lama untuk menjalankan masing-masing?

Menggunakan stopwatch saya tidak memotongnya.

TheMoot
sumber
2
Apakah Anda menggunakan Sql Server Management Studio? Biasanya menampilkan waktu yang telah berlalu untuk setiap permintaan, meskipun hanya dengan resolusi kedua. Lihat juga pertanyaan terkait ini: stackoverflow.com/questions/8247587/…
mellamokb

Jawaban:

174

Salah satu pendekatan sederhana untuk mengukur "waktu yang berlalu" antara peristiwa adalah dengan hanya mengambil tanggal dan waktu saat ini.

Di SQL Server Management Studio

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

Untuk menghitung waktu yang berlalu, Anda bisa mengambil nilai tanggal itu ke dalam variabel, dan menggunakan fungsi 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;

Itu hanya satu pendekatan. Anda juga bisa mendapatkan waktu yang berlalu untuk permintaan menggunakan SQL Profiler.

spencer7593
sumber
Saya mencari Sql Profiler doc tentang cara melakukan ini tetapi tidak dapat menemukan doc yang tidak memerlukan berjam-jam membaca. Bisakah Anda merekomendasikan tautan "Profiler for Dummies"?
TheMoot
@TheMoot Saya tahu saya terlambat tetapi tautan MSDN sangat cocok untuk kebutuhan "[Subjek] untuk Dummies" Anda :). Coba lihat ini How To: Use SQL Profiler
John Odom
Apakah ada orang lain yang memiliki masalah dengan menggunakan ini di studio manajemen sql? Saya menambahkannya ke satu set sekitar 15 pertanyaan dalam prosedur tersimpan untuk pengujian dan butuh waktu terlalu lama untuk dijalankan. Saya membatalkan pada 7 menit dan semua timer ditambahkan hanya sekitar 2 menit. Jadi saya pikir ada beberapa masalah cache teks kembali atau mungkin terlalu lama untuk menghitung semua tanggal untuk begitu banyak.
MH
2
@Hanoncs: Ada sejumlah kecil waktu yang digunakan untuk mengevaluasi GETDATE () dan menetapkan hasilnya ke variabel, dan sejumlah kecil waktu untuk mengevaluasi DATEDIFF (), dan mengembalikan hasilnya. Pendekatan sederhana yang saya usulkan adalah untuk mendapatkan pengukuran kasar untuk pertanyaan tunggal. Saya tidak akan merekomendasikan menggunakan pendekatan ini dalam loop ketat dalam prosedur tersimpan. Jika saya memiliki serangkaian pertanyaan dalam prosedur tersimpan, saya mungkin menggunakan pendekatan ini untuk menambahkan beberapa hasil debug pada beberapa titik yang bijaksana, menambahkan kolom diskriminator sehingga saya bisa tahu baris mana dalam prosedur yang dipancarkan hasil mana.
spencer7593
1
Saya biasanya menempel SET @t1 = GETDATE();di bagian atas kueri saya dan kemudian menempel SET @t2 = GETDATE();SELECT 'NOTE 1',DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;SET @t1 = GETDATE();pada titik yang bijaksana dalam kueri (mengedit "CATATAN 1" dengan tepat). Memperlakukan pilihan sebagai breakpoint daripada pengukuran secara semantik identik dengan pendekatan Anda (meskipun set terakhir ke @ t1 palsu, dan ini mengasumsikan semua pertanyaan harus diukur). Ini murni optimasi mental / pengetikan (satu tempel per breakpoint, bukan dua pasta per kueri).
Brian
251

Jika Anda menginginkan pengukuran yang lebih akurat daripada jawaban di atas:

set statistics time on 

-- Query 1 goes here

-- Query 2 goes here

set statistics time off

Hasilnya akan di Pesan jendela .

Pembaruan (2015-07-29):

Dengan permintaan populer, saya telah menulis potongan kode yang dapat Anda gunakan untuk mengatur waktu seluruh prosedur tersimpan, daripada komponennya. Meskipun ini hanya mengembalikan waktu yang diambil oleh putaran terakhir, ada statistik tambahan yang dikembalikan oleh sys.dm_exec_procedure_statsyang mungkin juga bernilai:

-- 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)
Michael Goldshteyn
sumber
2
Hanya perhatikan bahwa fungsi ini tidak tersedia jika akses Anda ke database hanya-baca. To use SET STATISTICS TIME, users must have the appropriate permissions to execute the Transact-SQL statement. The SHOWPLAN permission is not required. dari: technet.microsoft.com/en-us/library/ms190287.aspx
Rob
5
Apakah ada cara di mana saya bisa melihat sepanjang waktu bahwa prosedur tersimpan perlu dijalankan? Saat ini saya melihat banyak pengukuran tunggal.
Rookian
2
@Rookian, saya menambahkan beberapa kode ke jawaban untuk membantu Anda dengan itu.
Michael Goldshteyn
17
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]

Anda juga dapat melihat solusi ini

atik sarker
sumber
9
Itu memberi waktu dalam nanodetik. Milidetik akan DATEIFF (MS, @ StartTime, @ EndTime)
d512
11

Cara lain adalah dengan menggunakan fitur built-in SQL Server bernama Client Statisticsyang dapat diakses melalui Menu> Query> Include Client Statistics .

Anda dapat menjalankan setiap kueri di jendela kueri yang terpisah dan membandingkan hasil yang diberikan di Client Statisticstab tepat di samping Messagestab.

Misalnya dalam gambar di bawah ini menunjukkan bahwa waktu rata-rata yang berlalu untuk mendapatkan balasan server untuk salah satu pertanyaan saya adalah 39 milidetik.

Hasil

Anda dapat membaca 3 cara untuk mendapatkan waktu eksekusi di sini . Anda bahkan mungkin perlu menampilkan Estimated Execution Plan ctrlLpenyelidikan lebih lanjut tentang permintaan Anda.

Mohammad Musavi
sumber
7

lebih baik lagi, ini akan mengukur rata-rata n iterasi kueri Anda! Sangat bagus untuk pembacaan yang lebih akurat.

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
HumbleWebDev
sumber
4
Saya mengubah MICROSECONDuntuk MILLISECONDdan untuk menghapus setiap tembolok saya dimasukkan mengikuti garis antara begindan declare @t0 ...: CHECKPOINT; DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE;. Bekerja seperti pesona dan persis apa yang saya cari. +1
Daniel Z.
1
Saya telah menggunakan potongan tahun untuk mengukur peningkatan kinerja secara bertahap ke prosedur tersimpan, sangat apik!
JayJay
Terima kasih semuanya. Saya sudah melakukan sql untuk waktu yang lama sekarang, itu bahasa yang unik. Tapi begitu Anda tahu apa ketegarannya dan bagaimana memutarnya untuk keuntungan Anda, itu akan sangat membantu XD
HumbleWebDev
3

Klik ikon Statistik untuk menampilkan dan kemudian jalankan kueri untuk mendapatkan timing dan untuk mengetahui seberapa efisien kueri Anda

Ashish Patel
sumber