किसी t-sql क्वेरी को निष्पादित करने में लगने वाले समय को मापें


156

मेरे पास SqlServer 2005 का उपयोग करते हुए दो टी-एसक्यूएल प्रश्न हैं। मैं कैसे माप सकता हूं कि प्रत्येक को चलाने में कितना समय लगता है?

मेरी स्टॉपवॉच का उपयोग करने से इसमें कटौती नहीं होती है।


2
क्या आप Sql Server Management Studio का उपयोग कर रहे हैं? यह आमतौर पर प्रत्येक क्वेरी के लिए बीता हुआ समय प्रदर्शित करता है, भले ही वह केवल दूसरे रिज़ॉल्यूशन के साथ हो। इस संबंधित प्रश्न को भी देखें: stackoverflow.com/questions/8247587/…
mellamokb

जवाबों:


174

घटनाओं के बीच "बीता हुआ समय" को मापने के लिए एक सरलीकृत दृष्टिकोण सिर्फ वर्तमान तिथि और समय को हड़पना है।

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 के लिए यह कैसे करना है पर डॉक्टर की तलाश में है, लेकिन डॉक्टर को पढ़ने के घंटों की आवश्यकता नहीं है। क्या आप "डमीज़ के लिए प्रोफाइलर" लिंक सुझा सकते हैं?
TheMoot

@ मुझे पता है कि मुझे देर हो गई है लेकिन MSDN लिंक आपके "[विषय] डमीज़ की ज़रूरतों के लिए] :) के लिए एकदम सही हैं। इस पर एक नज़र डालने की कोशिश करें कि कैसे करें: SQL Profiler का उपयोग करें
जॉन Odom

Sql प्रबंधन स्टूडियो में किसी और के साथ इस मुद्दे का उपयोग किया गया है? मैंने इसे परीक्षण के लिए संग्रहीत प्रक्रिया में लगभग 15 प्रश्नों के एक सेट में जोड़ा और इसे चलाने में बहुत लंबा समय लगता है। मैं 7 मिनट पर रद्द कर दिया और सभी टाइमर जोड़ा केवल 2 मिनट के बारे में था। इसलिए मुझे लगता है कि कुछ वापसी पाठ कैश समस्या है या शायद बहुत सारे के लिए सभी datediffs की गणना करने में बहुत लंबा समय लगता है।
MH

2
@Hanoncs: GETDATE () का मूल्यांकन करने के लिए और चर को परिणाम देने के लिए और DatedIFF का मूल्यांकन करने के लिए समय की एक छोटी राशि का उपयोग करने के लिए समय की एक छोटी राशि है, और परिणाम लौटाते हैं। मैंने जो सादगीपूर्ण दृष्टिकोण प्रस्तावित किया, वह सिंगलटन प्रश्नों के लिए एक मोटा माप प्राप्त करना था। मैं एक संग्रहीत प्रक्रिया में एक तंग लूप के भीतर इस दृष्टिकोण का उपयोग करने की सिफारिश नहीं करूंगा। यदि मेरे पास संग्रहीत कार्यविधि में प्रश्नों की एक श्रृंखला है, तो मैं इस दृष्टिकोण का उपयोग कुछ विवेकपूर्ण बिंदुओं पर कुछ डिबगिंग आउटपुट जोड़ने के लिए कर सकता हूं, एक विभेदक कॉलम जोड़ सकता हूं ताकि मुझे पता चल सके कि प्रक्रिया में कौन सी रेखा उत्सर्जित हुई।
spencer7593

1
मैं आमतौर SET @t1 = GETDATE();पर अपनी क्वेरी के शीर्ष पर रहता हूं और फिर SET @t2 = GETDATE();SELECT 'NOTE 1',DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;SET @t1 = GETDATE();क्वेरी के भीतर विवेकपूर्ण बिंदुओं पर पेस्ट करता हूं ("नोट 1" को उचित रूप से संपादित करते हुए)। माप के बजाय चयनकर्ताओं को ब्रेकपॉइंट के रूप में व्यवहार करना आपके दृष्टिकोण के समान शब्दार्थ है (हालांकि @ t1 के लिए अंतिम सेट स्पष्ट है, और यह माना जाता है कि सभी प्रश्नों को मापा जाना चाहिए)। यह विशुद्ध रूप से एक मानसिक / टाइपिंग ऑप्टिमाइज़ेशन है (एक पेस्ट प्रति ब्रेकपॉइंट, बल्कि प्रति क्वेरी दो पेस्ट्स)।
ब्रायन

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
क्या कोई ऐसा तरीका है जहां मैं पूरे समय देख सकता हूं कि एक संग्रहीत प्रक्रिया को निष्पादित करने की आवश्यकता है? अभी मुझे बहुत सारे एकल माप दिखाई देते हैं।
रूकियान

2
@Rookian, मैंने आपकी मदद करने के लिए उत्तर में कुछ कोड जोड़ा है।
माइकल सुनार

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
यह नैनोसेकंड में समय देता है। मिलेसेकंड डेटेडिफ़ होगा (MS, @ StartTime, @ EndTime)
d512

11

एक अन्य तरीका एक SQL सर्वर अंतर्निहित सुविधा का उपयोग कर रहा है जिसका नाम मेनू> क्वेरी> ग्राहक सांख्यिकी शामिल करें केClient Statistics माध्यम से सुलभ है ।

आप प्रत्येक क्वेरी को अलग क्वेरी विंडो में चला सकते हैं और उन परिणामों की तुलना कर सकते हैं जो Client Statisticsटैब के पास टैब में दिए गए हैं Messages

उदाहरण के लिए नीचे दी गई छवि में यह दिखाया गया है कि मेरे प्रश्नों में से एक के लिए सर्वर उत्तर प्राप्त करने के लिए औसत समय 39 मिलीसेकंड है।

परिणाम

आप में निष्पादन समय प्राप्त करने के लिए सभी 3 तरीके पढ़ सकते हैं यहाँ । आपको Estimated Execution Plan ctrlLअपनी क्वेरी के बारे में और जांच के लिए भी प्रदर्शन करना पड़ सकता है ।


7

इससे भी बेहतर, यह आपकी क्वेरी के औसत पुनरावृत्तियों को मापेगा! अधिक सटीक पढ़ने के लिए बढ़िया।

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
डैनियल जेड।

1
मैं वृद्धिशील प्रदर्शन गेज करने के लिए उपयोग किया गया है वृद्धिशील प्रदर्शन एक संग्रहित प्रक्रिया को tweaks, बहुत चालाक!
JayJay

तुम दोनों को धन्यवाद। मैं लंबे समय से sql कर रहा हूं, इसकी विचित्र भाषा। लेकिन एक बार जब आप जान जाते हैं कि
किंक

3

प्रदर्शित करने के लिए सांख्यिकी आइकन पर क्लिक करें और फिर समय पाने के लिए क्वेरी को चलाएं और यह जानने के लिए कि आपकी क्वेरी कितनी कुशल है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.