2010-10-30 29 views
7

में आंतरिक रूप से डेटा संग्रहीत करता है मेरा प्रश्न यह है कि डेटाबेस कैसे डेटा संग्रहीत करता है और यह आंतरिक रूप से क्वेरी कैसे करता है।डाटाबेस बी-ट्री/बी + ट्री

मान लीजिए हम अपने सारणी के कोष्ठकों निम्नलिखित है:

  1. आईडी
  2. नाम
  3. उम्र
  4. भार
  5. प्रबंधक

और हम select * from Table1 where age>50 and weight<100

क्वेरी

मैं सिर्फ उत्सुक हूं कि यह आंतरिक रूप से क्वेरी कैसे करता है।

इस उदाहरण में बी-ट्रे/बी + वृक्ष के नोड में क्या शामिल होगा?

उत्तर

6

आपके द्वारा चुने गए उदाहरण में कुछ मामलों में से एक है जहां एक पेड़ नौकरी नहीं कर सकता (दो स्वतंत्र श्रेणियां)। क्यों के इंडेक्स ऊपर के उदाहरण के लिए उपयोगी हो सकता है अधिक जानकारी के लिए http://use-the-index-luke.com/anatomy/

संपादित:

हालांकि, के अपने काम में प्रगति ई-बुक पहला अध्याय बी ट्री अनुक्रमित की अंदरूनी कामकाज बताते हैं ।

ऊपर क्वेरी तीन संभावित सूचकांक विन्यास द्वारा समर्थित किया जा सकता है: WEIGHT (इस क्रम में) AGE पर

  1. श्रेणीबद्ध सूचकांक और उसके बाद।
    मामले में, क्वेरी सभी रिकॉर्ड WHERE AGE > 50 पढ़ेगी और फिर WEIGHT द्वारा फ़िल्टर करें।

  2. WEIGHT पर समेकित सूचकांक और फिर AGE (अन्य ऑर्डर)।
    यह अलग-अलग तरीके से जाता है: सभी रिकॉर्ड WHERE WEIGHT < 100 पढ़ें और फिर AGE द्वारा फ़िल्टर करें।

जो भी अधिक कुशल है आपके पास मौजूद डेटा पर निर्भर करता है। यदि से AGE > 50 कम रिकॉर्ड हैं तो पहला अधिक कुशल होगा, अन्यथा दूसरा। हालांकि, अगर आप विभिन्न मूल्यों से पूछताछ करते हैं, तो तस्वीर बदल सकती है।

कारण यह है कि एक संगत सूचकांक अच्छी तरह से क्वेरी का समर्थन नहीं कर सकता है कि प्रत्येक इंडेक्स ऑर्डर केवल एक अक्ष पर है। प्रत्येक इंडेक्स प्रविष्टि किसी अन्य के पहले या बाद में होती है, लेकिन इसके आगे कभी नहीं होती है। सभी इंडेक्स प्रविष्टियां एक श्रृंखला बनाती हैं।

एक प्रश्न जिसमें दो स्वतंत्र श्रेणी प्रश्न हैं, को दो अक्षों की आवश्यकता होगी, एक श्रृंखला की तरह नहीं, बल्कि शतरंज बोर्ड की तरह। AGE के लिए एक अक्ष WEIGHT के लिए दूसरा। यदि यह संभव होगा, तो आपकी क्वेरी को शतरंज बोर्ड के केवल एक कोने को स्कैन करने की आवश्यकता होगी।

हालांकि, एक बी-पेड़ में केवल एक धुरी है, इसलिए आपको पहले उपयोग करने के लिए कौन से मानदंडों का चयन करना होगा। यदि आपने AGE चुना है तो इसका मतलब है कि AGE 50 से शुरू होने पर, संपूर्ण श्रृंखला को अंत तक स्कैन किया जाएगा।श्रृंखला के किनारे संग्रहीत कुछ रिकॉर्ड केवल WEIGHT < 100 के लिए अर्हता प्राप्त करेंगे, अन्य रिकॉर्ड पढ़े जाने चाहिए लेकिन इसे छोड़ दिया जाएगा।

तो, यह समझाने के लिए एक लंबी कहानी क्यों एक पेड़ दो स्वतंत्र सीमा खंडों के साथ एक प्रश्न का समर्थन नहीं कर सकता है। दूसरी ओर, एक श्रेणीबद्ध सूचकांक काफी अच्छी तरह से निम्न कर सकते हैं:

WHERE age = 50 AND weight < 100 
WHERE weight = 100 AND age > 50 
WHERE age > 50 AND age < 70; 

हालांकि, समस्या पैदा होती है, तो देखते हैं दो असमानता ऑपरेटरों दो अलग-अलग स्तंभों पर किया जाता है।

तो, क्या करना है?

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

मेरी सलाह नहीं है?

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

ps .: अनुक्रमण AGE (समाधान के साथ) मेरी किताब में एक exercise था - विशेष रूप क्योंकि भंडारण AGE एक बुरी बात है, आप के बजाय जन्म तिथि की दुकान चाहिए।

+0

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

+0

हाय, मुझे लगता है कि यह बॉक्स मेरे उत्तर के लिए बहुत छोटा होगा, इसलिए मैंने ऊपर 'थोड़ा सा' संपादित किया है। –

+0

इस तरह के साफ स्पष्टीकरण के लिए धन्यवाद मार्कस। मुझे अब प्रबुद्ध महसूस होता है :) – ZeNo

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