मेरे पास SqlServer 2005 का उपयोग करते हुए दो टी-एसक्यूएल प्रश्न हैं। मैं कैसे माप सकता हूं कि प्रत्येक को चलाने में कितना समय लगता है?
मेरी स्टॉपवॉच का उपयोग करने से इसमें कटौती नहीं होती है।
मेरे पास SqlServer 2005 का उपयोग करते हुए दो टी-एसक्यूएल प्रश्न हैं। मैं कैसे माप सकता हूं कि प्रत्येक को चलाने में कितना समय लगता है?
मेरी स्टॉपवॉच का उपयोग करने से इसमें कटौती नहीं होती है।
जवाबों:
घटनाओं के बीच "बीता हुआ समय" को मापने के लिए एक सरलीकृत दृष्टिकोण सिर्फ वर्तमान तिथि और समय को हड़पना है।
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 का उपयोग करके प्रश्नों के लिए बीता हुआ समय भी प्राप्त कर सकते हैं।
SET @t1 = GETDATE();
पर अपनी क्वेरी के शीर्ष पर रहता हूं और फिर SET @t2 = GETDATE();SELECT 'NOTE 1',DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;SET @t1 = GETDATE();
क्वेरी के भीतर विवेकपूर्ण बिंदुओं पर पेस्ट करता हूं ("नोट 1" को उचित रूप से संपादित करते हुए)। माप के बजाय चयनकर्ताओं को ब्रेकपॉइंट के रूप में व्यवहार करना आपके दृष्टिकोण के समान शब्दार्थ है (हालांकि @ t1 के लिए अंतिम सेट स्पष्ट है, और यह माना जाता है कि सभी प्रश्नों को मापा जाना चाहिए)। यह विशुद्ध रूप से एक मानसिक / टाइपिंग ऑप्टिमाइज़ेशन है (एक पेस्ट प्रति ब्रेकपॉइंट, बल्कि प्रति क्वेरी दो पेस्ट्स)।
यदि आप उपरोक्त उत्तर की तुलना में अधिक सटीक माप चाहते हैं:
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)
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
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]
एक अन्य तरीका एक SQL सर्वर अंतर्निहित सुविधा का उपयोग कर रहा है जिसका नाम मेनू> क्वेरी> ग्राहक सांख्यिकी शामिल करें केClient Statistics
माध्यम से सुलभ है ।
आप प्रत्येक क्वेरी को अलग क्वेरी विंडो में चला सकते हैं और उन परिणामों की तुलना कर सकते हैं जो Client Statistics
टैब के पास टैब में दिए गए हैं Messages
।
उदाहरण के लिए नीचे दी गई छवि में यह दिखाया गया है कि मेरे प्रश्नों में से एक के लिए सर्वर उत्तर प्राप्त करने के लिए औसत समय 39 मिलीसेकंड है।
आप में निष्पादन समय प्राप्त करने के लिए सभी 3 तरीके पढ़ सकते हैं यहाँ । आपको Estimated Execution Plan
ctrlLअपनी क्वेरी के बारे में और जांच के लिए भी प्रदर्शन करना पड़ सकता है ।
इससे भी बेहतर, यह आपकी क्वेरी के औसत पुनरावृत्तियों को मापेगा! अधिक सटीक पढ़ने के लिए बढ़िया।
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
करने के लिए MILLISECOND
और कैश हर मैं के बीच लाइनों निम्नलिखित डाला स्पष्ट करने के लिए begin
और declare @t0 ...
: CHECKPOINT; DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE;
। आकर्षण की तरह काम करता है और वास्तव में मैं क्या देख रहा था। +1