क्या गुच्छेदार अनुक्रमों को अद्वितीय होना चाहिए?


84

अगर एक क्लस्टर इंडेक्स अद्वितीय नहीं है तो क्या होगा? क्या यह खराब प्रदर्शन का कारण बन सकता है क्योंकि सम्मिलित पंक्तियाँ किसी प्रकार के "अतिप्रवाह" पृष्ठ पर प्रवाहित होती हैं?

क्या यह "बनाया" अद्वितीय है और यदि ऐसा है तो कैसे? इसे अद्वितीय बनाने का सबसे अच्छा तरीका क्या है?

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

धन्यवाद!

जवाबों:


92

वे अद्वितीय होने की जरूरत नहीं है, लेकिन यह निश्चित रूप से प्रोत्साहित किया जाता है।
मुझे अभी तक एक परिदृश्य का सामना नहीं करना पड़ा है जहाँ मैं एक गैर-अद्वितीय स्तंभ पर CI बनाना चाहता था।

यदि आप एक गैर-अद्वितीय स्तंभ पर CI बनाते हैं तो क्या होता है

यदि क्लस्टर किए गए अनुक्रमणिका कोई अनन्य अनुक्रमणिका नहीं है, तो SQL सर्वर किसी भी डुप्लिकेट कुंजी को एक अद्वितीय रूप से उत्पन्न मान जोड़कर अद्वितीय बना देता है जिसे एक यूनीफ़ायर कहा जाता है

क्या इससे खराब प्रदर्शन होता है?

एक यूनीकफ़ायर जोड़ना निश्चित रूप से गणना करने और इसे संग्रहीत करने में कुछ ओवरहेड जोड़ता है।
यदि यह ओवरहेड ध्यान देने योग्य होगा, तो कई कारकों पर निर्भर करता है।

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


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


31
+1 का कारण जो आप कहते हैं वह सब कुछ सही है, लेकिन बस जोड़ना चाहता था: विशेष-गैर-विशिष्ट श्रेणी पर स्कैन स्कैन करते समय गैर-विशिष्ट CI काफी सामान्य हैं जो प्रचलित एक्सेस पैटर्न है।
रेमस रूसु

@ रेमसु रसानु: मैं अपने परिदृश्य विवरण जैसे अस्वीकरण को जोड़ने के बारे में सोच रहा था लेकिन इसका कोई मतलब नहीं है । एक परिदृश्य को इंगित करने के लिए धन्यवाद जहां यह उपयोगी हो सकता है।
लेवेन कीर्सेमेकर्स

4
@Remus: तो आप का मतलब उस आला स्थिति से है जहाँ आपके पास 'विभागीय' जैसा एक गैर-अनूठा कॉलम है जहाँ आप 'DepartmentId BETWEEN 1 और 100' जैसी किसी चीज़ की क्वेरी करते हैं? मुझे लगता है कि तुम क्या मतलब है संपादित देखें, हाँ एक लॉगिंग टेबल में एक तारीख स्तंभ एक अच्छा उदाहरण भी है।
अल्पना डिक

अरे, मुझे एक इवेंट स्ट्रीम टेबल मिल गया है जहाँ एक ही "AggregateId" के साथ कई पंक्तियाँ मौजूद हैं जो GUID टाइप करने के लिए एक कॉलम है। तालिका पर किए गए एकमात्र प्रश्न किसी दिए गए AggregateId के लिए सभी घटनाओं को प्राप्त करना है। मैं सोच रहा हूँ कि यह एक संकुल सूचकांक या एक गैर संकुल सूचकांक होना चाहिए?
शायन सी

@ShayanC - यदि रिट्रीवल का प्रदर्शन आपका प्राथमिक लक्ष्य है, तो मैं किसी सीआई को दिए गए आईडी के लिए सभी पंक्तियों को पुनः प्राप्त करते समय संभावित रूप से IO को बचाने के लिए इसे CI बनाऊंगा। हालांकि सभी प्रदर्शन परिदृश्यों के साथ, एकमात्र निश्चित तरीका उपाय है।
लेवेन कीर्सेमेकर्स

32

मैं इस बात की जाँच करना पसंद करता हूं कि किस विषय की महारानी, ​​किम्बर्ली ट्रिप को विषय पर कहना है:

मैं कारणों की एक जोड़ी के लिए क्लस्टरिंग कुंजी के लिए अपनी सिफारिश के साथ शुरू करने जा रहा हूं। पहला, यह एक आसान निर्णय है और दूसरा, यह निर्णय जल्दी करने से कुछ प्रकार के विखंडन को रोकने में मदद मिलती है। यदि आप कुछ प्रकार के बेस-टेबल विखंडन को रोक सकते हैं तो आप कुछ रखरखाव गतिविधियों को कम कर सकते हैं (जिनमें से कुछ, SQL Server 2000 में और इससे भी कम, SQL Server 2005 में) की आवश्यकता है कि आपकी तालिका ऑफ़लाइन हो। ठीक है, मैं बाद में सामान को फिर से बना दूंगा ....।

आइए उन प्रमुख चीजों से शुरू करें जिन्हें मैं एक क्लस्टरिंग कुंजी में देखता हूं:

* Unique
* Narrow
* Static

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

स्रोत: कभी-कभी बढ़ती हुई प्रमुख बहस - फिर से!


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

