GUIDs की वजह से क्लस्टर कुंजी के रूप में समस्याग्रस्त हैं उच्च यादृच्छिकता।यह समस्या पिछले टेकनेट पत्रिका क्यू & में पॉल रैंडल नाम से संबोधित किया एक स्तंभ: I'd like to use a GUID as the clustered index key, but the others are arguing that it can lead to performance issues with indexes. Is this true and, if so, can you explain why?
अब ध्यान में रखना है कि चर्चा विशेष रूप से के बारे में क्लस्टर अनुक्रमित है। आप कहते हैं कि आप कॉलम को 'आईडी' के रूप में उपयोग करना चाहते हैं, यह स्पष्ट नहीं है कि आप इसे क्लस्टर कुंजी या केवल प्राथमिक कुंजी के रूप में देखते हैं। आम तौर पर दो ओवरलैप, इसलिए मुझे लगता है कि आप इसे क्लस्टर इंडेक्स के रूप में उपयोग करना चाहते हैं। ऊपर वर्णित आलेख के लिंक में यह एक गरीब विकल्प क्यों है, इसका कारण बताया गया है।
गैर क्लस्टर इंडेक्स के लिए GUID के पास अभी भी कुछ समस्याएं हैं, लेकिन जब तक वे तालिका की बाईं ओर क्लस्टर कुंजी नहीं हैं, उतनी बड़ी नहीं है। फिर, GUIDs की यादृच्छिकता पृष्ठ विभाजन और विखंडन प्रस्तुत करती है, चाहे वह गैर-क्लस्टर सूचकांक स्तर पर हो (केवल एक छोटी सी समस्या)।
GUID उपयोग के आस-पास कई शहरी किंवदंतियों हैं जो उन्हें इंट (4 बाइट्स) की तुलना में उनके आकार (16 बाइट्स) के आधार पर निंदा करते हैं और यदि उनका उपयोग किया जाता है तो भयानक प्रदर्शन विनाश का वादा करता है। यह थोड़ा अतिरंजित है। आकार 16 की एक कुंजी अभी भी एक बहुत ही सुसंगत कुंजी हो सकती है, ठीक से डिज़ाइन किए गए डेटा मॉडल पर। हालांकि यह सच है कि इंटरेस्ट में कम घनत्व गैर-पत्ते वाले पृष्ठ में int के परिणामस्वरूप 4 गुना बड़ा होने के कारण, यह तालिकाओं के विशाल बहुमत के लिए वास्तविक चिंता नहीं है। बी-पेड़ संरचना एक स्वाभाविक रूप से संतुलित संतुलित पेड़ है और गहराई पेड़ ट्रैवर्सल का शायद ही कभी कोई मुद्दा है, इसलिए एक आईएनटी कुंजी के विपरीत GUID कुंजी के आधार पर मूल्य की तलाश करना प्रदर्शन में समान है। एक पत्ता-पृष्ठ ट्रैवर्सल (यानी एक टेबल स्कैन) गैर-पत्ती वाले पृष्ठों को नहीं देखता है, और पेज आकार पर GUID आकार का प्रभाव आम तौर पर काफी छोटा होता है, क्योंकि रिकॉर्ड स्वयं अतिरिक्त 12 बाइट्स से काफी बड़ा होता है GUID द्वारा। तो मैं '16 बाइट बनाम 4' के आधार पर सुनवाई-सलाह सलाह लेता हूं, बल्कि नमक के अनाज के साथ। मामले के आधार पर व्यक्तिगत मामले का विश्लेषण करें और तय करें कि आकार का प्रभाव वास्तविक अंतर बनाता है: कितने अन्य कॉलम तालिका में हैं (यानी पत्ते पृष्ठों पर GUID आकार कितना प्रभाव है) और कितने संदर्भ इसका उपयोग कर रहे हैं (यानी कितने अन्य टेबल बढ़ जाएंगे क्योंकि तथ्य यह है कि उन्हें एक बड़ी विदेशी कुंजी स्टोर करने की आवश्यकता है)।
मैं इन सभी विवरणों को GUIDs की अस्थायी रक्षा में बुला रहा हूं क्योंकि उन्हें हाल ही में बहुत बुरी प्रेस मिल रही है और कुछ अवांछित हैं। उनके पास उनकी योग्यता है और किसी भी वितरित प्रणाली में अनिवार्य है (जिस क्षण आप डेटा आंदोलन की बात कर रहे हैं, इसे प्रतिकृति या सिंक फ्रेमवर्क या जो भी हो) के माध्यम से करें। मैंने GUID खराब प्रतिष्ठा के आधार पर खराब निर्णय किए हैं जब उन्हें उचित विचार किए बिना छोड़ा गया था। लेकिन सच है, यदि आपको क्लस्टर कुंजी के रूप में GUID का उपयोग करना है, तो सुनिश्चित करें कि आप यादृच्छिकता समस्या को संबोधित करते हैं: जब संभव हो तो अनुक्रमिक मार्गदर्शिका का उपयोग करें।
और अंत में, अपने प्रश्न का उत्तर देने के लिए: यदि आपके पास विशिष्ट GUID का उपयोग करने का कारण नहीं है, तो INT का उपयोग करें।
स्रोत
2009-07-20 04:44:35
यदि int बनाम GUID का प्रदर्शन आपके डेटा की बाधा के लिए चिंता का एक प्रमुख योगदान स्रोत है, तो अपने आप को ** बहुत ** भाग्यशाली मानें। इससे पहले कि अधिकांश अन्य अनुप्रयोग एक और कारक बनने से पहले अन्य दबाने वाले मुद्दों में भाग लेते हैं। –
इसके अलावा, GUID का सम्मिलन कथन करते समय उपयोगी हो सकता है, क्योंकि आप सी # प्रति से अपना GUID बना सकते हैं, फिर केवल सम्मिलित करें और डेटाबेस को नए पहचानकर्ता को वापस करने के लिए प्रतीक्षा न करें। –
@ जो चुंग अभी कोई प्रदर्शन समस्या नहीं है, क्योंकि डेटाबेस अभी भी डिज़ाइन किया जा रहा है। – mkchandler