गुच्छेदार बनाम गैर-संकुल


98

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

हमारे पास एक टेबल है जो लोगों के लिए 'कोर्ट ऑर्डर' रखती है। जब मैंने तालिका बनाई, (नाम: कोर्टऑर्डर), मैंने इसे इस तरह बनाया:

CREATE TABLE dbo.CourtOrder
(
  CourtOrderID INT NOT NULL IDENTITY(1,1), (Primary Key)
  PersonId INT NOT NULL,
  + around 20 other fields of different types.
)

मैंने तब प्राथमिक कुंजी (दक्षता के लिए) में एक गैर-संकुल सूचकांक लागू किया था। मेरे कारण यह है कि यह एक अद्वितीय क्षेत्र (प्राथमिक कुंजी) है, और इसे अनुक्रमित किया जाना चाहिए, मुख्य रूप से चयन उद्देश्यों के लिए, जैसा कि हम अक्सर करते हैंSelect from table where primary key = ...

मैंने तब PersonId पर CLUSTERED इंडेक्स लागू किया। इसका कारण शारीरिक रूप से किसी व्यक्ति विशेष के लिए आदेशों का समूह था, क्योंकि किसी व्यक्ति के लिए काम का अधिकांश हिस्सा आदेश प्राप्त कर रहा है। इसलिए,select from mytable where personId = ...

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

मुझे बताया जा रहा है कि मैंने एक गलती की है, उनका मानना ​​है कि वे व्यक्तिगत सूचकांक पर एक सम्मिलित सूचकांक डालने से आवेषण को धीमा कर देंगे। एक चयन की गति में 5% लाभ के लिए, हमें आवेषण और अद्यतनों पर गति में 95% की गिरावट होगी। क्या यह सही और वैध है?

वे कहते हैं कि क्योंकि हम personId को क्लस्टर करते हैं, SQL सर्वर को डेटा को फिर से व्यवस्थित करना होता है जब हम कभी-कभी सम्मिलित करते हैं या व्यक्तिवाद में बदलाव करते हैं।

तो फिर मैंने पूछा है, कि SQL को CLUSTERED INDEX की अवधारणा क्यों होगी, अगर यह इतना धीमा है? क्या यह उतना धीमा है जितना वे कह रहे हैं? मुझे इष्टतम प्रदर्शन प्राप्त करने के लिए अपने अनुक्रमित को कैसे सेटअप करना चाहिए? मैंने सोचा होगा चयन का उपयोग INSERT से अधिक किया जाता है ... लेकिन वे कहते हैं कि हम INSERTS पर मुद्दों को लॉक कर रहे हैं ...

उम्मीद है कि कोई मेरी मदद करे।


जवाबों:


117

एक गुच्छेदार बनाम गैर-संकुल सूचकांक के बीच का अंतर यह है कि संकुल सूचकांक डेटाबेस में पंक्तियों के भौतिक क्रम को निर्धारित करता है । दूसरे शब्दों में, क्लस्टर किए गए इंडेक्स को लागू करने का PersonIdमतलब है कि पंक्तियों को PersonIdतालिका में भौतिक रूप से सॉर्ट किया जाएगा , इस पर एक इंडेक्स खोज को सीधे पंक्ति (एक गैर-क्लस्टर इंडेक्स के बजाय) पर जाने की अनुमति मिलती है, जो आपको पंक्ति में निर्देशित करेगी स्थान, एक अतिरिक्त कदम जोड़ने)।

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

केवल एक चीज जो मैं सुझाऊंगा, वह सरोगेट कुंजी (आपके ) कॉलम को प्राथमिक कुंजी के रूप में उपयोग नहीं कर रही है CourtOrderId, बल्कि इसके स्थान पर एक यौगिक प्राथमिक कुंजी का PersonIdऔर कुछ अन्य विशिष्ट रूप से पहचानने वाले कॉलम या कॉलम के सेट का उपयोग करना है। यदि यह संभव नहीं है (या व्यावहारिक नहीं है), फिर भी, क्लस्टर किए गए इंडेक्स को डालें CourtOrderId


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

