Saya memiliki dua kueri t-sql menggunakan SqlServer 2005. Bagaimana saya bisa mengukur berapa lama untuk menjalankan masing-masing?
Menggunakan stopwatch saya tidak memotongnya.
Saya memiliki dua kueri t-sql menggunakan SqlServer 2005. Bagaimana saya bisa mengukur berapa lama untuk menjalankan masing-masing?
Menggunakan stopwatch saya tidak memotongnya.
Jawaban:
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.
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).
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_stats
yang 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)
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
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]
Cara lain adalah dengan menggunakan fitur built-in SQL Server bernama Client Statistics
yang 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 Statistics
tab tepat di samping Messages
tab.
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.
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.
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
MICROSECOND
untuk MILLISECOND
dan untuk menghapus setiap tembolok saya dimasukkan mengikuti garis antara begin
dan declare @t0 ...
: CHECKPOINT; DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE;
. Bekerja seperti pesona dan persis apa yang saya cari. +1
Klik ikon Statistik untuk menampilkan dan kemudian jalankan kueri untuk mendapatkan timing dan untuk mengetahui seberapa efisien kueri Anda