2008-09-19 13 views
17

मैंने हमेशा इंडेक्स के न्यूनतम सेट के साथ डेटाबेस को तैनात करने और प्रदर्शन को निर्देशित करने के रूप में इंडेक्स को बदलने/बदलने का दृष्टिकोण लिया है।सर्वश्रेष्ठ SQL सर्वर प्रदर्शन अनुकूलन तकनीक क्या हैं?

यह दृष्टिकोण उचित रूप से अच्छी तरह से काम करता है। हालांकि, यह अभी भी मुझे नहीं बताता है कि मैं प्रदर्शन में सुधार कर सकता हूं। यह केवल मुझे बताता है कि प्रदर्शन इतना बुरा है कि उपयोगकर्ता इसके बारे में शिकायत करते हैं।

वर्तमान में, मैं अपने कई अनुप्रयोगों पर डेटाबेस ऑब्जेक्ट्स को दोबारा करने की प्रक्रिया में हूं।

तो क्या मुझे प्रदर्शन सुधारों को देखने के लिए परेशान नहीं होना चाहिए क्योंकि "समयपूर्व अनुकूलन सभी बुराइयों की जड़ है"?

एप्लिकेशन कोड को पुन: सक्रिय करते समय, डेवलपर लगातार कोड गुणवत्ता में सुधार करने के तरीकों की तलाश में रहता है। क्या डेटाबेस प्रदर्शन में लगातार सुधार की तलाश करने का कोई तरीका है? यदि हां, तो आपको कौन से टूल्स और तकनीकों को सबसे उपयोगी पाया गया है?

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

उत्तर

11

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

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

एक बार जब आपके पास संभावित समस्याओं की "शीर्ष 10" सूची हो, तो आप यह देखने के लिए व्यक्तिगत रूप से देख सकते हैं कि क्वेरी को फिर से काम किया जा सकता है या नहीं, एक सूचकांक मदद कर सकता है या मामूली आर्किटेक्चर परिवर्तन कर सकता है। शीर्ष 10 के साथ आने के लिए, विभिन्न तरीकों से डेटा को देखने का प्रयास करें: औसत * अवधि के दौरान कुल लागत के लिए गिनती, सबसे खराब अपराधी के लिए अधिकतम, केवल सादा औसत, आदि

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

शुभकामनाएं!

1

आपके प्रश्नों, नहीं स्पष्ट हैं, लेकिन जटिल है कि अलग-अलग तालिकाओं, विचार, आदि का उपयोग प्रोफ़ाइल और/या जो कि अलग-अलग तालिकाओं

है कि आप निश्चित रूप से समझ जहां

ध्यान केंद्रित करना चाहिए होगा से कई पंक्तियों को वापस
0

ऐसा लगता है कि आप एमएस एसक्यूएल के बारे में बात कर रहे हैं।

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

एसक्यूएल पुस्तकें आपको प्रोफाइलिंग और क्वेरी विश्लेषण कार्यक्षमता दोनों का एक अच्छा अवलोकन प्रदान करेगी।

1

प्रोफाइलिंग महत्वपूर्ण है, लेकिन एक प्रोफाइलिंग सेट का उपयोग करते समय आपको यह सुनिश्चित करना होगा कि यह डेटा का सटीक परीक्षण सेट है, अन्यथा ट्यूनिंग टूल आपको आवश्यक सटीक परिणाम प्राप्त करने में सक्षम नहीं होंगे।

इसके अलावा प्रबंधन खंड वस्तुओं के साथ 2005 में उपयोग रिपोर्टिंग बहुत उपयोगी है!

1

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

इन संदर्भों का प्रयास करें:

Optimizing SQL
How to Optimize Queries

0

आप वर्तमान इंडेक्स के आंतरिक और बाहरी विचलन की जांच कर सकते हैं और या तो उन्हें छोड़कर फिर से बना सकते हैं या उन्हें व्यवस्थित कर सकते हैं।

0

