2011-01-21 12 views
5

संग्रहीत प्रक्रिया के प्रदर्शन (पूर्ण करने के लिए समय) को सटीक रूप से मापने का सबसे अच्छा तरीका क्या है?संग्रहीत प्रक्रिया के प्रदर्शन को सटीक रूप से मापें

मैं एक राक्षस संग्रहीत प्रक्रिया को अनुकूलित करने का प्रयास शुरू करने जा रहा हूं, और सही ढंग से यह निर्धारित करने के लिए कि मेरे tweaks का कोई प्रभाव है या नहीं, मुझे पहले और बाद की तुलना करने की आवश्यकता है।

मेरे विचारों अब तक: बहुत ही सटीक नहीं है, लेकिन बहुत सुविधाजनक:

  • एक प्रश्न निष्पादन समय एसक्यूएल प्रबंधन स्टूडियो देख रहे हैं।
  • संग्रहीत प्रक्रिया में टाइमर जोड़ना और समाप्त समय प्रिंट करना: उस बदबू की तरह डीबग कोड जोड़ना।
  • SQL सर्वर प्रोफाइलर का उपयोग करके, केवल मेरी संग्रहीत प्रक्रिया को लक्षित करने के लिए फ़िल्टर जोड़ना। यह अब तक मेरा सबसे अच्छा विकल्प है।

कोई अन्य विकल्प?

उत्तर

6

प्रोफाइलर सबसे विश्वसनीय तरीका है। आप SET STATISTICS IO ON और SET STATISTICS TIME ON का भी उपयोग कर सकते हैं लेकिन इनमें स्केलर यूडीएफ का पूरा प्रभाव शामिल नहीं है।

आप पिछले 10 रनों के प्रदर्शन का अवलोकन पाने के लिए एसएसएमएस में "क्लाइंट आंकड़े शामिल करें" विकल्प भी चालू कर सकते हैं।

+0

हाँ, आप आईओ, सीपीयू, अवधि इत्यादि को कैप्चर करते हैं – gbn

+0

"क्लाइंट आंकड़े शामिल करें" विकल्प भी बेहद सहायक है, मैं उस और प्रोफाइलर के साथ जा रहा हूं।धन्यवाद। :) –

+0

मुझे एसएसएमएस में 'क्लाइंट आंकड़े शामिल करने' के बारे में भी पता नहीं था, बहुत उपयोगी – kolin

1

आपके टाइमर/डीबग विकल्प पर एक संभावित सुधार एक तालिका में परिणामों को स्टोर करना है। इस तरह आप अपने डीबग आउटपुट को दृष्टि से पार्स करने के बजाए SQL क्वेरी के साथ परिणामस्वरूप समय डेटा को टुकड़ा और पासा कर सकते हैं।

+0

मैं सहमत नहीं पर एक नजर डालें। डेटाबेस सर्वर के अलावा किसी अन्य सर्वर पर प्रोफाइलर चलाएं और फ़ाइल में ट्रेस के परिणाम संग्रहीत करें। इस तरह आप SQL सर्वर लोड नहीं करते हैं और ट्रेस परिणामों को प्रभावित करते हैं (माना जाता है कि आप सटीक होने का प्रयास कर रहे हैं)। – Tony

+0

यह बहुत चालाक है, और यहां तक ​​कि कुछ डीबग कोड के साथ sp को कड़वाहट करने का औचित्य भी हो सकता है। पारितोषिक के लिए धन्यवाद। :) –

8

वहाँ DMV dm_exec_query_stats में

DECLARE @procname VARCHAR(255) 
SET @procname = 'your proc name' 

SELECT * FROM sys.dm_exec_query_stats WHERE st.objectid = OBJECT_ID(@procname) 

यह आपको संचयी प्रदर्शन डेटा और कैश की गई बयान प्रति निष्पादन मायने रखता है दे देंगे विस्तृत प्रदर्शन जानकारी के बहुत सारे है।

काउंटर रीसेट करने के लिए आप DBCC FREEPROCCACHE का उपयोग कर सकते हैं (इसे उत्पादन प्रणाली में न चलाएं, क्योंकि सभी कैश किए गए क्वेरी प्लान को शुद्ध कर दिया जाएगा)।

आपने इस क्वेरी का विस्तार करके प्रत्येक कथन के लिए क्वेरी की योजना प्राप्त कर सकते हैं:

SELECT SUBSTRING(st.text, (qs.statement_start_offset/2)+1, 
     ((CASE statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2)+1) [sub_statement] 
     ,*, CONVERT(XML, tqp.query_plan) 
FROM sys.dm_exec_query_stats qs CROSS APPLY 
    sys.dm_exec_sql_text(sql_handle) st CROSS APPLY 
    sys.dm_exec_query_plan(plan_handle) qp CROSS APPLY 
    sys.dm_exec_text_query_plan(plan_handle, statement_start_offset, statement_end_offset ) tqp 
WHERE st.objectid = OBJECT_ID(@procname) 
ORDER BY statement_start_offset, execution_count 

यह आपको संकेत दिए गए हैं जिसके बारे में की सपा भागों बुरी तरह से प्रदर्शन कर रहे हैं दे देंगे, और - अगर आप निष्पादन की योजना में शामिल - क्यों ।

+0

गतिशील प्रबंधन दृश्य मेरे लिए नए हैं, लेकिन यह निश्चित रूप से ऐसा कुछ दिखता है जो मुझे देखना चाहिए। धन्यवाद! –

+0

प्रक्रिया प्रदर्शन के लिए आंकड़े पुनर्प्राप्त करने के लिए बहुत अच्छी क्वेरी - धन्यवाद। –

1

आप यह सुनिश्चित करना चाहते हैं कि आप निष्पक्ष परीक्षण कर रहे हैं यानी जैसे की तुलना करना। प्रत्येक बार जब आप अपना परीक्षण करते हैं तो आईओ सबसिस्टम से आपकी संग्रहीत प्रक्रिया निष्पादन को लागू करने के लिए एक ठंडा कैश का उपयोग करके अपने परीक्षण चलाने पर विचार करें।

प्रणाली संग्रहित प्रक्रियाओं DBCC FREEPROCCACHE और DBCC FREESYSTEMCACHE

संबंधित मुद्दे