2
@ लिटलग्रीन: वह कहती है कि यदि आप GUID का उपयोग करने पर जोर देते हैं (जो कि वास्तव में क्लस्टरिंग इंडेक्स में उपयोग के लिए वास्तव में खराब हैं), तो कम से कम newsequentialid()एक लगभग अनुक्रमिक GUID प्राप्त करने के लिए उपयोग करें। लेकिन हाँ: यदि आप अपनी खुद की यूनिक आईडी (मैं हमेशा INT IDENTITY पसंद करते हैं) जोड़ते हैं, तो आपके पास वह मूल्य हाथ में है, और आप इसका उपयोग कर सकते हैं (जैसे FK संबंध स्थापित करने के लिए)। SQL सर्वर जोड़ा हुआ यूनिकफायर आपके लिए अदृश्य है और इस प्रकार वे केवल ओवरहेड हैं जिसका आप उपयोग नहीं कर सकते।
marc_s

समझा। ठीक है कि एक तर्क के पक्ष में होगा (CompanyID, DepartmentID, आईडी INT पहचान) क्लस्टर सूचकांक केवल पहले दो के बजाय। धन्यवाद!
littlegreen

1
@littlegreen: बेहतर अभी तक - केवल (आईडी INT पहचान) पर अपना क्लस्टर इंडेक्स बनाएं और अन्य फ़ील्ड्स - यदि आवश्यक हो - एक अलग, गैर-क्लस्टर इंडेक्स में। क्लस्टर किए गए इंडेक्स जितना संभव हो उतना छोटा होना चाहिए - आखिरकार, उस टेबल पर प्रत्येक और प्रत्येक गैर-क्लस्टर किए गए इंडेक्स की प्रत्येक प्रविष्टि में क्लस्टर किए गए इंडेक्स कॉलम जोड़े जा रहे हैं, इसलिए - एक विस्तृत क्लस्टर के साथ अपने बाइट्स को बर्बाद न करें। सूचकांक!
marc_s

1
हां, लेकिन फिर मैं अपने सभी विभाग के डेटा को समूहीकृत होने का लाभ खो देता हूं, और मुझे एक बार में एक पूरे विभाग को सम्मिलित करने / हटाने / पुनः प्राप्त करने में सक्षम होता है। मेरा डेटा बिखरा हुआ हो जाएगा और पूरे विभागों या यहां तक ​​कि संपूर्ण कंपनियों पर आवेषण / हटाए जाएंगे। मेरे प्रश्न केवल एक ही बार में एक ही कंपनी पर चलते हैं और अक्सर पूरे डेटासेट को अद्यतन करने की आवश्यकता होती है।
littlegreen

9

क्या गुच्छेदार अनुक्रमों को अद्वितीय होना चाहिए?

वे नहीं करते हैं, और कई बार ऐसा होता है जहां वे बेहतर नहीं होते हैं।

एक अर्द्ध यादृच्छिक, अद्वितीय कर्मचारी और प्रत्येक कर्मचारी के लिए एक विभागीय तालिका के साथ विचार करें: यदि आपका चयन कथन है

SELECT * FROM EmployeeTable WHERE DepartmentId=%DepartmentValue%

तो यह प्रदर्शन के लिए सबसे अच्छा है अगर DepartmentId क्लस्टर इंडेक्स है (भले ही या विशेष रूप से क्योंकि) यह अद्वितीय सूचकांक नहीं है (प्रदर्शन के लिए सबसे अच्छा है क्योंकि यह सुनिश्चित करता है कि किसी दिए गए विभाग के भीतर सभी रिकॉर्ड क्लस्टर किए गए हैं)।


क्या आपके पास कोई संदर्भ है?

इसमें क्लस्टर इंडेक्स डिज़ाइन दिशानिर्देश हैं उदाहरण के लिए, जो कहते हैं,

कुछ अपवादों के साथ, हर तालिका में स्तंभ, या स्तंभ पर परिभाषित एक अनुक्रमणिका सूचकांक होना चाहिए, जो निम्नलिखित प्रदान करता है:

  • अक्सर इस्तेमाल किए जाने वाले प्रश्नों के लिए इस्तेमाल किया जा सकता है।
  • उच्च स्तर की विशिष्टता प्रदान करें।
  • श्रेणी के प्रश्नों में उपयोग किया जा सकता है।

उदाहरण के लिए "उच्च डिग्री की विशिष्टता" के बारे में मेरी समझ यह है कि "देश" को संकुलित सूचकांक के रूप में चुनना अच्छा नहीं है यदि आपके अधिकांश प्रश्न किसी दिए गए शहर के भीतर रिकॉर्ड का चयन करना चाहते हैं।


हाँ, यही मैंने अब तक सोचा था, लेकिन मुझे ठीक विपरीत सलाह भी मिलती है, इसलिए मुझे आश्चर्य है कि यह सच है। क्या आपके पास कोई संदर्भ है?
छोटाग्र

@littlegreen मैंने आपके प्रश्न का उत्तर देने के लिए अपना उत्तर संपादित किया।
क्रिसडब्ल्यू डी

धन्यवाद। हाँ ठीक है, मैं आपकी बात देख रहा हूँ। लेकिन अगर आप नियमित रूप से एक बार में पूरे देश को सम्मिलित कर रहे हैं, तो (देश, शहर) पर एक अनुक्रमणिका सूचकांक मेरे लिए बोझिल प्रतीत होगा क्योंकि इसके लिए डेटा को क्रमबद्ध करने की आवश्यकता होती है। दूसरी ओर, डालने से पहले एक तरह से परेशानी का इतना नहीं होगा ...
littlegreen

3
निश्चित रूप से आपके उदाहरण में, {DepartmentID, EmployeeID} पर एक अद्वितीय क्लस्टर इंडेक्स बेहतर होगा? जब आपके मौजूदा क्षेत्र में कम ओवरहेड (संभवत: चार-बाइट INT) के साथ विशिष्टता प्रदान की जाएगी, तो आप एक अद्वितीय पहचान क्यों बना सकते हैं और क्या आप अकेले सूचकांक के भीतर कुछ और प्रश्न चला सकते हैं?
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.