सुनिश्चित करें कि आप उत्पादन वॉल्यूम का उपयोग करके प्रोफाइलिंग कर रहे हैं - पंक्तियों की संख्या और लोड के संदर्भ में। प्रश्न और उनकी योजना अलग-अलग लोड/वॉल्यूम परिदृश्यों के तहत अलग-अलग व्यवहार करती है

1

बेशक आपको अपने प्रश्नों को प्रोफाइल करना होगा और निष्पादन योजना को देखना होगा। लेकिन दो मुख्य चीजें जो बार-बार आती हैं, जितनी जल्दी हो सके उतनी ही फ़िल्टर कर सकती हैं जितनी जल्दी हो सके और कर्सर से बचने की कोशिश करें।

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

कर्सर स्पष्ट हैं। यदि आपके पास दस लाख पंक्तियां हैं और पंक्ति से पंक्ति पर जाएं तो यह हमेशा के लिए ले जाएगा। कुछ परीक्षण करना, यदि आप पर्ल जैसे "धीमी" गतिशील भाषा के साथ डेटाबेस से कनेक्ट करते हैं और डेटासेट पर पंक्ति संचालन द्वारा कुछ पंक्तियां करते हैं, तो गति डेटाबेस के कर्सर से भी अधिक होगी। जावा/सी/सी ++ जैसे कुछ के साथ ऐसा करें और गति अंतर भी बड़ा है। यदि आप डेटाबेस कोड में कर्सर को ढूंढ/खत्म कर सकते हैं, तो यह बहुत तेजी से चलाएगा ... यदि आपको कर्सर का उपयोग करना है, तो उस भाग को किसी भी प्रोग्रामिंग भाषा में दोबारा लिखना और डेटाबेस से बाहर निकलना संभवतः बड़े प्रदर्शन में वृद्धि करेगा।

कर्सर पर एक और नोट, SELECT @ col1 = col1, @ col2 = col2, @ col3 = col3 जैसे कोड सावधान रहें, जहां id = @currentid आईडी के माध्यम से जाता है और फिर प्रत्येक कॉलम पर कथन निष्पादित करता है। असल में यह एक कर्सर भी है। इतना ही नहीं, लेकिन असली कर्सर का उपयोग करना अक्सर इससे तेज होता है, खासकर स्थैतिक और आगे_ऑनली। यदि आप ऑपरेशन को सेट करने के लिए बदल सकते हैं तो यह बहुत तेज़ होगा ..... यह कहा जा रहा है कि कर्सर के पास कुछ चीजों के लिए जगह है .... लेकिन प्रदर्शन परिप्रेक्ष्य से सेट पर आधारित उनका उपयोग करने का जुर्माना है दृष्टिकोण।

निष्पादन योजना से सावधान रहें। कभी-कभी यह उन परिचालनों का अनुमान लगाता है जो बहुत महंगा और संचालन करते हैं जो बहुत सस्ता होने में कुछ मिनट लेते हैं। निष्पादन योजना को देखते समय सुनिश्चित करें कि कुछ कोड 'इस क्षेत्र में', GETDATE() को अपने कोड में डालें।

11

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

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

और आपके फील्ड नाम निर्दिष्ट करने के बजाय कभी भी * का चयन करने का कोई कारण नहीं है। एमएसएसक्यूएल में आप ऑब्जेक्ट एक्सप्लोरर से उन नामों को खींच सकते हैं ताकि आप मुझे नहीं बता सकें कि ऐसा करना बहुत मुश्किल है। लेकिन केवल उन क्षेत्रों को specyfying द्वारा आप वास्तव में जरूरत है, आप नेटवर्क संसाधनों और डेटाबेस सर्वर संसाधनों और वेब सर्वर संसाधनों को बचाते हैं। तो क्यों एक प्रोग्रामर कभी चुनिंदा विकल्प का आलसी विकल्प लेना चाहिए और बाद में अनुकूलित करने की चिंता क्यों करनी चाहिए?

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

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

