मल्टी-इंडेक्स बनाम मल्टी-कॉलम इंडेक्स


645

मैं सिर्फ SQL Server 2005 में एक तालिका में एक सूचकांक जोड़ रहा हूं और यह मुझे सोच रहा है। 1 अनुक्रमणिका बनाने और आप अनुक्रमणिका के लिए प्रति स्तंभ 1 अनुक्रमणिका पर कई स्तंभों को परिभाषित करने के बीच क्या अंतर है।

क्या कुछ कारण हैं कि एक का दूसरे पर प्रयोग क्यों किया जाना चाहिए?

उदाहरण के लिए

Create NonClustered Index IX_IndexName On TableName
(Column1 Asc, Column2 Asc, Column3 Asc)

बनाम

Create NonClustered Index IX_IndexName1 On TableName
(Column1 Asc)

Create NonClustered Index IX_IndexName2 On TableName
(Column2 Asc)

Create NonClustered Index IX_IndexName3 On TableName
(Column3 Asc)

जवाबों:


319

मैं कैड रॉक्स से सहमत हूं ।

यह लेख आपको सही रास्ते पर लाना चाहिए:

ध्यान देने वाली एक बात, क्लस्टर किए गए इंडेक्स में पहले कॉलम के रूप में एक अद्वितीय कुंजी (एक पहचान कॉलम जिसे मैं सुझाऊंगा) होना चाहिए। मूल रूप से यह आपके डेटा को इंडेक्स के अंत में सम्मिलित करने में मदद करता है और बहुत सारे डिस्क IO और पेज विभाजन का कारण नहीं बनता है।

दूसरे, यदि आप अपने डेटा पर अन्य इंडेक्स बना रहे हैं और उनका निर्माण चतुराई से किया जाता है तो उनका पुन: उपयोग किया जाएगा।

उदाहरण के लिए, आप तीन स्तंभों पर एक तालिका खोजते हैं

राज्य, काउंटी, ज़िप

  • आप कभी-कभी केवल राज्य द्वारा खोजते हैं।
  • आप कभी-कभी राज्य और काउंटी द्वारा खोज करते हैं।
  • आप अक्सर राज्य, काउंटी, ज़िप द्वारा खोज करते हैं।

फिर राज्य, काउंटी, ज़िप के साथ एक सूचकांक। इन तीनों खोजों में उपयोग किया जाएगा।

यदि आप अकेले ज़िप द्वारा बहुत खोज करते हैं तो उपरोक्त सूचकांक (SQL सर्वर द्वारा) वैसे भी उपयोग नहीं किया जाएगा क्योंकि ज़िप उस सूचकांक का तीसरा हिस्सा है और क्वेरी ऑप्टिमाइज़र उस सूचकांक को सहायक के रूप में नहीं देखेगा।

फिर आप अकेले जिप पर एक इंडेक्स बना सकते हैं जो इस उदाहरण में उपयोग किया जाएगा।

वैसे हम इस तथ्य का लाभ उठा सकते हैं कि मल्टी-कॉलम कॉलम के साथ पहला इंडेक्स कॉलम हमेशा खोज के लिए प्रयोग करने योग्य होता है और जब आप केवल 'राज्य' द्वारा खोजते हैं तो यह कुशल है लेकिन फिर भी 'स्टेट' पर सिंगल-कॉलम इंडेक्स जितना कुशल नहीं है '

मुझे लगता है कि आप जिस उत्तर की तलाश कर रहे हैं, वह यह है कि यह आपके उस पर निर्भर करता है जहां आपके अक्सर उपयोग किए जाने वाले प्रश्नों के खंड और आपके समूह द्वारा भी।

लेख बहुत मदद करेगा। :-)


2
तो प्रत्येक स्तंभ के लिए एक इंडेक्स के अलावा राज्य, काउंटी और ज़िप के लिए एक इंडेक्स को परिभाषित करना सबसे अच्छी बात होगी?
मैक्सिम ज़स्लावस्की

12
@jball क्या मैं यहाँ कुछ याद कर रहा हूँ? ऐसा लगता है कि लेख SQL सर्वर संस्करण सीमाओं के बीच अंतर के बारे में है। क्या लेख को स्थानांतरित किया जा सकता था?
इयान आर। ओ'ब्रायन

@ अगर ऐसा लगता है कि कुछ जल्द ही 3 साल में खो गया है क्योंकि मैंने 4 साल पहले से मूल लिंक को सुलझा लिया है। मैं आपको बता सकता हूं कि ब्लॉग पोस्ट में सही शीर्षक है जैसा कि ब्रेडहोम द्वारा जोड़ा गया था, लेकिन ऐसा लगता है कि श्रृंखला में फॉलोअप ब्लॉग अब उस पहली पोस्ट से आसानी से खोजे जाने योग्य नहीं हैं। आपको यह देखने के लिए किम्बर्ली के ब्लॉग संग्रह पर जाना होगा, ताकि आप श्रृंखला में अन्य लोगों को बदल सकें।
22

