วัดเวลาที่ใช้ในการเรียกใช้คิวรี t-sql


156

ฉันมีข้อความค้นหา t-sql สองรายการโดยใช้ SqlServer 2005 ฉันจะวัดระยะเวลาที่ใช้ในการรันแต่ละรายการได้นานแค่ไหน

ใช้นาฬิกาจับเวลาของฉันไม่ได้ตัด


2
คุณใช้ Studio จัดการเซิร์ฟเวอร์ของ SQL หรือไม่ โดยทั่วไปจะแสดงเวลาที่ผ่านไปสำหรับแต่ละแบบสอบถามแม้ว่าจะมีความละเอียดที่สองเท่านั้น ดูคำถามที่เกี่ยวข้องกันนี้: stackoverflow.com/questions/8247587/ …
mellamokb

คำตอบ:


174

วิธีง่าย ๆ อย่างหนึ่งในการวัด "เวลาที่ผ่านไป" ระหว่างเหตุการณ์คือเพียงแค่คว้าวันที่และเวลาปัจจุบัน

ใน Studio จัดการเซิร์ฟเวอร์ SQL

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

ในการคำนวณเวลาที่ผ่านไปคุณสามารถดึงค่าวันที่เหล่านั้นออกเป็นตัวแปรและใช้ฟังก์ชัน 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;

นั่นเป็นเพียงแนวทางเดียว นอกจากนี้คุณยังสามารถรับเวลาที่ผ่านไปสำหรับการสืบค้นโดยใช้ SQL Profiler


ฉันค้นหา Sql Profiler doc เกี่ยวกับวิธีการทำเช่นนี้ แต่หาเอกสารที่ไม่ต้องใช้เวลาอ่าน คุณช่วยแนะนำลิงค์ "Profiler for Dummies" ได้ไหม?
TheMoot

@TheMoot ฉันรู้ว่าฉันมาช้า แต่ลิงก์ MSDN นั้นสมบูรณ์แบบสำหรับ "[Subject] for Dummies" ของคุณต้องการ :) ลองดูที่นี่วิธีการ: ใช้ SQL Profiler
John Odom

มีคนอื่นมีปัญหากับการใช้สิ่งนี้ในสตูดิโอการจัดการ sql หรือไม่? ฉันเพิ่มไปยังชุดของแบบสอบถามประมาณ 15 รายการในกระบวนงานที่เก็บไว้สำหรับการทดสอบและใช้เวลานานเกินไปที่จะเรียกใช้ ฉันยกเลิกเมื่อ 7 นาทีและตัวจับเวลาทั้งหมดที่เพิ่มเข้ามานั้นใช้เวลาประมาณ 2 นาทีเท่านั้น ดังนั้นฉันคิดว่ามีปัญหาแคชข้อความที่ส่งคืนหรืออาจใช้เวลานานเกินไปในการคำนวณวันที่ทั้งหมดสำหรับจำนวนมาก
MH

2
@Hanoncs: มีเวลาเล็กน้อยในการประเมิน GETDATE () และกำหนดผลลัพธ์ให้กับตัวแปรและใช้เวลาเล็กน้อยในการประเมิน DATEDIFF () และส่งคืนผลลัพธ์ วิธีง่าย ๆ ที่ฉันเสนอคือการวัดคร่าวๆสำหรับการค้นหาแบบซิงเกิล ฉันไม่แนะนำให้ใช้วิธีนี้ภายในการวนซ้ำในโพรซีเดอร์ที่เก็บไว้ ถ้าฉันมีชุดของแบบสอบถามในกระบวนงานที่เก็บไว้ฉันอาจใช้วิธีนี้เพื่อเพิ่มผลลัพธ์การดีบักที่จุดที่มีดุลยพินิจเพิ่มคอลัมน์ discriminator เพื่อให้ฉันสามารถรู้ว่าบรรทัดใดในกระบวนงานที่ปล่อยออกมาซึ่งเป็นผลลัพธ์
spencer7593

1
ฉันมักจะติดSET @t1 = GETDATE();ที่ด้านบนของแบบสอบถามของฉันแล้ววางSET @t2 = GETDATE();SELECT 'NOTE 1',DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;SET @t1 = GETDATE();ที่จุดที่ฉลาดในแบบสอบถาม (แก้ไข "หมายเหตุ 1" อย่างเหมาะสม) การปฏิบัติต่อสิ่งที่เลือกเป็นเบรกพอยต์แทนที่จะเป็นการวัดแบบ semantically เหมือนกับวิธีการของคุณ (แม้ว่าชุดสุดท้ายเป็น @ t1 จะปลอมและนี่ถือว่าการสืบค้นทั้งหมดควรถูกวัด) นี่คือการเพิ่มประสิทธิภาพจิต / การพิมพ์อย่างแท้จริง (หนึ่งวางต่อจุดหยุดแทนที่จะวางสองครั้งต่อแบบสอบถาม)
Brian

