2009-07-20 12 views
30

मैं SQL सर्वर 2005 (संभवतः निकट भविष्य में SQL सर्वर 2008) का उपयोग कर किसी वेब साइट के लिए एक नया डेटाबेस बना रहा हूं। एक एप्लिकेशन डेवलपर के रूप में, मैंने कई डेटाबेस देखे हैं जो एक तालिका के आईडी फ़ील्ड के लिए integer (या bigint इत्यादि) का उपयोग करते हैं जिनका उपयोग संबंधों के लिए किया जाएगा। लेकिन हाल ही में मैंने डेटाबेस भी देखा है जो आईडी फ़ील्ड के लिए unique identifier (GUID) का उपयोग करते हैं।डेटाबेस में आईडी फ़ील्ड के लिए आईएनटी बनाम अद्वितीय पहचानकर्ता

मेरा सवाल यह है कि क्या किसी के पास दूसरा फायदा है? क्या integer फ़ील्ड पूछताछ और जुड़ने आदि के लिए तेज़ होंगे?

अद्यतन: यह स्पष्ट करने के लिए, यह तालिका में प्राथमिक कुंजी के लिए है। भले ही आप newsequentialid() फ़ंक्शन का उपयोग करें -

+5

यदि int बनाम GUID का प्रदर्शन आपके डेटा की बाधा के लिए चिंता का एक प्रमुख योगदान स्रोत है, तो अपने आप को ** बहुत ** भाग्यशाली मानें। इससे पहले कि अधिकांश अन्य अनुप्रयोग एक और कारक बनने से पहले अन्य दबाने वाले मुद्दों में भाग लेते हैं। –

+4

इसके अलावा, GUID का सम्मिलन कथन करते समय उपयोगी हो सकता है, क्योंकि आप सी # प्रति से अपना GUID बना सकते हैं, फिर केवल सम्मिलित करें और डेटाबेस को नए पहचानकर्ता को वापस करने के लिए प्रतीक्षा न करें। –

+0

@ जो चुंग अभी कोई प्रदर्शन समस्या नहीं है, क्योंकि डेटाबेस अभी भी डिज़ाइन किया जा रहा है। – mkchandler

उत्तर

48

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 का उपयोग करें।

+0

यह मेरे द्वारा उल्लिखित तालिकाओं में प्राथमिक कुंजी के रूप में उपयोग के लिए है। – mkchandler

+0

+1। एक वास्तव में अच्छी तरह से समझाया और तर्कसंगत उत्तर। अच्छा है। –

+1

यदि आपके पास क्लस्टर्ड इंडेक्स है तो NEWSEQUENTIALID() का उपयोग करें। –

7

GUID अधिक स्थान ले और एक पूर्णांक की तुलना में धीमी होने जा रहा है। यदि आप प्रतिकृति करने जा रहे हैं या सिंक फ्रेमवर्क का उपयोग कर रहे हैं तो आपको बहुत अधिक ग्रिड का उपयोग करना होगा।

4

यदि आप सकारात्मक रूप से, बिल्कुल एक अद्वितीय आईडी है, तो GUID। मतलब यह है कि यदि आप कभी विलय, सिंक, दोहराना चाहते हैं, तो आपको शायद एक GUID का उपयोग करना चाहिए।

कम मजबूत चीजों के लिए, एक int, तालिका के बढ़ने के आधार पर पर्याप्त होना चाहिए।

ज्यादातर मामलों में, उचित उत्तर यह निर्भर करता है।

2

जेब्रुक के साथ पूरी तरह से सहमत हुए। मैं कहना चाहता हूं कि जब आपकी तालिका बड़ी होती है, और आप जॉइन के साथ चयन का उपयोग करते हैं, खासकर व्युत्पन्न तालिकाओं के साथ, GUID का उपयोग करके प्रदर्शन में कमी आ सकती है।

6

आईएनटी 4 बाइट्स हैं, बिगिनट्स 8 बाइट्स हैं, और GUIDS 16 बाइट्स हैं। डेटा का प्रतिनिधित्व करने के लिए आवश्यक अधिक स्थान, इसे संसाधित करने के लिए आवश्यक अधिक संसाधन - डिस्क स्पेस, मेमोरी इत्यादि। इसलिए (ए) वे धीमे हैं, लेकिन (बी) यह शायद मायने रखता है अगर वॉल्यूम एक मुद्दा है (लाखों पंक्तियों या लेन-देन के हजारों बहुत, बहुत कम समय में।)

GUIDs का लाभ यह है कि वे (काफी) विश्व स्तर पर अद्वितीय हैं। उचित एल्गोरिदम का उपयोग करके एक guid उत्पन्न करें (और SQL सर्वर xxxx उचित एल्गोरिदम का उपयोग करेगा), और कोई भी दो guids कभी समान नहीं होंगे - चाहे आप कितने कंप्यूटर उत्पन्न कर रहे हों, इससे कोई फर्क नहीं पड़ता कि कितनी बार। (यह उपयोग के 72 सालों के बाद लागू नहीं होता -। मैं विवरण भूल)

आप कई सर्वरों के पार उत्पन्न एकमात्र पहचान की जरूरत है, GUIDs उपयोगी हो सकता है। यदि आपको मोन्डो छिद्रण की आवश्यकता है और 2 बिलियन मूल्यों के तहत, इट्स शायद ठीक हैं। आखिरकार और शायद सबसे महत्वपूर्ण बात यह है कि, यदि आपके डेटा में प्राकृतिक कुंजी हैं, तो उनके साथ रहें और सरोगेट मूल्यों को भूल जाएं।

+0

फिलिप, यहां एक नाटकीय कुंजी क्या है? – johnny

+0

प्राकृतिक कुंजी मॉडलिंग के डेटा के लिए विशिष्ट हैं। मूल प्रश्न में इस डेटा पर कोई विवरण नहीं है, इसलिए हम यह निर्धारित नहीं कर सकते कि यह यहां क्या हो सकता है। –

3

प्रतिकृति आदि के लिए उनका उपयोग करें, प्राथमिक कुंजी के रूप में।

Kimberly L Tripp article

  • के खिलाफ: अंतरिक्ष, सख्ती से monotonic नहीं, पेज विभाजन, बुकमार्क/rids आदि
  • के लिए: एर ...
संबंधित मुद्दे