SQL सर्वर 2005/8 क्वेरी ऑप्टिमाइज़ेशन संकेत


13

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

उदाहरण के लिए, मेरे पास एक बार एक डीबीए था जिसने जोर देकर कहा कि गिनती (*) गिनती (1) से भी बदतर होगी (मुझे नहीं पता कि वह सही थी या क्या यह अभी भी नवीनतम क्वेरी ऑप्टिमाइज़र के खिलाफ वैध है)।

मुझे टीम को किन सरल चीजों के लिए प्रयास करने और हमेशा उपयोग करने या बचने के लिए कहना चाहिए? मैं आदर्श रूप से उन चीजों की तलाश कर रहा हूं जो (ए) एक उचित अंतर बना सकती हैं और (बी) राज्य के लिए सीधे, 1 - 2 लाइनें हैं।

जवाबों:


13

क्वेरी ट्यूनिंग 101

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

खराब प्रदर्शन करने वाले प्रश्न दो मूल स्वादों में आते हैं: लेन-देन संबंधी प्रश्न जो बहुत लंबे समय तक चलते हैं, और बैच जॉब्स (या रिपोर्ट) को पीसते हैं जो बहुत लंबे समय तक चलते हैं। किसी चीज़ के साथ किसी क्वेरी का एक अच्छा संकेत इसके साथ 99% समय लेने वाले क्वेरी प्लान में एक एकल आइटम है।

लेन-देन संबंधी प्रश्न

ज्यादातर मौकों पर खराब प्रदर्शन करने वाली लेन-देन क्वेरी कुछ चीजों में से एक है:

  • एक लापता सूचकांक। आप इसे क्वेरी योजना में शामिल कर सकते हैं - बड़े तालिकाओं के टेबल स्कैन एक ऐसे चयनात्मक पर जो बहुत चयनात्मक होना चाहिए (यानी कुछ पंक्तियाँ लौटाएँ)।

  • अनुक्रमणिका का उपयोग करने में असमर्थ क्वेरी। यदि आपके पास ऐसी स्थितियाँ हैं जहाँ खंड में, परिकलित मान में शामिल होता है या क्वेरी में कुछ अन्य आइटम जो सार-सक्षम नहीं है, तो आपको क्वेरी को फिर से लिखना पड़ सकता है। संक्षेप में, sargs क्वेरी विधेय हैं जो पंक्तियों को खत्म करने के लिए अनुक्रमित का उपयोग कर सकते हैं। तार्किक और, समानता और असमानता (>,> =, <, <= और! =) सभी सर्ग-सक्षम हैं। या पारंपरिक रूप से सरग-सक्षम नहीं है। हालांकि, आप अक्सर OR से NOT (foo and not bar) टाइप कंस्ट्रक्शन के अर्थ में इन्वर्ट करके सरग-सक्षम भविष्यवाणी कर सकते हैं।

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

बैच के सवाल

