डेटाबेस में तालिका स्तंभ में उचित अनुक्रमण लागू
- सुनिश्चित करें कि आपके डेटाबेस में हर तालिका प्राथमिक कुंजी है कि सुनिश्चित करें।
यह सुनिश्चित करेगा कि प्रत्येक तालिका में क्लस्टर्ड इंडेक्स बनाया गया हो (और इसलिए, तालिका के संबंधित पृष्ठ प्राथमिक कुंजी फ़ील्ड के अनुसार डिस्क में भौतिक रूप से क्रमबद्ध होते हैं)। इसलिए, प्राथमिक कुंजी का उपयोग कर तालिका से किसी भी डेटा पुनर्प्राप्ति ऑपरेशन, या प्राथमिक कुंजी फ़ील्ड पर किसी भी सॉर्टिंग ऑपरेशन या धारा में निर्दिष्ट प्राथमिक कुंजी मानों की किसी भी श्रेणी को निर्दिष्ट किया गया है, जहां तालिका तालिका से डेटा को बहुत तेज़ी से पुनर्प्राप्त करेगी।
कॉलम जो
अक्सर खोज मापदंड में इस्तेमाल कर रहे हैं पर गैर क्लस्टर अनुक्रमित बनाएँ।
अन्य तालिकाओं में शामिल होने के लिए प्रयुक्त।
विदेशी कुंजी फ़ील्ड के रूप में उपयोग किया जाता है।
उच्च चयनशीलता (कॉलम जो एक विशेष मूल्य पर पंक्तियों की कुल संख्या से पंक्तियों का कम प्रतिशत (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 फ़ंक्शन को कॉल करें, और परिणाम को बाद में उपयोग के लिए एक चर में संग्रहीत करें।
ट्रिगर में
- कोशिश निम्नलिखित अच्छा प्रक्रियाएं लागू चलाता के उपयोग से बचने के लिए। एक ट्रिगर फायरिंग और ट्रिगरिंग घटना को निष्पादित करना एक महंगी प्रक्रिया है।
- कभी भी ट्रिगर का उपयोग न करें जो बाधाओं का उपयोग करके कार्यान्वित किया जा सकता है।
- विभिन्न ट्रिगरिंग ईवेंट (सम्मिलित करें, अपडेट करें और हटाएं) के लिए एक ही ट्रिगर का उपयोग न करें।
- ट्रिगर के अंदर लेनदेन कोड का उपयोग न करें। ट्रिगर हमेशा ट्रिगर को फेंकने वाले कोड के लेनदेन के दायरे में चलता है।
मैं इस से सहमत हूं - डाटाबेस सिस्टम में धातु के बिट्स के आसपास और पीछे जा रहे हैं। धातु के ये बिट्स आईसी के रास्ते में तेजी से तेज़ी से नहीं हो रहे हैं और क्वेरी गलत होने पर प्रदर्शन में परिमाण अंतर का ऑर्डर कर सकते हैं। – ConcernedOfTunbridgeWells
दरअसल, मैंने कर्सर को सेट-आधारित कोड के साथ बदल दिया जिसने प्रदर्शन फ़ॉर्म मिनटों को मिलीसेकंड में और कभी-कभी घंटों से सेकंड तक ले लिया। शुरू करने के लिए इस तरह के कोड लिखने की जरूरत नहीं है। – HLGEM
समयपूर्व अनुकूलन कुछ अनुकूलित करने से बचने के बारे में है जब आपके पास माप नहीं है कि कितना समय/प्रयास बचाया जाएगा। कर्सर का उपयोग करने से बचें समय से पहले अनुकूलन नहीं है क्योंकि इन्हें टालने के लिए प्रदर्शन में बहुत ही आकर्षक और अच्छी तरह से प्रलेखित सुधार है। – Nat