GUID आपकी प्राथमिक कुंजी के लिए एक प्राकृतिक विकल्प प्रतीत हो सकता है - और यदि आपको वास्तव में जरूरी है, तो आप शायद तालिका के प्राथमिक कुंजी के लिए इसका उपयोग करने का बहस कर सकते हैं। मैं को दृढ़ता से अनुशंसा करता हूं किक्लस्टरिंग कुंजी के रूप में GUID कॉलम का उपयोग करें, जो SQL सर्वर डिफ़ॉल्ट रूप से करता है, जब तक कि आप इसे विशेष रूप से नहीं बताते।- उम्मीदवार कुंजी है जो विशिष्ट और मज़बूती से अपनी तालिका में प्रत्येक पंक्ति की पहचान करता है में से एक
1) प्राथमिक कुंजी एक तार्किक निर्माण है:
आप वास्तव में अलग दो मुद्दों रखने की जरूरत है। यह कुछ भी हो सकता है, वास्तव में - एक आईएनटी, एक GUID, एक स्ट्रिंग - चुनें जो आपके परिदृश्य के लिए सबसे ज्यादा समझ में आता है।
2) क्लस्टरिंग कुंजी (स्तंभ या स्तंभों कि मेज पर "क्लस्टर सूचकांक" को परिभाषित) - यह, यहाँ एक शारीरिक भंडारण से संबंधित बात है, और एक छोटे से, स्थिर, बढ़ती डेटा प्रकार आपका सबसे अच्छा विकल्प - INT या BIGINT आपके डिफ़ॉल्ट विकल्प के रूप में है।
डिफ़ॉल्ट रूप से, SQL सर्वर तालिका पर प्राथमिक कुंजी क्लस्टरिंग कुंजी के रूप में भी उपयोग की जाती है - लेकिन उस तरह होने की आवश्यकता नहीं है! पिछली GUID- आधारित प्राथमिक/क्लस्टर कुंजी को दो अलग-अलग कुंजी में विभाजित करते समय मैंने व्यक्तिगत प्रदर्शन लाभ व्यक्तिगत रूप से देखा है - GUID पर प्राथमिक (तार्किक) कुंजी, और क्लस्टरिंग (ऑर्डरिंग) कुंजी को अलग-अलग INT पहचान (1, 1) कॉलम।
Kimberly Tripp - इंडेक्सिंग की रानी - और अन्य ने कई बार कहा है - क्लस्टरिंग कुंजी के रूप में एक GUID इष्टतम नहीं है, क्योंकि इसकी यादृच्छिकता के कारण, यह बड़े पैमाने पर पेज और इंडेक्स विखंडन और आम तौर पर बुरा प्रदर्शन।
हाँ, मुझे पता है - SQL Server 2005 और 0 में newsequentialid()
है - लेकिन यह भी वास्तव में और पूरी तरह अनुक्रमिक नहीं है और इस प्रकार GUID के समान समस्याओं से भी पीड़ित है - बस थोड़ा सा प्रमुख।
फिर विचार करने के लिए एक और मुद्दा है: तालिका पर क्लस्टरिंग कुंजी आपके टेबल पर प्रत्येक और गैर-क्लस्टर इंडेक्स पर प्रत्येक प्रविष्टि में भी जोड़ा जाएगा - इस प्रकार आप वास्तव में यह सुनिश्चित करना चाहते हैं कि यह छोटा हो मुमकिन। आम तौर पर, 2+ अरब पंक्तियों के साथ एक आईएनटी विशाल बहुमत के लिए पर्याप्त होना चाहिए - और क्लस्टरिंग कुंजी के रूप में एक GUID की तुलना में, आप डिस्क पर और सर्वर मेमोरी में सैकड़ों मेगाबाइट स्टोरेज को बचा सकते हैं।
त्वरित गणना - INT बनाम GUID का उपयोग कर के रूप में प्राथमिक और क्लस्टरिंग कुंजी: 1'000'000 पंक्तियों (3.8 एमबी बनाम 15.26 एमबी)
6 nonclustered सूचकांक
- बेस तालिका (22.89 एमबी बनाम 91.55 एमबी)
कुल: 25 एमबी बनाम 106 एमबी - और कि बस एक ही मेज पर है!
विचार के लिए कुछ और खाना - Kimberly Tripp द्वारा उत्कृष्ट सामग्री - इसे पढ़ें, इसे फिर से पढ़ें, इसे पचाना! यह वास्तव में एसक्यूएल सर्वर अनुक्रमण सुसमाचार है।
तो अगर आप वास्तव में अपनी प्राथमिक कुंजी GUIDs में परिवर्तित करना होगा - सुनिश्चित करें कि प्राथमिक कुंजी क्लस्टरिंग कुंजी नहीं है बनाने के लिए प्रयास करें, और आपके पास अभी भी तालिका पर एक आईएनटी पहचान फ़ील्ड है जिसे क्लस्टरिंग कुंजी के रूप में उपयोग किया जाता है। अन्यथा, आपका प्रदर्शन टैंक करना और गंभीर हिट लेना सुनिश्चित है।
SQL सर्वर GUID में 128-बिट पूर्णांक के रूप में संग्रहीत किया जाता है, स्ट्रिंग नहीं। लेकिन फिर भी, यह एक int से 4 गुना बड़ा है। –