1
1) "मूल रूप से [पहले के रूप में पहचान पत्र के साथ क्लस्टर] सूचकांक आपके डेटा को सूचकांक के अंत में सम्मिलित करने में मदद करता है" सही है। "और बहुत सारे डिस्क IO और पृष्ठ विभाजन का कारण नहीं है" एक बहु-उपयोगकर्ता प्रणाली में पूरी तरह से गलत है। सच्चाई यह है कि, यह बहु-उपयोगकर्ता प्रणाली में उच्च विवाद (कम संगामिति) की गारंटी देता है। 2) क्लस्टर इंडेक्स एक रिलेशनल की यानी होना चाहिए। नहीं एक IDENTITY, GUID, etc। 3) "फिर राज्य, काउंटी, ज़िप के साथ एक सूचकांक इन तीनों खोजों में उपयोग किया जाएगा।" गलत है, और विरोधाभासी "पहला स्तंभ प्रयोग करने योग्य है"। अनुक्रमणिका में 2nd और सबस कॉल खोज के लिए उपयोग करने योग्य नहीं हैं।
प्रदर्शन

82

हाँ। मैं आपको इंडेक्सिंग पर किम्बर्ली ट्रिप के लेखों की जांच करने की सलाह देता हूं ।

यदि एक इंडेक्स "कवरिंग" है, तो इंडेक्स के अलावा कुछ भी उपयोग करने की आवश्यकता नहीं है। SQL Server 2005 में, आप अनुक्रमणिका में अतिरिक्त कॉलम भी जोड़ सकते हैं जो उस कुंजी का हिस्सा नहीं है जो बाकी पंक्ति की यात्राओं को समाप्त कर सकता है।

कई इंडेक्स होने के बाद, प्रत्येक कॉलम पर प्रत्येक का मतलब हो सकता है कि केवल एक इंडेक्स का उपयोग किया जाता है - आपको निष्पादन योजना का उल्लेख करना होगा कि विभिन्न इंडेक्सिंग योजनाएं क्या प्रभाव दिखाती हैं।

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


7
किम्बर्ली ट्रिप को पता है कि वह किस बारे में बात कर रही है। मैं उसकी एक बात पर था और वह अंदर बाहर इस सामान को जानता है। अच्छी सलाह।
बुराई करने वाला 15

@CadeRoux अगर ज्यादातर बार मेरे क्लॉज़ के 'और' रिलेशनशिप में 2 कॉलम हैं, तो क्या उन पर मल्टी-कॉलम इंडेक्स या उन दोनों पर सिंगल कॉलम इंडेक्स रखना बेहतर होगा
यह एक ट्रैप

2
@ रचितगुप्ता दोनों स्तंभों के साथ एक सूचकांक
केड रूक्स

41

मल्टी-कॉलम इंडेक्स का उपयोग सभी कॉलमों को संदर्भित करने वाले प्रश्नों के लिए किया जा सकता है :

SELECT *
FROM TableName
WHERE Column1=1 AND Column2=2 AND Column3=3

मल्टी-कॉलम इंडेक्स का उपयोग करके इसे सीधे देखा जा सकता है। दूसरी ओर, सिंगल-कॉलम इंडेक्स में से अधिकांश में इस्तेमाल किया जा सकता है (इसमें Column1 = 1 वाले सभी रिकॉर्ड देखने होंगे और फिर प्रत्येक में Column2 और Column3 की जांच करें)।


24
यह सही है। हालाँकि, इन स्तंभों को एक ही सूचकांक के रूप में रखने से प्रत्येक चीज़ नाटकीय रूप से गति करेगी। आमतौर पर स्तंभों में से एक मान परिणामी सेट को इतना कम कर देगा कि यह सूचकांक के बिना बाकी को देखने के लिए मायने नहीं रखता है और अनुकूलक इस मूल्य को लेने में अच्छा है।
टीटोनी

17

एक आइटम जो याद किया गया है, वह स्टार ट्रांसफॉर्मेशन है। इंडेक्स इन्टरसेक्शन ऑपरेटर किसी भी I / O तथ्य तालिका पर किए जाने से पहले प्रत्येक विधेयकों द्वारा हिट की गई पंक्तियों के सेट की गणना करके विधेय को हल करता है। एक स्टार स्कीमा पर आप प्रत्येक व्यक्तिगत आयाम कुंजी को अनुक्रमित करेंगे और क्वेरी ऑप्टिमाइज़र हल कर सकते हैं कि कौन सी पंक्तियों को इंडेक्स चौराहे की गणना द्वारा चुना जाना है। व्यक्तिगत स्तंभों पर अनुक्रमित इसके लिए सबसे अच्छा लचीलापन देते हैं।


+1 (सामान्य) अनुक्रमित के अच्छे उपयोग की व्याख्या के लिए, प्रश्न के लिए प्रासंगिक है।
रॉब

8

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

अपने अनुक्रमणिका में कई कॉलम डालने से, ऑप्टिमाइज़र को केवल तालिका तक सीधे पहुंचना होगा यदि कोई कॉलम अनुक्रमणिका में नहीं है। मैं डेटा वेयरहाउसिंग में इनका बहुत उपयोग करता हूं। नकारात्मक पक्ष यह है कि ऐसा करने से बहुत अधिक ओवरहेड खर्च हो सकता है, खासकर अगर डेटा बहुत अस्थिर है।

ओएलटीपी सिस्टम में अक्सर पाए जाने वाले लुकअप ऑपरेशंस के लिए सिंगल कॉलम पर इंडेक्स बनाना उपयोगी होता है।

आपको अपने आप से पूछना चाहिए कि आप स्तंभों को अनुक्रमित क्यों कर रहे हैं और उनका उपयोग कैसे किया जाएगा। कुछ क्वेरी योजनाएं चलाएं और देखें कि उन्हें कब एक्सेस किया जा रहा है। इंडेक्स ट्यूनिंग विज्ञान के रूप में बहुत सहज है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.