+0

मैं इस से सहमत हूं - डाटाबेस सिस्टम में धातु के बिट्स के आसपास और पीछे जा रहे हैं। धातु के ये बिट्स आईसी के रास्ते में तेजी से तेज़ी से नहीं हो रहे हैं और क्वेरी गलत होने पर प्रदर्शन में परिमाण अंतर का ऑर्डर कर सकते हैं। – ConcernedOfTunbridgeWells

+0

दरअसल, मैंने कर्सर को सेट-आधारित कोड के साथ बदल दिया जिसने प्रदर्शन फ़ॉर्म मिनटों को मिलीसेकंड में और कभी-कभी घंटों से सेकंड तक ले लिया। शुरू करने के लिए इस तरह के कोड लिखने की जरूरत नहीं है। – HLGEM

+1

समयपूर्व अनुकूलन कुछ अनुकूलित करने से बचने के बारे में है जब आपके पास माप नहीं है कि कितना समय/प्रयास बचाया जाएगा। कर्सर का उपयोग करने से बचें समय से पहले अनुकूलन नहीं है क्योंकि इन्हें टालने के लिए प्रदर्शन में बहुत ही आकर्षक और अच्छी तरह से प्रलेखित सुधार है। – Nat

0

आम तौर पर, यहाँ युक्तियाँ:

http://www.sql-server-performance.com/

अतीत में मेरे लिए उच्च गुणवत्ता और उपयोगी किया गया है।

-1

मेरी सलाह सभी डेटाबेस पर लागू तकनीकों से शुरू करना होगा और फिर एमएसएसक्यूएल के लिए विशिष्ट लोगों को आजमाएं।

एसक्यूएल अनुकूलित करना मुश्किल है, और कोई कठोर और तेज़ नियम नहीं हैं। बहुत कम सामान्य दिशानिर्देश हैं जिनका आप पालन कर सकते हैं, जैसे:

  • प्रदर्शन सुधार का 95% सर्वर से या डेटाबेस इंजन कॉन्फ़िगरेशन से नहीं, अनुप्रयोग से आएगा। शुद्धता के लिए
  • डिजाइन पहले, प्रदर्शन के लिए tweak बाद में
  • डेटाबेस के दौरे को कम एक तरीका है कि अपने डेटा मॉडल फिट बैठता है
  • प्रदर्शन के बारे में सामान्य सलाह पर ध्यान न दें में चीजों को व्यक्त करने के लिए
  • कोशिश - हाँ, कुछ बिंदु आप पर एक सिस्टम या एसक्यूएल कथन मिलेगा जहां उन नियमों में से कोई एक लागू नहीं होता है।

लेकिन मुख्य बिंदु यह है कि आपको हमेशा 80-20 नियम लागू करना चाहिए। जिसका अर्थ है कि किसी भी प्रणाली में आपको सबसे बड़ा प्रदर्शन लाभ के लिए अपने कोड का 20% (अक्सर बहुत कम) ट्विक करना होगा। यही वह जगह है जहां विक्रेता ने उपकरण usually fail प्रदान किया, क्योंकि वे आम तौर पर निष्पादन के अनुप्रयोग/व्यावसायिक संदर्भ का अनुमान नहीं लगा सकते हैं।

1

मेरी सलाह यह है कि इस संदर्भ में "समयपूर्व अनुकूलन सभी बुराइयों की जड़ है" बेकार बकवास है।

मेरी नजर में अपने सभी के बारे में डिजाइन - आप संगामिति, हॉटस्पॉट, अनुक्रमण, स्केलिंग और उपयोग पैटर्न के बारे में सोचना है जब आप अपने डेटा स्कीमा को डिजाइन कर रहे हैं की जरूरत है।

यदि आपको नहीं पता कि आपको कौन सी इंडेक्स की आवश्यकता है और उन्हें बिना किसी प्रोफाइल के बल्ले से कॉन्फ़िगर करने की आवश्यकता है, तो आप पहले ही असफल हो चुके हैं।

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

