2012-01-12 14 views
6

मेरे पास एक ऐसे व्यवसाय के लिए असाइनमेंट है जो मूल रूप से डेटाबेस (माइक्रोसॉफ्ट एसक्यूएल सर्वर 2008) से डेटा निकालने के बारे में है। प्रक्रिया में, उपयोगकर्ता चुनने में सक्षम होंगे कि कौन से कॉलम चुनने हैं, चुनें कि किस दृश्य से चयन करना है, और WHERE क्लॉज का निर्माण करना है। उपयोगकर्ता द्वारा चुने गए उपयोगकर्ता के आधार पर, SQL क्वेरी तदनुसार बनाई गई है। एक आवश्यकता यह है कि उपयोगकर्ता किसी भी दृश्य से किसी भी कॉलम का चयन कर सकते हैं और WHERE क्लॉज में किसी भी कॉलम द्वारा फ़िल्टर कर सकते हैं। कंपनी डेटा वेयरहाउस/ओलाप का उपयोग करने के लिए समाधान नहीं चाहता है, और किसी तीसरे पक्ष के सॉफ्टवेयर को सीमित करना चाहता है। तो मूल रूप से वे सिर्फ एक .NET विंडोज फॉर्म एप्लिकेशन चाहते हैं जो एक जीयूआई के आधार पर गतिशील रूप से SQL क्वेरी बनाता है और डेटाबेस से कनेक्ट होता है।डायनामिक क्वेरी ऑप्टिमाइज़ेशन

मेरी चिंता यहां प्रश्नों को अनुकूलित करने का तरीका है। मैं अभी तक एसक्यूएल प्रश्नों को अनुकूलित करने के लिए अच्छा नहीं हूं, लेकिन मेरा पहला विचार था: क्या होगा यदि उपयोगकर्ता उस कॉलम द्वारा फ़िल्टर करना चुनता है जिसमें कोई अनुक्रमणिका नहीं है (WHERE क्लॉज में)? उपयोगकर्ता को इतना लचीलापन देकर, वे संभावित रूप से उन प्रश्नों का निर्माण कर सकते हैं जो इतने अप्रभावी हैं कि उन्हें निष्पादित करने में लंबा समय लगेगा।

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

मैं जरूरी नहीं कि केवल क्वेरी ऑप्टिमाइज़ेशन की तलाश कर रहा हूं, लेकिन मैं यह भी सोच रहा हूं कि क्या कोई सर्वर बदलाव है जो मैं कर सकता हूं, जैसे कैशिंग? असल में मैं सभी कान हूं और किसी भी सलाह की तलाश कर रहा हूं जो प्रदर्शन में सुधार करने में मेरी मदद कर सकता है।

कोई सुझाव?

अग्रिम धन्यवाद!

+1

यह उन परिदृश्यों में से एक है जिनके लिए कॉलम स्टोर इंडेक्स मदद करना चाहिए (अगले संस्करण तक उपलब्ध नहीं है!)। सुनिश्चित नहीं है कि डीडब्ल्यू का उपयोग न करके आपका क्या मतलब है। क्या यह एक ओएलटीपी डेटाबेस से पूछताछ कर रहा है जो समवर्ती डेटा संशोधनों के अधीन है इसलिए इंडेक्स जोड़ने की अनिच्छा? –

+0

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

+1

संदेह उस विनिर्देश के आधार पर आप कर सकते हैं (स्पष्ट हार्डवेयर उन्नयन के अलावा)। प्रदर्शन शायद चूसना होगा। उन्होंने इसके लिए ओलाप/डीडब्ल्यू क्यों छूट दी है? –

उत्तर

4

आप जो कुछ भी करने जा रहे हैं, उसे छोड़कर आप वास्तव में बहुत कुछ नहीं कर सकते हैं। आप SQL सर्वर ऑप्टिमाइज़र को आपके लिए कड़ी मेहनत करने की अच्छी स्थिति में हैं (कल्पना करें कि इसे एक महत्वपूर्ण मूल्य स्टोर पर बनाएं!)।

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

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

अंत में, आप केवल पढ़ने-योग्य लॉग-शिपिंग लक्ष्य या जैसे उपयोगकर्ता क्वेरी को ऑफ़लोड कर सकते हैं। यह उनके भयानक प्रश्नों को सैंडबॉक्स करेगा।

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

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

नियमित रूप से sp_updatestats चलाएं।

अंत में, मैं कहना चाहता हूं कि इसका कोई प्रभावी समाधान नहीं है क्योंकि यदि SQL सर्वर स्वयं उन्हें लागू करेगा तो सभी को लाभ हो सकता है।

1

पहले, एसक्यूएल सर्वर के, अनुकूलन करने के लिए कैश और प्रश्नों के लिए/बयान

  • संकलन की क्षमता में सुधार करने के लिए सुनिश्चित यूआई में समर्थन करता है और बनाने के बीच है, जबकि दे उपयोगकर्ताओं को अपने स्वयं कहां खंड का निर्माण।
  • अपनी और OR शर्तों को सॉर्ट करें ताकि अनुक्रमित कॉलम पहले हों, उसके बाद अन्य कॉलम के वर्णमाला क्रम के बाद।
    • आप अपने कहां खंड में नेस्टेड ands और अन्य रैंकों इस और अधिक कठिन
  • उपयोग * parameterized क्वेरी को हो सकता है "
WHERE C1 = 'foo' AND C3 = 'bar' AND C2 = 42 
-- if C3 is an indexed column then 
WHERE C3 = @parm1 AND C1 = @parm2 AND C2 = @parm3 

दूसरा अनुमति दे रहे हैं, तो उपयोगकर्ताओं को सशक्त बनाने के लिए

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

संपादित या -> AND या OR मार्टिन स्मिथ की टिप्पणी के संबंध में, इस लघु सर्किटिंग कहा जाता है।

तर्क पर विचार करें

A = True OR B = True OR C = True 

तो एक वास्तव में यह सच है अगर एक झूठी कोई है सच

A = True AND B = True AND C = True 

इस मामले में होने की हालत के लिए बी या सी का मूल्यांकन करने की आवश्यकता नहीं है स्थिति को झूठी होने के लिए बी या सी को विकसित करने की आवश्यकता है।

+0

छंटनी 'या' स्थितियों को अनुक्रमित कॉलम पहले कोई फर्क नहीं पड़ता –

+0

@ मार्टिन स्मिथ - मैं इस धारणा के तहत था कि SQL सर्वर शॉर्ट सर्किट बूलियन अभिव्यक्ति करेगा। आपकी टिप्पणी एक प्रकार का ग्लिब है, इसलिए यदि आप विस्तृत कर सकते हैं तो यह सहायक होगा। ऑर्डरिंग और पैरामीटरेशन का दूसरा बिंदु अलग-अलग पैरामीटर के साथ उसी कॉलम का उपयोग करके इतने प्रश्न हैं कि पुन: उपयोग के लिए कैश किया जाएगा। –

+1

@LastCoder - [SQL सर्वर शॉर्ट सर्किट नहीं करता है] (http://stackoverflow.com/questions/381224/sql-server-query-short-circuiting) –

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