251

หากคุณต้องการการวัดที่แม่นยำกว่าคำตอบข้างต้น:

set statistics time on 

-- Query 1 goes here

-- Query 2 goes here

set statistics time off

ผลลัพธ์จะอยู่ในหน้าต่างข้อความ

อัปเดต (2015-07-29):

ตามคำขอยอดนิยมฉันได้เขียนข้อมูลโค้ดที่คุณสามารถใช้ในการดำเนินการตามขั้นตอนที่เก็บไว้ทั้งหมดแทนที่จะเป็นส่วนประกอบ แม้ว่านี่จะส่งคืนเฉพาะเวลาที่ใช้โดยการเรียกใช้ครั้งล่าสุดเท่านั้น แต่มีสถิติเพิ่มเติมที่ส่งคืนโดยsys.dm_exec_procedure_statsที่อาจมีค่า:

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

2
โปรดทราบว่าฟังก์ชั่นนี้ไม่สามารถใช้ได้หากการเข้าถึงฐานข้อมูลของคุณเป็นแบบอ่านอย่างเดียว To use SET STATISTICS TIME, users must have the appropriate permissions to execute the Transact-SQL statement. The SHOWPLAN permission is not required. จาก: technet.microsoft.com/en-us/library/ms190287.aspx
Rob

5
มีวิธีที่ฉันสามารถดูเวลาทั้งหมดที่กระบวนการจัดเก็บต้องดำเนินการหรือไม่ ตอนนี้ฉันเห็นการวัดเดี่ยวจำนวนมาก
Rookian

2
@Rookian ฉันเพิ่มรหัสบางคำตอบเพื่อช่วยคุณ
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]

คุณสามารถดูโซลูชันนี้


9
นั่นให้เวลาเป็นนาโนวินาที มิลลิวินาทีจะเป็น DATEDIFF (MS, @ StartTime, @ EndTime)
d512

11

อีกวิธีหนึ่งคือใช้คุณลักษณะในตัวของ SQL Server ที่ตั้งชื่อClient Statisticsซึ่งสามารถเข้าถึงได้ผ่านเมนู> แบบสอบถาม> รวมสถิติไคลเอ็นต์รวมไคลเอนต์สถิติ

คุณสามารถเรียกใช้แต่ละแบบสอบถามในหน้าต่างแบบสอบถามแยกและเปรียบเทียบผลลัพธ์ที่ได้รับในClient Statisticsแท็บเพียงข้างMessagesแท็บ

ตัวอย่างเช่นในภาพด้านล่างแสดงว่าเวลาเฉลี่ยที่ผ่านไปเพื่อรับการตอบกลับจากเซิร์ฟเวอร์สำหรับหนึ่งในแบบสอบถามของฉันคือ 39 มิลลิวินาที

ผลลัพธ์

คุณสามารถอ่านทั้งหมด 3 วิธีสำหรับการซื้อเวลาดำเนินการในที่นี่ คุณอาจจำเป็นต้องแสดงEstimated Execution Plan ctrlLเพื่อการสอบสวนเพิ่มเติมเกี่ยวกับการสืบค้นของคุณ


7

ยิ่งไปกว่านั้นสิ่งนี้จะวัดค่าเฉลี่ยของการทำซ้ำ 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

4
ผมเปลี่ยนMICROSECONDไปMILLISECONDและทุกครั้งเพื่อล้างแคชฉันแทรกบรรทัดต่อไปนี้ระหว่างbeginและ:declare @t0 ... CHECKPOINT; DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE;ทำงานเหมือนมีเสน่ห์และสิ่งที่ฉันกำลังมองหา +1
Daniel Z.

1
ฉันใช้ข้อมูลโค้ดเพื่อวัดประสิทธิภาพที่เพิ่มขึ้นไปยังขั้นตอนที่จัดเก็บไว้เนียนมาก!
JayJay

ขอบคุณทั้งคู่ ฉันได้ทำ sql มานานแล้วตอนนี้มันเป็นภาษาที่เล่นโวหาร แต่เมื่อคุณรู้ว่า kinks คืออะไรและจะหมุนมันอย่างไรเพื่อประโยชน์ของคุณมันจะช่วย XD ได้มาก
HumbleWebDev

3

คลิกที่ไอคอนสถิติเพื่อแสดงและเรียกใช้แบบสอบถามเพื่อรับการกำหนดเวลาและเพื่อทราบว่าแบบสอบถามของคุณมีประสิทธิภาพเพียงใด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.