0

डेटाबेस में तालिका स्तंभ में उचित अनुक्रमण लागू

  • सुनिश्चित करें कि आपके डेटाबेस में हर तालिका प्राथमिक कुंजी है कि सुनिश्चित करें।

यह सुनिश्चित करेगा कि प्रत्येक तालिका में क्लस्टर्ड इंडेक्स बनाया गया हो (और इसलिए, तालिका के संबंधित पृष्ठ प्राथमिक कुंजी फ़ील्ड के अनुसार डिस्क में भौतिक रूप से क्रमबद्ध होते हैं)। इसलिए, प्राथमिक कुंजी का उपयोग कर तालिका से किसी भी डेटा पुनर्प्राप्ति ऑपरेशन, या प्राथमिक कुंजी फ़ील्ड पर किसी भी सॉर्टिंग ऑपरेशन या धारा में निर्दिष्ट प्राथमिक कुंजी मानों की किसी भी श्रेणी को निर्दिष्ट किया गया है, जहां तालिका तालिका से डेटा को बहुत तेज़ी से पुनर्प्राप्त करेगी।

  • कॉलम जो

    अक्सर खोज मापदंड में इस्तेमाल कर रहे हैं पर गैर क्लस्टर अनुक्रमित बनाएँ।

    अन्य तालिकाओं में शामिल होने के लिए प्रयुक्त।

    विदेशी कुंजी फ़ील्ड के रूप में उपयोग किया जाता है।

    उच्च चयनशीलता (कॉलम जो एक विशेष मूल्य पर पंक्तियों की कुल संख्या से पंक्तियों का कम प्रतिशत (0-5%) देता है)।

    ऑर्डर द्वारा ऑर्डर में प्रयुक्त।

का उपयोग न करें "* का चयन करें" एक SQL क्वेरी में

अनावश्यक कॉलम लाए जाने के मिल सकता है कि डेटा पुनर्प्राप्ति समय पर खर्च जोड़ देगा। डेटाबेस इंजन "कवर किए गए इंडेक्स" के लाभ का उपयोग नहीं कर सकता है और इसलिए क्वेरी धीरे-धीरे निष्पादित करती है।

उदाहरण:

SELECT Cash, Age, Amount FROM Investments; 

के बजाय:

SELECT * FROM Investments; 

आजमा कर बयानों का चयन

में खण्ड HAVING क्लॉज़ पंक्तियों को फ़िल्टर करने के बाद सभी पंक्तियों हैं प्रयोग किया जाता है से बचने के लिए चयनित और फ़िल्टर की तरह प्रयोग किया जाता है। किसी अन्य उद्देश्य के लिए हैविंग क्लॉज का उपयोग न करने का प्रयास करें।

उदाहरण:

SELECT Name, count (Name) FROM Investments WHERE Name!= ‘Test’ AND Name!= ‘Value’ GROUP BY Name; 

के बजाय: एक प्रश्न के भीतर उप क्वेरी ब्लॉक की संख्या को कम करने के

कभी कभी हम में एक से अधिक उप क्वेरी हो सकता है

SELECT Name, count (Name) FROM Investments GROUP BY Name HAVING Name!= ‘Test’ AND Name!= ‘Value’ ; 

कोशिश हमारी मुख्य क्वेरी। हमें अपनी क्वेरी में उप क्वेरी ब्लॉक की संख्या को कम करने की कोशिश करनी चाहिए।

उदाहरण:

SELECT Amount FROM Investments WHERE (Cash, Fixed) = (SELECT MAX (Cash), MAX (Fixed) FROM Retirements) AND Goal = 1; 

बजाय: चयन सूची में

SELECT Amount FROM Investments WHERE Cash = (SELECT MAX (Cash) FROM Retirements) AND Fixed = (SELECT MAX (Fixed) FROM Retirements) AND Goal = 1; 

