2008-08-27 9 views
6

मेरे पास कई लाख पंक्तियों वाली एक टेबल है। मुझे एक विशिष्ट कॉलम मान के साथ सभी पंक्तियों को खोजने की ज़रूरत है। वह कॉलम इंडेक्स में नहीं है, इसलिए टेबल स्कैन परिणाम।टेबल स्कैन बनाम इंडेक्स जोड़ें - जो तेज़ है?

लेकिन क्या यह सिर पर कॉलम के साथ एक इंडेक्स जोड़ने के लिए तेज होगा (प्राइम कुंजी निम्नलिखित), क्वेरी करें, फिर इंडेक्स ड्रॉप करें?

मैं स्थायी रूप से एक अनुक्रमणिका नहीं जोड़ सकता क्योंकि उपयोगकर्ता नामांकन कर रहा है कि वे किस कॉलम की तलाश में हैं।

उत्तर

2

एक इंडेक्स जोड़ने के लिए एक टेबल स्कैन की आवश्यकता होती है, इसलिए यदि आप स्थायी इंडेक्स नहीं जोड़ सकते हैं तो ऐसा लगता है कि एक स्कैन (थोड़ा) तेज होगा।

2

नहीं, यह तेज़ नहीं होगा। सूचकांक जोड़ने और इसे वहां छोड़ने के लिए तेज़ी से क्या होगा!

बेशक, यह हर कॉलम को इंडेक्स करने के लिए व्यावहारिक नहीं हो सकता है, लेकिन फिर यह हो सकता है। तालिका में डेटा कैसे जोड़ा जाता है?

2

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

उसने कहा - आपके पास कितने कॉलम हैं? क्या आप वाकई उनमें से प्रत्येक के लिए एक इंडेक्स नहीं बना सकते हैं यदि एकल खोज के लिए क्वेरी समय बहुत लंबा है?

7

मैं कोई डीबीए नहीं हूं, लेकिन मुझे लगता है कि इंडेक्स बनाने के लिए तालिका को स्कैन करने की आवश्यकता होगी।

जब तक कि उस कॉलम पर कई प्रश्न नहीं होने जा रहे हैं, तो मैं सूचकांक बनाने की अनुशंसा नहीं करता।

दोनों तरीकों के लिए व्याख्या योजना/निष्पादन समय की जांच करने के लिए सर्वश्रेष्ठ!

2

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

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

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

3

जैसा कि हर किसी ने कहा है, यह निश्चित रूप से उस कॉलम का पूर्ण स्कैन करने के लिए सूचकांक जोड़ने के लिए तेज़ नहीं होगा।

हालांकि, मैं क्वेरी पैटर्न को ट्रैक करने का सुझाव देता हूं और पता लगाता हूं कि कौन से कॉलम सबसे अधिक खोजे जाते हैं, और कम से कम उनके लिए इंडेक्स जोड़ते हैं। आप यह पता लगा सकते हैं कि 3-4 इंडेक्स आपके 90% प्रश्नों को गति देता है।

9

दो सवालों में सोचने के लिए के बारे में:

  1. क्वेरी के लिए कितने कॉलम नामित किया जा सकता है?
  2. क्या डेटा अक्सर बदलता है? बहुत ज़्यादा उसका?

आप उम्मीदवार कॉलम की एक छोटे संख्या है, और डेटा एक बहुत परिवर्तन नहीं करता है, तो आप किसी भी या यहाँ तक कि सभी उम्मीदवार स्तंभ पर एक स्थायी सूचकांक जोड़ने पर विचार कर सकते हैं।

"निंदा!", मैंने सुना। अधिकांश स्रोत आपको तालिका के हर कॉलम को "कभी नहीं" इंडेक्स करने के लिए कहते हैं, लेकिन सलाह दी जाती है कि सामान्य धारणा पर आधारित है कि तालिकाओं को अक्सर संशोधित किया जाता है।

आप अतिरिक्त संग्रहण में मूल्य का भुगतान करेंगे, साथ ही डेटा में परिवर्तन होने पर प्रदर्शन हिट भी करेंगे।

छोटे कैसे छोटा है और एक बहुत कितना है, और दुविधा यह इसके लायक है? प्रियेरी बताने का कोई तरीका नहीं है क्योंकि "बहुत धीमी" आमतौर पर एक व्यक्तिपरक माप है।

आपको इसे आजमाएं, अपनी अनुक्रमणिका के आकार को मापें और फिर खोजों में उनके प्रभाव को मापना होगा। आपको अपने ग्राहकों की संतुष्टि में वृद्धि के खिलाफ लागतों को संतुलित करना होगा।

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

शुभकामनाएं।

2

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

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

लेकिन आपके मूल प्रश्न के लिए, एक क्वेरी के उद्देश्य के लिए एक इंडेक्स जोड़ना और छोड़ना केवल फायदेमंद है यदि आप क्वेरी के दौरान एक से अधिक चयन करते हैं (उदाहरण के लिए, चयन एक उप-क्वेरी में है जो चलाया जाता है प्रत्येक पंक्ति के लिए लौटा)।