2009-10-30 7 views
11

तो मैं अनुक्रमित और उनके कार्यान्वयन पर पढ़ रहा था, और मैं इस वेबसाइट बी पेड़ इंडेक्सों का एक संक्षिप्त विवरण है पर ठोकर खाई:1 से अधिक कॉलम पर बी-पेड़ इंडेक्स कैसा दिखता है?

http://20bits.com/articles/interview-questions-database-indexes/

बी पेड़ सूचकांक अनुक्रमित के लिए एकदम सही समझ में आता है कि केवल एक ही कॉलम पर हैं, लेकिन मान लें कि मैं एकाधिक कॉलम के साथ एक इंडेक्स बना रहा हूं, फिर बी-पेड़ कैसे काम करता है? बी-पेड़ में प्रत्येक नोड का मूल्य क्या है?

उदाहरण के लिए

, अगर मैं इस तालिका है:

table customer: 
id number 
name varchar 
phone_number varchar 
city varchar 

और मैं पर एक सूचकांक बनाने के लिए: (आईडी, नाम, शहर)

और उसके बाद निम्न क्वेरी चलाएँ:

SELECT id, name 
    FROM customer 
WHERE city = 'My City'; 

यह क्वेरी एकाधिक कॉलम अनुक्रमणिका का उपयोग कैसे करती है, या यह तब तक इसका उपयोग नहीं करती जब तक कि अनुक्रमणिका (शहर, आईडी, नाम) या (शहर, नाम, आईडी) के रूप में बनाई गई हो?

उत्तर

7

कल्पना कीजिए कि कुंजी (col1, col2, col3) एक अजगर टपल का प्रतिनिधित्व करती है ... अनुक्रमण आपरेशन tuple_b साथ tuple_a की तुलना शामिल है ... तुम और col1 का जो मूल्य col2 पता नहीं है अगर है कि आप में रुचि रखते हैं, लेकिन केवल col3, तो इसे पूरे सूचकांक ("पूर्ण अनुक्रमणिका स्कैन") को पढ़ना होगा, जो कि उतना कुशल नहीं है।

यदि आपके पास (col1, col2, col3) पर एक अनुक्रमणिका है, तो आप उम्मीद कर सकते हैं कि किसी भी आरडीबीएमएस इंडेक्स (प्रत्यक्ष तरीके से) का उपयोग करेगा जब WHERE क्लॉज में संदर्भ (1) सभी 3 कॉलम (2)) दोनों col1 और col2 (3) केवल col1।

अन्यथा (उदाहरण के लिए WHERE क्लॉज में केवल col3), या तो आरडीबीएमएस उस इंडेक्स का उपयोग नहीं करेगा (उदा। SQLite), या एक पूर्ण इंडेक्स स्कैन (उदा। ओरेकल) [यदि कोई अन्य सूचकांक बेहतर नहीं है] करेगा।

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

+0

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

+0

@ डेविड: धन्यवाद। मैंने अपना जवाब संपादित कर दिया है ताकि किसी को पहले वाक्य पर निर्णय स्थगित करने की आवश्यकता न हो, जब तक कि किसी ने ठीक प्रिंट को आगे नहीं पढ़ा है ;-) –

11

अधिकांश कार्यान्वयन के साथ, कुंजी बस एक लंबी कुंजी है जिसमें विभाजक के साथ सभी महत्वपूर्ण मान शामिल हैं। कोई जादुई ;-)

अपने उदाहरण में कुंजी मान सकता है लगता है कि

 
"123499|John Doe|Conway, NH" 
"32144|Bill Gates| Seattle, WA" 

समग्र कुंजी के साथ इन अनुक्रमित की विशेषताओं में से एक है कि मध्यवर्ती पेड़ नोड्स कुछ मामलों में इस्तेमाल किया जा सकता है क्वेरी को कवर करें।

उदाहरण के लिए यदि प्रश्न आईडी और नाम आईडी को ढूंढना है, क्योंकि आईडी इंडेक्स में पहली बार है, तो सूचकांक इस कुशलता से खोज सकता है। एक बार इंटरमीडिएट नोड में, यह कुंजी से नाम और शहर को "पार्स" कर सकता है, और इसे पढ़ने के लिए पत्ती नोड पर जाने की आवश्यकता नहीं है।

यदि क्वेरी भी फोन नंबर प्रदर्शित करना चाहती है, तो पूर्ण रिकॉर्ड मिलने पर तर्क पत्ते का पालन करेगा।

+0

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

0

कुछ कार्यान्वयन आसानी से स्तंभों के क्रम में मूल्यों को जोड़ते हैं, डीलिमीटर के साथ।

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

यहाँ एक संबंधित सवाल मैं पिछले हफ्ते लिखा है:

Does SQL Server jump leaves when using a composite clustered index?

0

"समग्र कुंजी" तंत्र पहले से ही वर्णित के अलावा, एक संभावना एक kdtree जो एक द्विआधारी पेड़ की तरह काम करता है, लेकिन आप प्रत्येक पार के रूप में स्तर k आयामों के माध्यम से आप चक्र। यही है, पेड़ का पहला स्तर पहले आयाम को दो भागों में विभाजित करता है, दूसरा स्तर दूसरे आयाम को विभाजित करता है, k+1 वें स्तर पहले आयाम को फिर से विभाजित करता है .. यह किसी भी आयाम में डेटा के कुशल विभाजन के लिए अनुमति देता है । यह दृष्टिकोण "स्थानिक" डेटाबेस (उदा।, ओरेकल स्पेटियल, पोस्टजीआईएस, आदि) में आम है, लेकिन शायद "नियमित" बहु-अनुक्रमित तालिकाओं में उपयोगी नहीं है।

http://en.wikipedia.org/wiki/Kd-tree

0

यह (आईडी, नाम, शहर) इंडेक्स का उपयोग करके एक "सिटी =?" विधेय को पूरा करने के कर सकते हैं, लेकिन बहुत बहुत inefficently।

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

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

2

ओरेकल में एक प्रमुख कुंजी इंडेक्स का उपयोग किया जा सकता है भले ही प्रमुख कॉलम फ़िल्टर नहीं किए जाते हैं। यह तीन तंत्र के माध्यम से किया जाता है:

  1. एक तेज़ पूर्ण इंडेक्स स्कैन, जिसमें मल्टीबाल पढ़ता है, पूरे इंडेक्स सेगमेंट को पार करने के लिए उपयोग किया जाता है।
  2. एक सूचकांक पूर्ण स्कैन, जिसमें सूचकांक ब्लॉक के तार्किक क्रम में पढ़ा जाता है (मुझे विश्वास है कि मैंने हाल के संस्करणों में पढ़ा है ओरेकल इसके लिए बहुभाषी पढ़ता है, लेकिन वास्तव में आपको एकल ब्लॉक पढ़ने पर भरोसा करना चाहिए)
  3. एक इंडेक्स स्किप स्कैन, जहां गैर-अनुमानित अग्रणी कॉलम के लिए बहुत कम कार्डिनालिटी ओरेकल को कई इंडेक्स रेंज स्कैन करने की अनुमति देती है, एक अग्रणी स्तंभ (ओं) के प्रत्येक अद्वितीय मूल्य के लिए। ये मेरे अनुभव में बहुत दुर्लभ हैं।

ओरेकल इंडेक्स आंतरिक पर अधिक जानकारी के लिए रिचर्ड फुट या जोनाथन लुईस द्वारा लेखों की तलाश करें।

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