से बचें अनावश्यक कॉलम और में अनावश्यक तालिकाओं में शामिल होने की स्थिति

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

एक अस्तित्व की जांच

आप COUNT() का उपयोग करते हैं, एसक्यूएल सर्वर पता नहीं है कि आप एक अस्तित्व की जांच कर रहे हैं करने के लिए एक सबक्वेरी में COUNT() कुल का प्रयोग न करें। यह सभी मेल खाने वाले मानों की गणना करता है, या तो टेबल स्कैन करके या सबसे छोटी गैर क्लस्टर इंडेक्स स्कैन करके। जब आप EXISTS का उपयोग करते हैं, तो SQL सर्वर जानता है कि आप एक अस्तित्व जांच कर रहे हैं। जब यह पहला मिलान मूल्य पाता है, तो यह सत्य लौटाता है और दिखता है। कॉलम

जब विभिन्न डेटा प्रकार के दो स्तंभों के बीच में शामिल होने के दो प्रकार के बीच में शामिल होने से बचने के लिए

प्रयास करें, स्तंभों में से एक अन्य के प्रकार परिवर्तित किया जाना चाहिए।जिस स्तंभ का प्रकार कम है वह परिवर्तित होता है। यदि आप असंगत प्रकारों के साथ तालिकाओं में शामिल हो रहे हैं, तो उनमें से एक इंडेक्स का उपयोग कर सकता है, लेकिन क्वेरी ऑप्टिमाइज़र उस कॉलम पर एक इंडेक्स नहीं चुन सकता है जो इसे परिवर्तित करता है।

एक मेज

में रिकॉर्ड गिनती प्राप्त करने के लिए COUNT (*) का उपयोग न करने का प्रयास किसी तालिका में कुल पंक्ति संख्या प्राप्त करने के लिए, हम आम तौर पर निम्नलिखित का चयन करें कथन का उपयोग:

SELECT COUNT(*) FROM [dbo].[PercentageForGoal] 

यह क्वेरी पंक्ति गणना प्राप्त करने के लिए एक पूर्ण तालिका स्कैन करेगी। निम्न क्वेरी को पूर्ण तालिका स्कैन की आवश्यकता नहीं होगी। (कृपया ध्यान दें कि यह आप 100% सही परिणाम हमेशा नहीं दे सकता है, लेकिन यह काम केवल यदि आप एक सही गिनती की आवश्यकता नहीं है।)

SELECT rows FROM sysindexes 
WHERE id = OBJECT_ID('[dbo].[PercentageForGoal]') AND indid< 2 

ऑपरेटरों इस्तेमाल करने की कोशिश मौजूद है, में और उचित रूप से कार्यभार संभाला की तरह आपकी क्वेरी में

  • आमतौर पर इनके सबसे धीमे प्रदर्शन होते हैं।
  • IN कुशल है, केवल तभी जब चयन के लिए अधिकांश फ़िल्टर मानदंड SQL कथन के उप-क्वेरी में रखे जाते हैं।
  • EXISTS कुशल है जब चयन के लिए फ़िल्टर मानदंडों में से अधिकांश SQL कथन की मुख्य क्वेरी में है।

कोशिश गतिशील एसक्यूएल से बचने के लिए

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

कोशिश अस्थायी तालिकाओं

जब तक वास्तव में आवश्यक के उपयोग से बचने के लिए, अस्थायी तालिकाओं के उपयोग से बचने की कोशिश करो। इसके बजाय तालिका चर का उपयोग करें। 99% मामलों में, तालिका चर मेमोरी में रहते हैं, इसलिए यह बहुत तेज़ है। अस्थायी टेबल TempDb डेटाबेस में रहते हैं। इसलिए अस्थायी तालिकाओं पर परिचालन करने के लिए इंटर डेटाबेस संचार की आवश्यकता होती है और इसलिए धीमा हो जाएगा।

इसके बजाय जैसे खोज की , टेक्स्ट का डेटा खोज