बैच क्वेरी अधिक जटिल हैं और अलग-अलग ट्यूनिंग मुद्दे हैं। कुछ सुझाव हैं:

  • अनुक्रमण। यह एक ही कारण के लिए एक बड़ा अंतर बना सकता है यह लेनदेन संबंधी प्रश्नों के साथ करता है। अक्सर एक लापता सूचकांक का एक अच्छा संकेत एक लंबा, पीस ऑपरेशन (क्वेरी योजना का 99%) है जो मशीन को थ्रेशिंग नहीं लगता है।

  • अस्थायी टेबल। आप अस्थायी तालिकाओं को आबाद करने वाले कई प्रश्नों में एक प्रश्न को तोड़ना बेहतर समझ सकते हैं। बड़े प्रश्न ऑप्टिमाइज़र को पेंच करने के लिए अधिक जगह देते हैं, हालांकि यह एक समस्या से कम है जो यह हुआ करता था। अस्थायी तालिकाओं को बनाएं select intoक्योंकि यह ऑपरेशन न्यूनतम लॉग (बहुत कम लॉग गतिविधि) है, जो I / O लोड को कम करता है।

    ध्यान दें कि टेम्पर्ड बी में अस्थायी टेबल एक ही डेटा संरचना है जो ऑप्टिमाइज़र इंटरमीडिएट जॉइन रिजल्ट को स्टोर करने के लिए उपयोग करता है, इसलिए ऐसा करने के लिए कोई प्रदर्शन जुर्माना नहीं है। आप एक टेम्‍प टेबल पर एक इंडेक्स (क्‍लस्‍टरेड और कवरिंग इंडेक्स सहित) भी बना सकते हैं, जो इसे पढ़ने के प्रश्नों के प्रदर्शन में सुधार कर सकता है उन्हीं कारणों से जिनसे वे स्टैटिक टेबल पर प्रश्नों को बेहतर बनाते हैं।

    हालांकि टेम्‍प टेबलों को ओवरडोज न करें, क्‍योंकि वे क्वेरी के जरिए वापस ट्रेस करने के लिए चीजों को कठिन बना सकते हैं। संग्रहीत कार्यविधि के भीतर छोटी तालिकाओं के लिए, यह देखने के लिए परीक्षण करें कि क्या तालिका चर मदद करती है। ये एक इन-मेमोरी डेटा संरचना हैं, इसलिए वे एक प्रदर्शन जीत हो सकते हैं।

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

  • अकुशल भविष्यवाणी करता है। ये सार और अन्य सब-ऑप्टिमाइज़ेशन समस्‍याओं के साथ उसी तरह से समस्‍या पैदा कर सकते हैं, जैसे वे लेन-देन संबंधी प्रश्‍नों से करते हैं।

  • टेबल स्कैन आपका मित्र है। आम धारणा के विपरीत, टेबल स्कैन स्वाभाविक बुराई नहीं हैं। आम तौर पर वे एक लेन-देन क्वेरी में कुछ गलत होने का संकेत हैं, लेकिन वे अक्सर बड़े बैच ऑपरेशन करने के लिए सबसे कुशल तरीका हैं। यदि आप किसी तालिका में कुछ प्रतिशत से अधिक पंक्तियों के साथ कुछ कर रहे हैं, तो टेबल को कवर करने के लिए टेबल स्कैन अक्सर सबसे कुशल तरीका है।

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

ताला

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


1
+1 के रूप में यह प्रदर्शन ट्यूनिंग के बारे में कुछ बेहतरीन जानकारी है (मुझे कैलन की कक्षाओं में होने की खुशी मिली है। उसे पता है कि वह किस बारे में है!)। आप गतिशील विचारों पर कुछ जानकारी जोड़ सकते हैं।
वेन

3

सर्वश्रेष्ठ संकेत: SQL सर्वर 2008 का उपयोग करें और जब आपके परीक्षण चल रहे हों तो गतिविधि मॉनिटर चलाएं। उन प्रश्नों पर ध्यान दें, जिनमें सबसे अधिक I / O है, आदि। क्वेरी और / या निष्पादन योजना देखने के लिए उन प्रश्नों पर राइट-क्लिक करें।

अगला: निष्पादन योजनाओं को समझना सीखें।

अगला: डेटाबेस ट्यूनिंग विज़ार्ड का उपयोग करें।

ये चरण आपको अपने स्वयं के "सर्वश्रेष्ठ संकेत" उत्पन्न करने में मदद करेंगे।


2

SQL सर्वर निष्पादन योजनाओं के साथ काम करने और समझने के बारे में RedGate से एक उत्कृष्ट फ्रीली उपलब्ध ईबुक

http://www.red-gate.com/specials/Grant.htm?utm_content=Grant080623

बेशर्म प्लग, मैं SQL सर्वर प्रदर्शन के तहत अपने ब्लॉग पर प्रदर्शन ट्यूनिंग सामग्री का संदर्भ देता हूं ।

एक बार जब आप इस सामग्री में से कुछ को पचाने के लिए एक opporunity था, तो कृपया यहाँ या तो पोस्ट करने के लिए स्वतंत्र महसूस करें या विशिष्ट प्रश्नों के साथ सीधे मुझसे संपर्क करें।


1

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

यह देखने के लिए कि वे सेट-आधारित कोड द्वारा प्रतिस्थापित किए जा सकते हैं या नहीं, सभी शापदाताओं की बारीकी से जांच करें। मैंने ऐसा कोड बदल दिया है जो ऐसा करने से घंटों से लेकर सेकंड तक चलता है।

उपशम से बचें। यदि आपके पास कोड में हैं तो उन्हें जोड़कर या व्युत्पन्न तालिकाओं के साथ जोड़ दें।

सुनिश्चित करें कि आपका वह स्थान जहां खंड सरपट है।

निष्पादन योजनाओं को पढ़ना सीखें।

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

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

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