2008-09-14 15 views
10

मुझे पता है कि यह एक व्यापक सवाल है, लेकिन मुझे कई गरीब कलाकारों को विरासत मिली है और उन्हें बुरी तरह अनुकूलित करने की आवश्यकता है। मैं सोच रहा था कि अनुकूलित करने के लिए सबसे आम कदम क्या हैं। तो, आप में से कुछ लोग एक ही स्थिति का सामना करते समय क्या कदम उठाते हैं?खराब प्रदर्शन करने वाली क्वेरी को अनुकूलित करने के लिए किन कदमों की आवश्यकता होनी चाहिए?

संबंधित प्रश्न:
What generic techniques can be applied to optimize SQL queries?

+0

बहुत [इस बड़े सवाल] (http://stackoverflow.com/questions/39331/what-generic-techniques-can-be-applied-to-optimize-sql-queries#39344 के समान दिखता है)। – Unsliced

उत्तर

14
  1. देखो क्या कदम लागत सबसे
  2. कदम का अनुकूलन! [करने के लिए Vinko THX]
+0

4 को 'चरण 1 पर जाएं' –

+1

पढ़ना चाहिए यह एक लूप और लूपिंग एसक्यूएल में खराब है। :) मैं बच्चा .. मैं बच्चा .. इस जवाब को प्यार करता हूँ। –

+0

