अनुक्रमित दृश्य गैर-अद्वितीय क्लस्टर किए गए अनुक्रमित को अनुमति क्यों नहीं देते हैं?


12

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

हालांकि अनुक्रमित दृश्य गैर-अद्वितीय क्लस्टर इंडेक्स का समर्थन नहीं करते हैं जो डेटाबेस संरचना के बाकी हिस्सों द्वारा निर्धारित पूर्ववर्ती के खिलाफ थोड़ा सा जाता है।

उदाहरण के लिए, यहां हमारे टेबल के एक जोड़े का सरलीकृत संस्करण है।

-Groups-
Group ID    GroupName

-Users-
UserKey    UserName    FullName     GroupID

इंडेक्स Group.GroupID (गैर-क्लस्टर) और Users.GroupID (क्लस्टर) पर हैं। उपयोगकर्ता तालिका में GroupID पर क्लस्टर की जा रही कुंजी सबसे आम तौर पर एक विशिष्ट समूह के उपयोगकर्ताओं की एक सीमा को पुनर्प्राप्त की जाएगी। स्पष्ट रूप से आपके पास प्रति समूह में कई उपयोगकर्ता होंगे, इसलिए यह संकुल सूचकांक गैर-अद्वितीय है।

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

ConsumableID    ConsumableVariantID AllowThresholdOverwrite FullPath    GroupID ManufacturerID  Type    ModelID
101              29                 1                       0.1.2.4.    4       3               3       2

वास्तव में इस दृश्य पर एकमात्र मूल्य जो हमेशा अद्वितीय होगा, उपभोज्य कॉलम है, इसलिए मुझे अपने सूचकांक को रखने के स्थान के रूप में बहुत कम विकल्प बचा है।

जब नियमित टेबल करते हैं तो दृश्य गैर-अद्वितीय क्लस्टर इंडेक्स की अनुमति क्यों नहीं देते हैं?


3
इस पृष्ठ के निचले भाग के पास एक बहुत ही संक्षिप्त विवरण है, जिसका शीर्षक है 'एक दृश्य पर पहले सूचकांक को स्पष्ट और अद्वितीय क्यों होना चाहिए?' लेकिन यह बहुत विस्तार नहीं करता है। मुझे निश्चित रूप से अधिक विस्तृत विवरण सुनने में दिलचस्पी होगी।
स्टीव पेटीफ़र

5
टिप्पणियों की एक जोड़ी: 1 - कोई कारण नहीं है कि आप क्लस्टर नहीं कर सकते (GroupID, UserID)। कुंजी के लिए अपने आप को एक कॉलम में सीमित न करें। 2 - मैं एक दृश्य के लिए सीमा की कल्पना करता हूं क्योंकि यह एक पूरक डेटा ऑब्जेक्ट है जिसे पंक्तियों को आसानी से नेकां इंडेक्स से बांधने की आवश्यकता होती है। किसी तालिका के लिए, गैर-विशिष्ट CI कुंजी को इसके साथ जोड़ा जाता है, लेकिन मुझे लगता है कि यह अनुक्रमित दृश्य के साथ अधिक चुनौतीपूर्ण होगा क्योंकि यह एक वास्तविक तालिका नहीं है, लेकिन वास्तविक तालिका को फिर से बनाने की आवश्यकता है।
JNK

जवाबों:


22

इस Microsoft तकनीकी आलेख में निम्नलिखित स्पष्टीकरण दिया गया है :

एक दृश्य पर पहले सूचकांक को क्‍लस्‍टरेड और अद्वितीय क्यों होना चाहिए?

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

SQL सर्वर बेस डेटा के साथ अनुक्रमित विचारों को रखने के लिए डेल्टा बीजगणित की एक प्रणाली का उपयोग करता है। यह स्वचालित रूप से प्रत्येक डीएमएल क्वेरी के लिए व्यू-मेंटेनेंस क्वेरी प्लान ऑपरेटरों को शामिल करता है जो एक या अधिक अनुक्रमित विचारों को प्रभावित करता है। दृश्य पर एक अद्वितीय क्लस्टर इंडेक्स होने से कार्यान्वयन विवरण बहुत सरल हो जाता है।

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

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


2
यदि आप अनुक्रमित दृश्य को अपडेट करने का प्रयास करते हैं तो एक समान बग हो सकता है, जिसमें एक GROUP BYखंड है, लेकिन क्लस्टरिंग इंडेक्स में सभी समूहीकरण अभिव्यक्तियाँ कुंजी नहीं हैं। यह SQL Server 2014 के रूप में मान्य है।
क्वास्सोनी

4

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

तो आप देखते हैं कि इंजन पर काम करने के लिए CI को आंतरिक रूप से अद्वितीय होना चाहिए।

यदि आप एक इंडेक्स यूनिक एसक्यूएल सर्वर नहीं बनाते हैं, तब भी यह आंतरिक रूप से अद्वितीय बनाता है। NCI के मामले में एक ढेर टेबल पर यह पंक्ति बुकमार्क को जोड़ता है। एक गैर-विशिष्ट सीआई के मामले में यह एक अद्वितीय स्तंभ जोड़ता है। एनसीआई के मामले में एक सीआई के साथ एक मेज पर यह किसी भी सीआई कुंजी स्तंभों को जोड़ता है जो आप स्वयं पहले से निर्दिष्ट नहीं करते थे (इसमें यूनीकिफायर शामिल हो सकता है)।

कोई स्पष्ट स्तंभ नहीं है जिसे अनुक्रमित दृश्य के मामले में जोड़ा जा सकता है। इसलिए SQL सर्वर स्वचालित रूप से ऐसा नहीं कर सकता है।

आम तौर पर, यह एक मानव के लिए काफी स्पष्ट है कि आप किस कॉलम को जोड़ सकते हैं ताकि सीआई में उपयोग करने के लिए कॉलम का एक अनूठा सेट हो। ये सामान्य रूप से अंतर्निहित तालिकाओं में से एक का पीके या सीआई स्तंभ हैं। यदि दृश्य में GROUP BYआपके पास समूह कुंजी पर सामान्य रूप से अनुक्रमणिका है।


2
मैं दृढ़ता से इस जवाब के phrasing को संशोधित करने का सुझाव देता हूं। हालांकि इसमें मूल प्रश्न के संबंध में एक वैध बिंदु होता है, लेकिन ऐसा लग सकता है कि यह बताता है कि सभी गैर-अद्वितीय अनुक्रमितों में अद्वितीय अंक हैं, जो कि ऐसा नहीं है।
स्पेगेटीडब्बा

@spaghettidba धन्यवाद, मैंने उस पर ध्यान नहीं दिया। उम्मीद है कि अब बेहतर होगा।
usr

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

@spaghettidba NCIs हमेशा आंतरिक रूप से अद्वितीय होते हैं। वे हमेशा क्वेरी योजना के हिस्से के रूप में सभी CI कुंजी का उत्पादन कर सकते हैं। Pastebin.com/vkGHpCsR देखें एनसीआई डेटा पृष्ठ में दोनों कॉलम हैं।
usr

मैं देखता हूं कि आप कहां से आ रहे हैं। मल्टीपल लीफ़ एक ही इंडेक्स कुंजी साझा कर सकते हैं, लेकिन क्लस्टरिंग कुंजी को हमेशा NCIs में शामिल किया जाता है। क्या यह कहना पर्याप्त है कि वे हमेशा आंतरिक रूप से अद्वितीय हैं? मुझे ऐसा नहीं लगता।
स्पेगेटीडब्बा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.