मैं एक मेज ब्ला (अक्षांश नाव, देशांतर नाव, 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 लुकअप नहीं।
इसलिए यदि हम उच्च आयामों है, अंतराल बढ़ जाती है तेजी से आयाम की संख्या के साथ गिना जाता है, तो अनुक्रमण अब उपयोगी नहीं हो सकता है ------ यह मेरी चिंता का विषय है
बहुत बहुत शुक्रिया यांग
धन्यवाद, लेकिन अभी मैं केवल बी-पेड़ सूचकांक की समस्या से चिंतित हूं; यद्यपि अभ्यास में ओरेकल बिटमैप इंडेक्स का अच्छी तरह से उपयोग कर सकता है, जैसा कि आपने बताया था –