2012-05-04 10 views
9

मैं एक मेज ब्ला (अक्षांश नाव, देशांतर नाव, create_time तारीख, OWNER_ID पूर्णांक, .....)ओरेकल समग्र सूचकांक

था और मेरे कोड केवल एक क्वेरी करता

select * 
from Blah 
where latitude < l1 and latitude > l2 
and longitude < ll1 and longitude > ll2 
and create_time < t1 and create_time > t2 
and owner_id < o1 and owner_id > o2 ; 

मेरे सवाल का मैं सूचकांक किस तरह बनाना चाहिए है (निश्चित रूप से मूल्यों एल 1, एल 2, .... O1, O2 गतिशील कार्यक्रम से आ रही पैरामीटर हैं); संयुक्त सूचकांक? समग्र सूचकांक के मामले में , मुझे किस कॉलम को पहले रखना चाहिए? सूचकांक कितना प्रभावी है?

मैंने इस बारे में लंबे समय तक सोचा, और ओरेकल इंडेक्स कैसे काम करता है इस पर विस्तृत दस्तावेज़ नहीं मिला।

मैं अपने मामले में बी-पेड़ का उपयोग करके लागू किए गए दस्तावेज़ों को पा सकता हूं: बी-पेड़ में प्रत्येक कुंजी एक 4-टुपल है: (कॉलम 1, कॉलम 2, कॉलम 3, कॉलम 4) जहां ऐसे टुपल्स का ऑर्डरिंग रिलेशनशिप है व्याख्यात्मक क्रम के रूप में परिभाषित किया गया है।

फिर उपर्युक्त क्वेरी के लिए, हमारा ऑर्डर मानना ​​है (owner_id, create_time, अक्षांश, देशांतर), मुझे लगता है कि ऑरैकल को इस ऑपरेशन के लिए पहले बिंदु (ओ 1, टी 1, एल 1, ll1) में बाइनरी खोज की आवश्यकता होगी , सूचकांक वास्तव में उपयोगी है। लेकिन अगले, हमें इस पहले अंतरिम के अंतिम बिंदु को खोजने की आवश्यकता है: हमें (ओ 1, टी 1, एल 1, ll2) खोजने की जरूरत है, यह बाइनरी खोज द्वारा भी किया जा सकता है।

अगला, हमें अगले अनुभाग को खोजने की आवश्यकता है जो इस शर्त को पूरा करता है, इसलिए हमें खोजने की आवश्यकता है (ओ 1, टी 1, एलएक्स, ll1) जहां एलएक्स एल 1 से बड़ा मूल्य है, हम इसे बाइनरी खोज से पा सकते हैं भी। लेकिन हमारे मामले में, यह बहुत ही संभावना है कि उसी अक्षांश के लिए, 1 से अधिक रेखांश, नहीं हो सकता है, इसलिए यहां बाइनरी खोज रैखिक स्कैन से अधिक प्रभावी नहीं है।

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

यह स्पष्ट करने के लिए, यहाँ एक सरल उदाहरण है:

मान लीजिए कि मैं 2 कॉलम, एक्स, वाई और

DB में है, दोनों के लिए मूल्यों हैं [1,2, ... .100], तो हम 100x100 पंक्तियों

है

मेरी क्वेरी

select * from mytable where X > 34 and X < 78 and Y > 12 and Y < 15; 

कहना हमारे सूचकांक पर (एक्स, वाई) है है, इसलिए 2 मूल्यों के बीच तुलना शासन

हैं
v1 < v2 <=====> v1.x < v2.x || v1.x == v2.x && v1.y < v2.y 

ऊपर आदेश शासन को देखते हुए, हम देख सकते हैं कि सूचकांक में मूल्यों (एक्स के लिए मान, y) की तरह धारावाहिक में व्यवस्थित कर रहे हैं:

1,1, 1,2 1,3 .... 1,100  
2,1 2,2 2,3 ......2,100 
..... 
100,1 100,2 ....... 100,100 
अब

