क्या यह निर्धारित करने का कोई तरीका है कि SQL सर्वर क्वेरीज़ स्मृति में चल रही हैं या डिस्क पर जा रही हैं?


13

मैं आज एक आवेदन में संग्रहीत प्रक्रियाओं के एक सेट में आया था जिसे एक लंबी चलने वाली प्रक्रिया के भीतर बार-बार कहा जाता है। प्रत्येक प्रक्रिया के भीतर मुझे कई अलग-अलग चयन कथन मिले, कुछ लूप के भीतर; आश्चर्य नहीं कि ये दिनचर्या वर्तमान में चलाने के लिए कई मिनट लगते थे, जब अंतर्ज्ञान उन्हें कुछ सेकंड में पूरा होने की उम्मीद करता था।

यह स्पष्ट रूप से स्पष्ट है कि प्रदर्शन पर ध्यान नहीं दिया गया था जब इन प्रक्रियाओं को लिखा गया था, चीजों के कई उदाहरण हैं जो सिर्फ "एक अच्छा विचार नहीं" हैं।

डेटा आयात करते समय प्रत्येक पंक्ति को संसाधित करना प्रति पंक्ति 300ms ले रहा है, इसलिए अपेक्षाकृत छोटे आयात को संसाधित करने में कई मिनट लग रहे हैं।

हालांकि, प्रक्रियाओं में शामिल तालिकाएं अधिकांश भाग के लिए काफी छोटी हैं। मैं सोच रहा हूं, अगर ये सभी टेबल पूरी तरह से मेमोरी में निवासी हैं, तो शायद यह सब इतना नहीं है कि इसमें से किसी को भी फिर से लिखा जा सके।

मैं यह निर्धारित करने की कोशिश कर रहा हूं .... इस स्पष्ट रूप से अक्षम कोड के लिए, यह कितना वास्तविक प्रभाव है? क्या यह ठीक करने लायक है?

तो सवाल यह है:
- क्या यह निर्धारित करने का एक तरीका है कि तालिका को पूरी तरह से मेमोरी में पिन किया गया है?
- विशेष रूप से महंगे भागों को खोजने के लिए नेस्टेड संग्रहीत प्रक्रियाओं की निगरानी करने के लिए ट्रेसिंग चालू करने का एक तरीका है?

नोट: यह SQL Server 2008 R2 पर है

जवाबों:


12

कुल तार्किक रीड और कुल भौतिक रीड्स को देखने के लिए आप इन दो प्रश्नों में से एक का उपयोग कर सकते हैं।

SELECT  DB_NAME(st.dbid) Db,
        OBJECT_NAME(st.objectid, st.dbid) Prc,
        qs.execution_count,
        qs.total_logical_reads,
        qs.total_physical_reads,
        qs.statement_start_offset,
        qs.statement_end_offset,
        st.text
FROM    sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st;

SELECT  DB_NAME(database_id) Db,
        OBJECT_NAME(object_id, database_id) Prc,
        execution_count,
        total_logical_reads,
        total_physical_reads
FROM    sys.dm_exec_procedure_stats ps;

पहला एक बयान द्वारा इसे तोड़ता है, दूसरा पूरी प्रक्रिया में गिना जाता है।

भौतिक रीड्स डिस्क के खिलाफ पढ़े जाते हैं, तार्किक रीड मेमोरी के खिलाफ होते हैं। आप इसका उपयोग यह पता लगाने के लिए कर सकते हैं कि आपके सिस्टम में कौन सी प्रक्रियाएं या कथन सबसे महंगे हैं और उन को ट्यून करने का प्रयास करें।

ध्यान रखें, जबकि तार्किक रीड्स काफी सस्ते हैं कि भौतिक रीड्स, वे अभी भी महंगे हैं, इसलिए उनमें से संख्या को कम करना (उदाहरण के लिए एक उपयुक्त इंडेक्स जोड़कर) आपके प्रश्नों को बहुत तेजी से चला सकता है।

उपरोक्त DMV में बहुत सारे अतिरिक्त कॉलम हैं जो आपको दिलचस्प भी लग सकते हैं।


तार्किक रीडर्स को कम करने के लिए एक इंडेक्स कैसे मदद करता है?

SQL सर्वर में सभी डेटा को ब्लॉक, 8KB आकार में व्यवस्थित किया जाता है। इन ब्लॉकों को "पृष्ठ" कहा जाता है।

