2009-09-18 21 views
21

क्या आपको ओरेकल डेटाबेस में फ़ील्ड द्वारा समूह के फ़ील्ड के लिए एक अनुक्रमणिका बनाने की आवश्यकता है?समूह द्वारा फ़ील्ड के लिए इंडेक्स बनाना?

उदाहरण के लिए:

select * 
from some_table 
where field_one is not null and field_two = ? 
group by field_three, field_four, field_five 

मैं अनुक्रमित मैं ऊपर और इस क्वेरी के लिए ही प्रासंगिक सूचकांक के लिए बनाया का परीक्षण किया गया था field_two के लिए बनाई गई एक सूची है। अन्य किसी भी फ़ील्ड पर बनाए गए अन्य सिंगल-फील्ड या समग्र इंडेक्स का उपयोग उपरोक्त क्वेरी के लिए नहीं किया जाएगा। क्या यह सही है?

उत्तर

11

यह सही हो सकता है, लेकिन यह इस बात पर निर्भर करेगा कि आपके पास कितना डेटा है। आम तौर पर मैं उन ग्रुप के लिए एक इंडेक्स तैयार करता हूं जो मैं ग्रुप बाय में उपयोग कर रहा था, लेकिन आपके मामले में ऑप्टिमाइज़र ने फैसला किया होगा कि field_two इंडेक्स का उपयोग करने के बाद ग्रुप के लिए अन्य इंडेक्स का उपयोग करके उचित डेटा वापस नहीं किया जाएगा द्वारा।

+1

+1 ऑप्टिमाइज़र का उल्लेख करने के लिए, शायद यह संभवतः इसका सबसे संभावित कारण है। –

+0

प्रतिक्रिया के लिए धन्यवाद। मुझे एहसास नहीं हुआ कि व्याख्या योजना तालिका में डेटा की मात्रा पर निर्भर है। वर्तमान में तालिका में कोई डेटा नहीं है, जो बताता है कि क्यों ऑप्टिमाइज़र अन्य इंडेक्स को छोड़ सकता है। एक और नोट पर, फ़ील्ड_फ्री के बिना फ़ील्ड_थ्री और field_four पर एक समग्र इंडेक्स अभी भी उपरोक्त की तरह क्वेरी में उपयोग किया जाएगा? इसमें क्लॉज द्वारा समूह के सभी फ़ील्ड शामिल नहीं होंगे। – onejigtwojig

+0

@ मार्क - जो इसे समझाता है। समूह के लिए ओरेकल द्वारा उपयोग किए जाने वाले इंडेक्स के बारे में अधिक जानकारी के लिए मेरे संपादन देखें। –

7

नहीं, यह गलत हो सकता है।

यदि आपके पास बड़ी तालिका है, तो Oracle तालिका से बजाय इंडेक्स से फ़ील्ड प्राप्त करना पसंद कर सकता है, यहां तक ​​कि कोई भी इंडेक्स नहीं है जो सभी मानों को कवर करता है।

अपने ब्लॉग में नवीनतम लेख में:

, वहाँ एक प्रश्न है, जिसमें Oracle पूर्ण तालिका स्कैन का उपयोग नहीं होता है बल्कि एक के इंडेक्स में शामिल स्तंभ मान प्राप्त करने के लिए है:

SELECT l.id, l.value 
FROM t_left l 
WHERE NOT EXISTS 
     (
     SELECT value 
     FROM t_right r 
     WHERE r.value = l.value 
     ) 

योजना है:

SELECT STATEMENT 
HASH JOIN ANTI 
    VIEW , 20090917_anti.index$_join$_001 
    HASH JOIN 
    INDEX FAST FULL SCAN, 20090917_anti.PK_LEFT_ID 
    INDEX FAST FULL SCAN, 20090917_anti.IX_LEFT_VALUE 
    INDEX FAST FULL SCAN, 20090917_anti.IX_RIGHT_VALUE 

जैसा कि आप देख सकते हैं, t_left पर कोई TABLE SCAN नहीं है।

इसके बजाय, Oracleid और value सूचक ले जाता है, उन्हें rowid पर जुड़ जाता है और शामिल होने के परिणाम से (id, value) जोड़े हो जाता है।

अब, आपकी क्वेरी के लिए:

SELECT * 
FROM some_table 
WHERE field_one is not null and field_two = ? 
GROUP BY 
     field_three, field_four, field_five 

सबसे पहले, यह संकलन नहीं होगा, जब से तुम एक GROUP BY खंड के साथ एक मेज से * चुन रहे हैं।

आपको समूह कॉलम और गैर-समूह कॉलम के समेकन के आधार पर * को अभिव्यक्तियों के साथ प्रतिस्थापित करने की आवश्यकता है। ,

CREATE INDEX ix_sometable_23451 ON some_table (field_two, field_three, field_four, field_five, field_one) 

के बाद से यह field_two पर दोनों को छानने के लिए सब कुछ शामिल होंगे, field_three, field_four, field_five (GROUP BY के लिए उपयोगी) पर छंटाई और सुनिश्चित करते हुए कि field_oneNOT NULL है:

आप सबसे शायद निम्नलिखित सूचकांक से लाभ होगा।

+1

बहुत रोचक - मुझे नहीं लगता कि मैंने कभी पहले देखा है (जहां ओरेकल दो इंडेक्स में शामिल होगा और पूरी तरह से टेबल से बच जाएगा) –

+0

'@Eric पेट्रोलेजे ': इस विधि को बल देने के लिए एक विशेष संकेत' INDEX_JOIN' है । – Quassnoi

2

क्या आपको ओरेकल डेटाबेस में फ़ील्ड द्वारा समूह के फ़ील्ड के लिए एक अनुक्रमणिका बनाने की आवश्यकता है?

नहीं। आपको इस बात की आवश्यकता नहीं है कि कोई प्रश्न किसी भी इंडेक्स मौजूद है या नहीं, इस पर ध्यान दिए बिना। क्वेरी प्रदर्शन में सुधार के लिए इंडेक्स प्रदान किए जाते हैं।

हालांकि, यह मदद कर सकता है; लेकिन डेटाबेस पर नई इंडेक्स के संभावित प्रभाव के बारे में सोचने के बिना, मैं एक प्रश्न में मदद करने के लिए सिर्फ एक इंडेक्स जोड़ने में संकोच करूंगा।

... इस क्वेरी के लिए एकमात्र प्रासंगिक अनुक्रमणिका फ़ील्ड_टवो के लिए बनाई गई एक अनुक्रमणिका है। अन्य किसी भी फ़ील्ड पर बनाए गए अन्य सिंगल-फील्ड या समग्र इंडेक्स का उपयोग उपरोक्त क्वेरी के लिए नहीं किया जाएगा। क्या यह सही है?

हमेशा नहीं। प्रायः ग्रुप बाय को ओरेकल को एक प्रकार का प्रदर्शन करने की आवश्यकता होगी (लेकिन हमेशा नहीं); और आप क्रमबद्ध करने के लिए कॉलम (ओं) पर एक उपयुक्त अनुक्रमणिका प्रदान करके सॉर्ट ऑपरेशन को खत्म कर सकते हैं।

चाहे आपको वास्तव में ग्रुप बाय प्रदर्शन के बारे में चिंता करने की ज़रूरत है, हालांकि, आपके बारे में सोचने के लिए एक महत्वपूर्ण सवाल है।

+0

अपवोट "सॉर्ट ऑपरेशन को खत्म कर सकता है .."। बीटीडब्ल्यू इस आलेख में अधिक जानकारी है http://use-the-index-luke.com/sql/sorting-grouping/indexed-group-by – waltersu

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