, में मूल्यों के लिए खोज करने के लिए क्वेरी, बी-ट्री ट्रैवर्सल को की आवश्यकता है (78-34-1) अंतराल, इसलिए (78-34-1) * 2 लुकअप (अंत स्थानों के लिए 1), केवल 2 लुकअप नहीं।

इसलिए यदि हम उच्च आयामों है, अंतराल बढ़ जाती है तेजी से आयाम की संख्या के साथ गिना जाता है, तो अनुक्रमण अब उपयोगी नहीं हो सकता है ------ यह मेरी चिंता का विषय है

बहुत बहुत शुक्रिया यांग

उत्तर

9

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

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

3

सबसे पहले, ध्यान रखें कि "बी-ट्री" में "बी" "बाइनरी" नहीं है।

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

  1. आप एक उद्यम संस्करण लाइसेंस
  2. है आप समवर्ती तालिका
  3. संशोधित कई सत्रों की जरूरत नहीं है
  4. आपका अनुक्रमित मान अनन्य होने के करीब (बयान है कि बिटमैप अनुक्रमणिका प्रयोग करने योग्य के लिए ही कम प्रमुखता कॉलम आम तौर पर अतिरंजित कर रहे हैं) नहीं हैं

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

+0

धन्यवाद, लेकिन अभी मैं केवल बी-पेड़ सूचकांक की समस्या से चिंतित हूं; यद्यपि अभ्यास में ओरेकल बिटमैप इंडेक्स का अच्छी तरह से उपयोग कर सकता है, जैसा कि आपने बताया था –

0

क्या यह तालिका OLTP या DWH के लिए उपयोग की जाती है? यदि आपके पास इस तालिका पर कई एकल पंक्ति/बहुप्रचारित डीएमएल स्टेटमेंट नहीं हैं तो आप बिटमैप इंडेक्स का उपयोग कर सकते हैं। बिटमैप इंडेक्स आपको कई इंडेक्स (उर्फ स्टार ट्रांसफॉर्मेशन) के बीच ROWID और ऑपरेटरों की अनुमति देता है। ऐसा करने के लिए प्रत्येक कॉलम पर बिटमैप इंडेक्स बनाएं। जैसा कि मैंने कहा है कि यह समाधान डीडब्ल्यूएच सिस्टम के लिए सबसे अच्छा फिट बैठता है जहां आपके पास एक बैच डालने वाला है।

0

मानक बी-पेड़ इंडेक्स के बाहर बहुआयामी रेंज प्रश्नों को सबसे अच्छा संभाला जाता है, आईएमएचओ। सामान्य विषय पर कुछ कागजात "बहुआयामी सीमा प्रश्नों" पर एक वेब खोज द्वारा पाया जा सकता है।

ओरेकल ओरेकल स्पेटियल नामक एक उत्पाद प्रदान करता है। इस उत्पाद के लिए दस्तावेज़ में Chapter 4, स्थानिक इंडेक्स बनाने और निष्पादित प्रश्न बनाने के उदाहरण और स्पष्टीकरण शामिल हैं। कोई नया एसक्यूएल वाक्यविन्यास नहीं है; इंडेक्स निर्माण के लिए उनका उदाहरण है:

CREATE INDEX territory_idx ON territories (territory_geom) 
    INDEXTYPE IS MDSYS.SPATIAL_INDEX; 

जो आर-पेड़ सूचकांक बनाता है।

मुझे लगता है कि आर-पेड़, केडीबी-पेड़ और इसी तरह के स्थानिक संरचनाओं का अस्तित्व इस तथ्य के सबूत है कि मानक बी-पेड़ शायद इस तरह के अनुप्रयोगों के लिए उपयुक्त नहीं हैं।

1

एक आसान ब्रूट-फोर्स समाधान एक ही टेबल पर एकाधिक इंडेक्स संयोजन बनाने के लिए है, EXPLAIN PLAN के साथ क्वेरी चलाएं, फिर उस सूचकांक का चयन करें जो आपका डीबीएमएस उपयोग करना पसंद करता है।

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