पूर्ण पाठ खोज हमेशा खोजों जैसे मात के लिए पूर्ण पाठ खोज का उपयोग करें। पूर्ण पाठ खोज आपको जटिल खोज मानदंडों को लागू करने में सक्षम बनाती हैं जिन्हें एक शब्द या वाक्यांश (और वैकल्पिक रूप से, परिणाम सेट रैंकिंग) पर खोजना, जैसे किसी शब्द या वाक्यांश को खोजना, LIKE खोज का उपयोग करके कार्यान्वित नहीं किया जा सकता है। एक और शब्द या वाक्यांश, या एक विशिष्ट शब्द के समानार्थी रूपों पर खोज। पूर्ण पाठ खोज को लागू करना LIKE खोज (विशेष रूप से जटिल खोज आवश्यकताओं के मामले में) से लागू करना आसान है।

कोशिश यूनिअन उपयोग करने के लिए एक "या" आपरेशन

एक प्रश्न में उपयोग करने के लिए नहीं "या" प्रयास करें लागू करने के लिए। इसके बजाय दो विशिष्ट प्रश्नों के परिणाम सेट को गठबंधन करने के लिए "यूनियन" का उपयोग करें। इससे क्वेरी प्रदर्शन में सुधार होगा। यूनियन का बेहतर उपयोग करें यदि एक विशिष्ट परिणाम की आवश्यकता नहीं है। यूनियन सभी यूनियन की तुलना में तेज़ है क्योंकि इसे विशिष्ट मानों को जानने के लिए परिणाम सेट को सॉर्ट करने की आवश्यकता नहीं है।

बड़ी वस्तुओं

स्टोर बड़े वस्तु कॉलम (VARCHAR (मैक्स), छवि, पाठ आदि) मुख्य तालिका से एक अलग तालिका में के लिए एक आलसी लोड हो रहा है रणनीति को लागू करें, और के लिए एक संदर्भ डाल मुख्य तालिका में बड़ी वस्तु। किसी क्वेरी में सभी मुख्य तालिका डेटा पुनर्प्राप्त करें, और यदि एक बड़ी वस्तु को लोड करने की आवश्यकता है, तो बड़ी ऑब्जेक्ट डेटा को केवल तब आवश्यक होने पर बड़ी ऑब्जेक्ट तालिका से पुनर्प्राप्त करें।

उपयोगकर्ता निर्धारित कार्य

में निम्नलिखित अच्छा प्रक्रियाएं लागू बार-बार अपने संग्रहित प्रक्रियाओं, ट्रिगर काम करता है, और बैचों के भीतर कार्यों कॉल न करें। उदाहरण के लिए, आपको अपनी प्रक्रिया के कई स्थानों पर एक स्ट्रिंग चर की लंबाई की आवश्यकता हो सकती है, लेकिन जब भी इसकी आवश्यकता हो, तो LEN फ़ंक्शन को कॉल न करें; इसके बजाय, एक बार LEN फ़ंक्शन को कॉल करें, और परिणाम को बाद में उपयोग के लिए एक चर में संग्रहीत करें।

ट्रिगर में

  • कोशिश निम्नलिखित अच्छा प्रक्रियाएं लागू चलाता के उपयोग से बचने के लिए। एक ट्रिगर फायरिंग और ट्रिगरिंग घटना को निष्पादित करना एक महंगी प्रक्रिया है।
  • कभी भी ट्रिगर का उपयोग न करें जो बाधाओं का उपयोग करके कार्यान्वित किया जा सकता है।
  • विभिन्न ट्रिगरिंग ईवेंट (सम्मिलित करें, अपडेट करें और हटाएं) के लिए एक ही ट्रिगर का उपयोग न करें।
  • ट्रिगर के अंदर लेनदेन कोड का उपयोग न करें। ट्रिगर हमेशा ट्रिगर को फेंकने वाले कोड के लेनदेन के दायरे में चलता है।
संबंधित मुद्दे