यदि आपको अधिक जानकारी चाहिए, तो आप ट्रेस आउटपुट की जांच भी कर सकते हैं (ओरेकल में 'सेट ऑटोट्रेसी ऑन' का उपयोग करें। यह आपको शारीरिक रीड इत्यादि जैसी चीजों को देखने देगा। हालांकि, मैं रोमन की सलाह का पालन करने के बाद ही इसका उपयोग करूंगा। –

3

इंडेक्स एक अच्छी जगह शुरू करने के लिए ...

कम फांसी फल एसक्यूएल सर्वर सूचकांक ट्यूनिंग के साथ नीचे गिरा दिया जा सकता है हो सकता है जादूगर। क्वेरी विश्लेषक

  • देखें में कार्य योजना लागू करके पर

  • +0

    मैं मानता हूं कि यह शुरू करने के लिए एक अच्छी जगह हो सकती है, लेकिन थोड़ी देर बाद मुझे पता चला कि यह अपने आप से थोड़ा विवादित हो गया है। यह पिछले ट्यूनिंग प्रयास के लिए बनाए गए इंडेक्स को हटाना चाहता है। –

    2

    तालिकाओं क्वेरी बनाने के सूचक पर देखो कदम

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

    विफल होने के कारण (क्योंकि लॉकिंग संकेतों का उपयोग करने के लिए नकारात्मक हैं) संकेतों को लॉक करना और शामिल होने के लिए सूचकांक का स्पष्ट रूप से नामकरण करना देखें। यदि आपको बहुत से डेडलॉक लेनदेन मिल रहे हैं तो नोलोक्स का उपयोग करना अधिक स्पष्ट है।

    क्या रोमन और एंडी एस ने पहले उल्लेख किया है।

  • 7

    SQL सर्वर में आप क्वेरी विश्लेषक या प्रबंधन स्टूडियो में क्वेरी योजना देख सकते हैं। यह आपको बयानों के प्रत्येक बैच में बिताए गए समय का मोटा प्रतिशत बताएगा। आप निम्न को देखना चाहेंगे:

    • तालिका स्कैन; इसका मतलब है कि आप पूरी तरह से अनुपलब्ध हैं
    • इंडेक्स स्कैन; आपकी क्वेरी सही इंडेक्स का उपयोग नहीं कर रही है
    • एक प्रश्न में प्रत्येक चरण के बीच तीरों की मोटाई आपको बताती है कि उस चरण से कितनी पंक्तियां उत्पन्न की जा रही हैं, बहुत मोटी तीर का मतलब है कि आप बहुत सारी पंक्तियों को संसाधित कर रहे हैं, और संकेत दे सकते हैं कि कुछ जुड़ने के लिए अनुकूलित करने की जरूरत है।

    कुछ अन्य सामान्य टिप्स:

    • ऐसे कई अगर-किसी और बयान, एसक्यूएल सर्वर लगातार क्वेरी योजना के पुनर्निर्माण के लिए पैदा कर सकता है के रूप में सशर्त बयान, की एक बड़ी राशि। आप प्रोफाइलर का उपयोग कर इसके लिए जांच सकते हैं।
    • सुनिश्चित करें कि अलग-अलग प्रश्न एक-दूसरे को अवरुद्ध नहीं कर रहे हैं, जैसे एक चयन कथन को अवरुद्ध करने वाला अद्यतन कथन। SQL सर्वर चयन कथन में (nolock) संकेत निर्दिष्ट करके इसे टाला जा सकता है।
    • जैसा कि अन्य ने उल्लेख किया है, प्रबंधन स्टूडियो में प्रदर्शन ट्यूनिंग विज़ार्ड आज़माएं।

    अंत में, मैं अत्यधिक लोड परीक्षण है, जो आप उन अनुरोधों की एक बड़ी राशि के साथ काम कर उपयोग कर सकते हैं अपने आवेदन के व्यवहार अनुकरण करने के लिए (विजुअल स्टूडियो 2008 टेस्ट संस्करण का उपयोग) का एक सेट बना सिफारिश करेंगे। कुछ एसक्यूएल प्रदर्शन बाधाएं केवल इन परिस्थितियों में खुद को प्रकट करती हैं, और उन्हें पुन: उत्पन्न करने में सक्षम होने से इसे ठीक करना बहुत आसान हो जाता है।

    1

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

    एक बार जब आप पता लगाएंगे, तो यह कैसे और क्यों निपटने का समय है। उन प्रश्नों के प्रकार पर नज़र डालें जिन्हें आप पूर्ववत करने की कोशिश कर रहे हैं। धीमी गति से लूप से बचें क्योंकि वे धीमे हैं। कर्सर से हर कीमत पर बचें क्योंकि वे धीमे हैं। कभी भी संभव होने पर आधारित प्रश्नों को सेट करने के लिए चिपकाएं।

    यदि आप जुड़ने का उपयोग कर रहे हैं तो उपयोग के लिए एसक्यूएल संकेत देने के तरीके हैं। हालांकि सावधान रहें, जबकि एक संकेत आपकी क्वेरी को एक बार तेज कर सकता है, यह डेटा और पैरामीटर के आधार पर अगली बार आपकी क्वेरी 10 गुना धीमा कर सकता है।

    अंत में, सुनिश्चित करें कि आपका डेटाबेस अच्छी तरह अनुक्रमित है। शुरू करने के लिए एक अच्छी जगह किसी भी क्षेत्र में है जहां एक खंड में शायद उस पर एक सूचकांक होना चाहिए।

    2

    मुझे अन्य डेटाबेस के बारे में निश्चित नहीं है, लेकिन SQL सर्वर के लिए मैं निष्पादन योजना की अनुशंसा करता हूं। यह बहुत स्पष्ट रूप से (हालांकि बहुत सी लंबवत और क्षैतिज स्क्रॉलिंग के बावजूद, जब तक कि आपके पास 400 "मॉनिटर नहीं है!) दिखाता है कि आपकी क्वेरी का कौन सा कदम समय को चूस रहा है।

    यदि आपके पास एक कदम है जो पागल 80%, फिर शायद एक इंडेक्स जोड़ा जा सकता है, फिर इंडेक्स को ट्वीक करने के बाद, अपना अगला सबसे बड़ा कदम खोजने के लिए निष्पादन योजना को फिर से चलाएं।

    कुछ बदलावों के बाद आप पाएंगे कि वास्तव में कोई भी कदम नहीं है दूसरों से बाहर यानी वे सभी 1-2% हैं। यदि ऐसा है, तो आपको यह देखने की आवश्यकता हो सकती है कि क्या आप अपनी क्वेरी में शामिल डेटा की मात्रा को कम कर सकते हैं, तो उन चार मिलियन बंद बिक्री आदेशों को "सक्रिय बिक्री आदेश" क्वेरी में शामिल करने की आवश्यकता है? नहीं, तो STATUS = 'C' के साथ उन सभी को बाहर निकालें ... या ऐसा कुछ ।

    निष्पादन योजना से आप जो भी सुधार देखेंगे वह बुकमार्क लुकअप है, मूल रूप से इसे इंडेक्स में एक मैच मिल जाता है, लेकिन फिर SQL सर्वर को आपके इच्छित रिकॉर्ड को ढूंढने के लिए तालिका के माध्यम से जल्दी से ट्रैवल करना पड़ता है। इस ऑपरेशन में पहली बार टेबल को स्कैन करने से अधिक समय लग सकता है, यदि ऐसा है, तो क्या आपको वास्तव में उस इंडेक्स की आवश्यकता है?

    इंडेक्स के साथ, और विशेष रूप से SQL सर्वर 2005 के साथ आपको INCLUDE क्लॉज को देखना चाहिए, यह मूल रूप से आपको इंडेक्स में बिना किसी इंडेक्स में कॉलम रखने की अनुमति देता है, इसलिए यदि आपकी क्वेरी के लिए आवश्यक सभी डेटा है आपके इंडेक्स में या एक कॉलम शामिल है तो SQL सर्वर को टेबल पर भी एक बड़ा प्रदर्शन पिकअप देखने की ज़रूरत नहीं है।

    2

    कुछ प्रश्न हैं जो आप अपने क्वेरी प्रदर्शन को अनुकूलित करने के लिए देख सकते हैं।

    1. सुनिश्चित करें कि आपके पास न्यूनतम डेटा है। सुनिश्चित करें कि आप केवल उन्हीं कॉलम का चयन करें जिन्हें आप चाहते हैं। कम से कम क्षेत्र के आकार को कम करें।

    2. विचार को डी-सामान्य अपने डेटाबेस को कम करने में शामिल

    3. छोरों से बचें (अर्थात कर्सर लाने), संचालन सेट करने के लिए चिपके रहते हैं।

    4. क्वेरी को संग्रहीत प्रक्रिया के रूप में कार्यान्वित करें क्योंकि यह पूर्व-संकलित है और तेज़ी से निष्पादित होगा।

    5. सुनिश्चित करें कि आपके पास सही इंडेक्स सेट हैं। यदि आपका डेटाबेस ज्यादातर खोज के लिए उपयोग किया जाता है तो अधिक अनुक्रमणिका पर विचार करें।

    6. यह देखने के लिए निष्पादन योजना का उपयोग करें कि प्रसंस्करण कैसे किया जाता है। आप जो बचाना चाहते हैं वह टेबल स्कैन है क्योंकि यह महंगा है।

    7. सुनिश्चित करें कि ऑटो सांख्यिकी चालू है। एसक्यूएल को इष्टतम निष्पादन का निर्णय लेने में मदद करने के लिए इसकी आवश्यकता है। अधिक जानकारी के लिए माइक गुंडलॉय की महान पोस्ट देखें। Basics of Statistics in SQL Server 2005

    8. सुनिश्चित करें कि आपके अनुक्रमित खंडित Reducing SQL Server Index Fragmentation

    9. सुनिश्चित करें कि आपके टेबल खंडित नहीं कर रहे हैं नहीं हैं। How to Detect Table Fragmentation in SQL Server 2000 and 2005

    +0

    हर तरह से, एक ही क्वेरी को ट्यून करने के लिए अपने संपूर्ण डेटाबेस आर्किटेक्चर को फिर से सोचें। डी-सामान्यीकरण एक क्वेरी ट्यूनिंग चरण नहीं है। तालिका स्कैन महंगा नहीं है जब दूसरी पसंद इंडेक्स स्कैन कर रही है, इसके बाद पंक्ति में 100% पंक्तियों की आवश्यकता होने पर पंक्ति के माध्यम से तालिका पहुंच के बाद। –

    +0

    शायद समस्या डेटाबेस वास्तुकला है। –

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

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