हर तालिका में "मेटा" पृष्ठ होते हैं, जिसमें तालिका के स्ट्रिंग के साथ-साथ पाटा पृष्ठों के बारे में जानकारी होती है। यदि कोई इंडेक्स मौजूद नहीं है और आप एक क्वेरी चलाते हैं जैसे SELECT * FROM tbl WHERE Id = 7SQL सर्वर को पूरी तालिका में इस या इन पंक्तियों की तलाश में जाना पड़ता है। तो यह एक समय में एक पृष्ठ में पढ़ता है, जो WHEREखंड को फिट करने वाली पंक्तियों को निर्धारित करने के लिए प्रत्येक पृष्ठ में सभी पंक्तियों के माध्यम से लूप करता है। इसलिए यदि तालिका में 1,000,000 पृष्ठों को संग्रहीत करने की आवश्यकता है, तो यह क्वेरी निष्पादित करने के लिए 1,000,000 तार्किक रीड्स लेगी।

यदि आपके पास एक इंडेक्स है, तो SQL सर्वर पन्नों के भीतर तार्किक रूप से डेटा को सॉर्ट करता है और पृष्ठों के बीच एक लिंक्ड सूची स्थापित करता है। यह ORDER BYएक महंगे सॉर्ट ऑपरेशन के बिना निष्पादित किए जाने वाले प्रश्नों को चलाने की अनुमति देता है । लेकिन महत्वपूर्ण बात यह है कि सॉर्टिंग, SQL सर्वर तालिका में B + ट्री जोड़ता है । एक बी + ट्री एक पुस्तक में सूचकांक की तुलना में एक संरचना है, जहां एक विशिष्ट कीवर्ड की तलाश मुझे उस पृष्ठ पर सीधे कूदने की अनुमति देती है जिसमें कीवर्ड होता है। विशिष्ट पुस्तक में केवल एक सूचकांक स्तर होता है जबकि एक B + ट्री में कई हो सकते हैं। बस एक बड़ी पुस्तक के बारे में सोचें, जहां सूचकांक खुद कई पृष्ठों लंबा हो। इस तरह के मामले में यह समझ में आता है कि एडिशनल इंडेक्स लेयर जो हमें wich पेज पर बताती है उसके साथ शुरू होने वाले इंडेक्स शब्द Sपाए जाते हैं।

B + पेड़ों को संपत्ति प्रदान करते समय यथासंभव कुछ स्तरों के लिए अनुकूलित किया जाता है जो सूचकांक में किसी भी रिकॉर्ड को सूचकांक स्तर के एक पृष्ठ को पढ़कर पाया जा सकता है। इसलिए WHERE Id = 7जब आप द्वारा अनुक्रमित अनुक्रमित हो तो उपरोक्त क्वेरी मान लें Id। मान लीजिए कि सूचकांक के 5 स्तर हैं। अब, इस क्वेरी से मेल खाने वाले सभी रिकॉर्ड्स को खोजने के लिए मुझे प्रति इंडेक्स स्तर पर एक पेज पढ़ना होगा (यह 5 पेज है)। इसे "इंडेक्स सीक" कहा जाता है। यदि कई रिकॉर्ड हैं जो बिल को फिट करते हैं तो मुझे उन सभी को पुनः प्राप्त करने के लिए कुछ समय के लिए सॉर्ट किए गए सूचकांक का पालन करना पड़ सकता है। लेकिन मान लेते हैं कि केवल एक ही रिकॉर्ड है।

इसलिए, उस इंडेक्स के बिना उस क्वेरी को 1,000,000 रीड की आवश्यकता होती है, इंड्स के साथ उसे 5 रीड की आवश्यकता होती है। भले ही एक तार्किक रीड एक इन-मेमोरी ऑपरेशन हो, लेकिन इसमें पर्याप्त लागत होती है - वास्तव में यह ऊपर की तरह एक तुच्छ क्वेरी में सबसे महंगा ऑपरेशन है। इसलिए 200,000 के कारक द्वारा आवश्यक तार्किक रीड की मात्रा को कम करने से आपके क्वेरी को समान कारक द्वारा गति मिलेगी।

तो, एक लॉजिकल रीड टेबल टेबल के बराबर नहीं है, लेकिन टेबल स्कैन इंडेक्स की तलाश में पूरी तरह से अधिक तार्किक रीड का कारण बनता है।


> "... उनमें से संख्या को कम करना (उदाहरण के लिए एक उपयुक्त सूचकांक जोड़कर) आपके प्रश्नों को बहुत तेज चला सकता है।" क्या आप समझा सकते हैं कि एक सूचकांक जोड़ने से तार्किक ()? क्या तार्किक रीड टेबल स्कैन का पर्याय है?

1
ऊपर मेरे जवाब के लिए एक स्पष्टीकरण जोड़ा गया।
सेबेस्टियन माइन