3
यह शारीरिक रूप से हल नहीं है PersonId। यह तार्किक रूप से क्रमबद्ध है PersonId, तार्किक और भौतिक क्रम के बीच कोई भी विसंगति तार्किक विखंडन की डिग्री है।
मार्टिन स्मिथ

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

1
@CyberSluethOmega: मुझे नहीं पता; आपके प्रश्न में निर्णय लेने के लिए मेरे लिए पर्याप्त जानकारी नहीं है। क्या मैं स्तंभों के एक सेट पर एक संकुल सूचकांक चाहूंगा जहां पंक्तियों को अक्सर तालिका के अंत में जोड़ा या हटाया जाएगा ? नहीं, लेकिन मुझे वास्तव में यकीन नहीं है कि आप ऐसा क्यों पूछ रहे हैं या नीचे क्यों कर रहे हैं।
एडम रॉबिन्सन

1
@CyberSluethOmega: जब वे इस तरह से इरादा नहीं रखते हैं तो इंटरनेट टिप्पणियों को रक्षात्मक या ठंडा बना सकता है। आपने दावा किया कि मैंने कहा था कि मुझे कोई भी परिस्थिति नहीं पता थी, जहां प्राथमिक कुंजी के अलावा क्लस्टर इंडेक्स को कुछ और बनाते हैं, जब वास्तव में मैंने ऐसी कोई बात कही थी। वास्तव में, जो मैंने कहा था "यह असामान्य है ... लेकिन अनसुना नहीं", जिसका अर्थ है कि मुझे उन मामलों का पता है जहां यह किया जाता है।
एडम रॉबिन्सन

14

मैं किसी भी तरह से एक SQL विशेषज्ञ नहीं हूँ ... इसलिए इसे एक DBA दृश्य के बजाय एक डेवलपर के दृष्टिकोण के रूप में लें।

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

मैं मान रहा हूँ कि आपका व्यक्ति-परिवर्तन नहीं होगा, इसलिए अपडेट यहाँ खेलने में नहीं आते हैं। लेकिन 1 2 3 3 4 5 6 7 8 8 के PersonId के साथ कुछ पंक्तियों के स्नैपशॉट पर विचार करें

अब PersonId of 3. के लिए 20 नई पंक्तियाँ डालें। पहला, चूंकि यह कोई अनोखी कुंजी नहीं है, इसलिए सर्वर इसे अद्वितीय बनाने के लिए आपके मानों (दृश्यों के पीछे) में कुछ अतिरिक्त बाइट्स जोड़ता है (जो अतिरिक्त स्थान भी जोड़ता है) और फिर वह स्थान जहाँ इन निवासों को बदलना होगा। तुलना करें कि ऑटो-इंक्रीमेंट पीके डालने के लिए जहां आवेषण अंत में होता है। गैर तकनीकी व्याख्या संभवतः इस पर आ जाएगी: यदि यह स्वाभाविक रूप से आपके आइटम को सम्मिलित करते समय उस स्थान पर मौजूदा वस्तुओं के वर्गाकार बनाम स्थान के उच्चतर मान पर प्रगति कर रहा है तो यह करने के लिए 'लीफ-शफलिंग' कार्य कम है।

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

आपकी प्रदर्शन समस्याओं का विश्लेषण आपकी अनूठी स्थिति के लिए किया जाना चाहिए और केवल सामान्य दिशानिर्देशों के रूप में इन प्रकार के उत्तरों को लेना चाहिए। आपका सबसे अच्छा दांव एक डीबीए पर भरोसा करना है जो आपकी समस्याओं को ठीक से सत्यापित कर सकता है। ऐसा लगता है कि आपके पास संसाधन विवाद मुद्दे हैं जो एक साधारण सूचकांक से परे हो सकते हैं। यह एक बहुत बड़ी समस्या का लक्षण हो सकता है। (समान रूप से मुद्दों को डिज़ाइन करें ... अन्यथा संसाधन सीमाएँ।)

किसी भी मामले में, अच्छी किस्मत!


5

