Tôi có hai truy vấn t-sql bằng SqlServer 2005. Làm cách nào để đo thời gian cho mỗi lần chạy?
Sử dụng đồng hồ bấm giờ của tôi không cắt nó.
Tôi có hai truy vấn t-sql bằng SqlServer 2005. Làm cách nào để đo thời gian cho mỗi lần chạy?
Sử dụng đồng hồ bấm giờ của tôi không cắt nó.
Câu trả lời:
Một cách tiếp cận đơn giản để đo "thời gian trôi qua" giữa các sự kiện là chỉ lấy ngày và giờ hiện tại.
Trong SQL Server Management Studio
SELECT GETDATE();
SELECT /* query one */ 1 ;
SELECT GETDATE();
SELECT /* query two */ 2 ;
SELECT GETDATE();
Để tính thời gian đã trôi qua, bạn có thể lấy các giá trị ngày đó thành các biến và sử dụng hàm 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;
Đó chỉ là một cách tiếp cận. Bạn cũng có thể nhận được thời gian trôi qua cho các truy vấn bằng SQL Profiler.
SET @t1 = GETDATE();
ở đầu truy vấn của mình và sau đó dán SET @t2 = GETDATE();SELECT 'NOTE 1',DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;SET @t1 = GETDATE();
vào các điểm hợp lý trong truy vấn (chỉnh sửa "LƯU Ý 1" một cách thích hợp). Coi các lựa chọn là các điểm dừng thay vì các phép đo giống hệt nhau về mặt ngữ nghĩa với cách tiếp cận của bạn (mặc dù tập cuối cùng là @ t1 là giả mạo và điều này giả định rằng tất cả các truy vấn nên được đo). Đây hoàn toàn là một tối ưu hóa tinh thần / đánh máy (một lần dán cho mỗi điểm dừng, thay vì hai lần dán cho mỗi truy vấn).
Nếu bạn muốn một phép đo chính xác hơn câu trả lời ở trên:
set statistics time on
-- Query 1 goes here
-- Query 2 goes here
set statistics time off
Kết quả sẽ có trong cửa sổ Tin nhắn .
Cập nhật (2015-07-29):
Theo yêu cầu phổ biến, tôi đã viết một đoạn mã mà bạn có thể sử dụng để tính toàn bộ thời gian chạy toàn bộ thủ tục được lưu trữ, thay vì các thành phần của nó. Mặc dù điều này chỉ trả về thời gian của lần chạy cuối cùng, nhưng có những số liệu thống kê bổ sung được trả về sys.dm_exec_procedure_stats
cũng có thể có giá trị:
-- 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.
từ: technet.microsoft.com/en-us/l 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]
Một cách khác là sử dụng tính năng tích hợp SQL Server có tên Client Statistics
có thể truy cập thông qua Menu> Truy vấn> Bao gồm Thống kê Máy khách .
Bạn có thể chạy từng truy vấn trong cửa sổ truy vấn riêng biệt và so sánh các kết quả được đưa ra trong Client Statistics
tab ngay bên cạnh Messages
tab.
Ví dụ trong hình ảnh bên dưới cho thấy thời gian trung bình trôi qua để nhận được phản hồi của máy chủ cho một trong các truy vấn của tôi là 39 mili giây.
Bạn có thể đọc cả 3 cách để có được thời gian thực hiện tại đây . Bạn thậm chí có thể cần phải hiển thị Estimated Execution Plan
ctrlLđể điều tra thêm về truy vấn của bạn.
thậm chí tốt hơn, điều này sẽ đo trung bình n lần lặp của truy vấn của bạn! Tuyệt vời cho một đọc chính xác hơn.
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
thành MILLISECOND
và để xóa bộ đệm mỗi lần tôi chèn các dòng sau giữa begin
và declare @t0 ...
: CHECKPOINT; DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE;
. Hoạt động như sự quyến rũ và chính xác những gì tôi đang tìm kiếm. +1
Nhấp vào biểu tượng Thống kê để hiển thị và sau đó chạy truy vấn để nhận thời gian và để biết hiệu quả của truy vấn của bạn