धन्यवाद। यहां तक ​​कि उचित अनुक्रमित में शामिल सभी तालिकाओं पर हैं ... मुझे लगता है कि अभी भी एक मेज के बीच एक विशाल प्रदर्शन अंतर है स्मृति में पिन किया जा रहा है बनाम डिस्क से पढ़ा जा रहा है (दोनों परिदृश्यों में समान अनुक्रमित) ... या अन्य में शब्द, अनुक्रमणिका को जोड़ने से आपको कम मेमोरी वाली मशीन की तुलना में बहुत सारे रैम के साथ मशीन पर% प्रदर्शन को बढ़ावा मिलेगा .... सही?

1
भौतिक डिस्क एक्सेस स्पष्ट रूप से मेमोरी एक्सेस की तुलना में अधिक महंगी परिमाण का आदेश है। तो इससे बचने के उपाय करना आपको बहुत दूर तक मिल जाएगा। क्वेरी ट्यूनिंग के दौरान आपको पहले तार्किक रीड्स की संख्या को देखना चाहिए। उन्हें कम वसीयत में रखने से शारीरिक रीडिंग कम रहेगी। इस बात की भी अधिक संभावना है कि पृष्ठों को कैश से निकालने की आवश्यकता नहीं है ताकि आवश्यक भौतिक रीड को और भी कम किया जा सके।
सेबस्टियन मेन

2
माइनर नाइटपिक - मुझे लगता है कि पेज 8kb :-) हैं। अच्छा उत्तर।
onupdatecascade

3
  • विशेष रूप से महंगे भागों को खोजने के लिए नेस्टेड संग्रहीत प्रक्रियाओं की निगरानी करने के लिए ट्रेसिंग चालू करने का एक तरीका है?

आप SQL Profiler का उपयोग कर सकते हैं। जब आप ट्रेस शुरू करते हैं, तो आपको RPC पूर्ण, SP प्रारंभ, SP StmtStarting और SP StmtCompleted को चुना जाना चाहिए (नीचे चित्र देखें)

यहाँ छवि विवरण दर्ज करें

यह आपको संग्रहीत प्रक्रियाओं के अंदर चलने वाली प्रत्येक क्वेरी को देखने देगा। यह आपको यह देखने देगा कि नेस्टेड संग्रहित प्रक्रिया को कितनी बार कहा जाता है। जब ट्रेस खत्म हो जाता है, तो आपको इसे सहेजना चाहिए। फिर, इसे फिर से खोलें, और उसके बाद, आप उन प्रश्नों को खोजने के लिए फ़िल्टर ("कॉलम फिल्टर" बटन के साथ) कर पाएंगे जो आपको समस्या पैदा करते हैं। (पूर्व: वे प्रश्न जो x से अधिक लिए गए या जो x सेकंड (अवधि) से अधिक चले ...

प्रोफाइलर विकल्प जो मैंने आपको दिखाए थे, निष्पादन योजना भी दिखाते हैं, जो बहुत मदद करता है।


1

यह एक सामान्य क्वेरी ऑप्टिमाइज़ेशन प्रश्न जैसा लगता है। आपके विवरण से मैं:

  1. यह देखने के लिए कोड देखें कि क्या यह पंक्ति-दर-पंक्ति प्रसंस्करण करता है। यदि ऐसा होता है, तो अक्सर सेट के उपयोग से एक ही तर्क को लागू करके परिमाण में सुधार के आदेश दिए जा सकते हैं (एक ही समय में संसाधित कई पंक्तियाँ)। दूसरे शब्दों में, अगर यह "प्रत्येक पंक्ति पर लूप" की तरह काम करता है, तो इसे "सभी पंक्तियों को संसाधित करने के लिए" बदल दें। एसक्यूएल excels है कि क्योंकि अनुकूलक अधिक संभव तरीकों से चुन सकते हैं, संभावित समानांतरवाद का उपयोग पर, एक को दूर बहुत कुछ भूमि के ऊपर है कि एक-पंक्ति-में-एक-समय से आता है की।
  2. सुनिश्चित करें कि अगला, कि सूचकांक हैं जो काम का समर्थन करते हैं। अक्सर, फिर से, परिमाण सुधार के आदेश सही अनुक्रमों के साथ हो सकते हैं बनाम नहीं। यह मेमोरी में और डिस्क एक्सेस के साथ सही है। यदि किसी बड़े डेटा सेट पर उपयुक्त अनुक्रमित नहीं हैं, तो रैम में सब कुछ के साथ प्रक्रिया में घंटों लग सकते हैं।
  3. अगला, सेट लॉजिक और इंडेक्स के साथ, मैं इस बात पर ध्यान दूंगा कि क्या प्रभावित डेटा पेज मेमोरी में फिट होते हैं। इस बिंदु पर, अगर अभी भी बहुत सारे डिस्क एक्सेस हैं, तो भौतिक रीड और डिस्क गतिविधि को देखना समझ में आता है, क्योंकि अनुकूलन से सभी बड़े लाभ पहले दो चरणों में किए जाते हैं।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.