कुछ लेखकों का सुझाव है कि यदि कोई विकल्प होता है, तो CIएक identityकॉलम पर "बर्बाद करना" नहीं होता है, जिससे रेंज क्वेरीज़ को फायदा होगा।

MSDN क्लस्टर किए गए अनुक्रमणिका डिज़ाइन दिशानिर्देशों से कुंजी को निम्न मानदंडों के अनुसार चुना जाना चाहिए

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

आपका CourtOrderIDकॉलम मिलता है 2। आपका PersonIdपूरा करती है 1और 3। जैसा कि अधिकांश पंक्तियाँ आपस में जुड़ जाएंगी, uniqueifierवैसे ही आप इसे केवल अनूठे रूप में घोषित कर सकते हैं और उपयोग भी कर सकते हैं PersonId,CourtOrderIDक्योंकि यह समान चौड़ाई की होगी लेकिन अधिक उपयोगी होगी क्योंकि पंक्ति लोकेटर के रूप में सभी NCIs में क्लस्टर इंडेक्स कुंजी जोड़ी जाती है और यह अनुमति देगा उन्हें और अधिक प्रश्नों को कवर करने के लिए।

PersonId,CourtOrderIDसीआई के रूप में उपयोग करने के साथ मुख्य मुद्दा यह है कि तार्किक विखंडन की संभावना सुनिश्चित होगी (और यह विशेष रूप से उस श्रेणी के प्रश्नों को प्रभावित करता है जो आप मदद करने की कोशिश कर रहे हैं) ताकि आपको भरण कारक, और विखंडन के स्तर की निगरानी करने और अधिक बार सूचकांक रखरखाव करने की आवश्यकता हो।


3

इसे निम्नलिखित लिंक में समझाया गया है: https://msdn.microsoft.com/en-us/ms190457.aspx

क्लस्टर किया गया

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

  • तालिका में डेटा पंक्तियों को केवल उस समय क्रमबद्ध क्रम में संग्रहीत किया जाता है, जब तालिका में क्लस्टर अनुक्रमणिका होती है। जब किसी टेबल में क्लस्टर इंडेक्स होता है, तो टेबल को क्लस्टर टेबल कहा जाता है। यदि किसी तालिका में कोई क्लस्टर इंडेक्स नहीं है, तो उसकी डेटा पंक्तियों को एक अनियंत्रित संरचना में संग्रहीत किया जाता है जिसे एक ढेर कहा जाता है।

nonclustered

  • गैर-अनुक्रमित अनुक्रमित में डेटा पंक्तियों से अलग एक संरचना होती है। एक गैर- अनुक्रमित सूचकांक c, गैर-अनुक्रमित प्रमुख कुंजी मानों को प्राप्त करता है और प्रत्येक कुंजी मूल्य प्रविष्टि में डेटा पंक्ति का एक संकेतक होता है जिसमें महत्वपूर्ण मूल्य होता है

  • किसी गैर-क्रमानुसार अनुक्रमणिका से डेटा पंक्ति में सूचक को पंक्ति लोकेटर कहा जाता है। पंक्ति लोकेटर की संरचना इस बात पर निर्भर करती है कि डेटा पृष्ठों को ढेर या संकुल तालिका में संग्रहीत किया जाता है या नहीं। एक ढेर के लिए, एक पंक्ति लोकेटर पंक्ति का एक संकेतक है। एक संकुल तालिका के लिए, पंक्ति लोकेटर संकुल सूचकांक कुंजी है।

  • आप गैर-क्रस्टेड इंडेक्स के लीफ लेवल पर नॉन कॉलम कॉलम को मौजूदा इंडेक्स की लिमिट्स, 900 बाइट्स और 16 कुंजी कॉलम को पास कर सकते हैं, और पूरी तरह से कवर, इंडेक्स, क्वेश्चन को निष्पादित कर सकते हैं।


-3

कुछ डीबी कुछ बुरा चयनों के साथ, एक संग्रहीत प्रक्रिया में शामिल होता है - केवल अंतर सूचकांक है

INDEXES - अव्यवस्थित बनाम गैर-संकुलित

  891 rows
  10 sec
  NONCLUSTERED 

  OR

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