'विशाल' डेटाबेस तालिका PK के लिए अनुक्रमिक GUID या bigint


14

मुझे पता है कि इस प्रकार का प्रश्न बहुत अधिक आता है, लेकिन मुझे अभी तक इस निर्णय लेने में मदद करने के लिए किसी भी आकर्षक तर्क को पढ़ना नहीं है। कृपया मेरा साथ दें!

मेरे पास एक विशाल डेटाबेस है - यह प्रति दिन लगभग 10,000,000 रिकॉर्ड बढ़ता है। डेटा संबंधपरक है, और प्रदर्शन कारणों से मैं तालिका कॉपी के साथ लोड करता हूं। इस कारण से, मुझे पंक्तियों के लिए कुंजी जनरेट करने की आवश्यकता है, और एक पहचान कॉलम पर भरोसा नहीं किया जा सकता है।

64-बिट पूर्णांक - एक बिगिंट - मेरे उपयोग के लिए पर्याप्त चौड़ा है, लेकिन विशिष्टता की गारंटी देने के लिए, मुझे मेरे लिए अपनी आईडी बनाने के लिए एक केंद्रीकृत जनरेटर की आवश्यकता है। मेरे पास वर्तमान में ऐसी जनरेटर सेवा है जो एक सेवा को एक्स अनुक्रम संख्या आरक्षित करने की अनुमति देती है और कोई टक्कर की गारंटी नहीं देती है। हालांकि, इसका एक परिणाम यह है कि मेरे पास मौजूद सभी सेवाएं इस एक केंद्रीकृत जनरेटर पर निर्भर हैं, और इसलिए मैं सीमित हूं कि मैं अपने सिस्टम को कैसे वितरित कर सकता हूं और अन्य निर्भरता (जैसे नेटवर्क एक्सेस की आवश्यकता) के बारे में खुश नहीं हूं इस डिजाइन द्वारा। यह अवसर पर एक समस्या रही है।

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

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


2
आप "अनुक्रमिक GUID" कैसे उत्पन्न करेंगे?

यह एक कस्टम कार्यान्वयन है। यह मूल रूप से एक GUID- प्रकार का प्रारूप है जिसमें 6 बाइट्स को टाइमस्टैम्प बाइट्स के साथ बदल दिया गया है, और 2 बाइट्स जो एक अनुक्रम संख्या का प्रतिनिधित्व करता है जहां टाइमस्टैम्प समान है। यह सही अनुक्रमिक मूल्यों का उत्पादन करने की गारंटी नहीं है, लेकिन यह सूचकांक विखंडन को मेरे लिए गैर-मुद्दा बनाने के लिए पर्याप्त है।

क्या आप इस डेटा को कई अलग-अलग स्रोतों से लोड कर रहे हैं? मैं यह भी मान रहा हूं कि जिस इंडेक्स को आप टुकड़े करने से चिंतित हैं, वह क्लस्टर इंडेक्स है?

2
यदि आप अनुक्रमिक GUID के साथ जा रहे हैं, तो आपको NEWSEQUENTIALID () देखना चाहिए। यह वही करना चाहिए जो आप चाहते हैं (नीरस रूप से बढ़ रहा है), और कस्टम कोड पर भरोसा नहीं करता है।

2
जेरेमिया पेसचका की पोस्ट पर देखिए कि किस तरह की परेशानियों का सामना करना पड़ता है अच्छी तरह से पढ़ें और वह कई बार इन कार्यान्वयन से निपटे।
बिलिंक

जवाबों:


4

मैं ऐसी ही स्थिति में हूं। वर्तमान में, मैं अनुक्रमिक GUID दृष्टिकोण का उपयोग कर रहा हूं और कोई विखंडन और आसान कुंजी पीढ़ी नहीं है।

मैंने दो अवशिष्टों पर ध्यान दिया है, जिससे मुझे बिगिन की ओर पलायन शुरू करना पड़ा:

  1. अंतरिक्ष उपयोग । प्रति सूचकांक 8 बाइट्स अधिक। गुणा करें कि 10 सूचकांक या तो और आपको अंतरिक्ष का एक बड़ा कचरा मिलता है।
  2. कॉलमस्टोरस्टोर इंडेक्स GUIDs का समर्थन नहीं करते हैं।

(२) क्या मेरे लिए हत्यारा था।

अब मैं इस तरह अपनी कुंजियाँ उत्पन्न करूँगा:

yyMMddHH1234567890

मैं एक अग्रणी तिथि प्लस घंटे का उपयोग कर रहा हूं और उसके बाद एक अनुक्रमिक भाग होगा । यह मुझे किसी भी अतिरिक्त सूचकांक के बिना तारीख तक अपने डेटा को सीमित करने की अनुमति देता है। यह मेरे लिए एक अच्छा बोनस है।

मैं एक HiLo एल्गोरिथ्म का उपयोग करके Bigint के अनुक्रमिक भाग को उत्पन्न करूँगा जो वितरित होने के लिए अच्छी तरह से उधार देता है ।

आशा है कि इसमें से कुछ आपकी स्थिति में स्थानांतरित हो जाएंगे। मैं निश्चित रूप से bigint का उपयोग करने की सलाह देता हूं।


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

3

एक प्रकार के साथ INT, 1 से शुरू होने पर, आपको 2 बिलियन से अधिक संभावित पंक्तियाँ मिलती हैं - जो कि अधिकांश मामलों के लिए पर्याप्त से अधिक होनी चाहिए। के साथ BIGINT, आप मोटे तौर पर 922 क्वाड्रिलियन (922 के साथ 15 शून्य - 922'000 बिलियन) - के लिए पर्याप्त है ??

यदि आप INT IDENTITY1 वर्ष की शुरुआत का उपयोग करते हैं , और आप प्रत्येक सेकंड में एक पंक्ति सम्मिलित करते हैं, तो आपको 2 बिलियन की सीमा को हिट करने से पहले 66.5 साल की आवश्यकता होती है ...।

यदि आप BIGINT IDENTITY1 पर एक शुरुआत का उपयोग करते हैं , और आप हर सेकंड में एक हजार पंक्तियाँ डालते हैं, तो आपको 922 क्वाड्रिलियन सीमा को हिट करने से पहले 292 मिलियन वर्ष पहले एक दिमाग लगाने की आवश्यकता होती है ...।

प्रति दिन अपनी 10 मिलियन पंक्तियों का उपयोग करना, जो आपको ले जाएगा आपके पास मोटे तौर पर पर्याप्त संख्याएं हैं 1'844'674'407'370 दिन ( 1844 बिलियन दिन या 5 बिलियन वर्षों से अधिक टिक ) के - क्या यह आपकी आवश्यकताओं के लिए पर्याप्त है ?

MSDN पुस्तकें ऑनलाइन में इसके बारे में और सभी विकल्पों के साथ पढ़ें


1
प्रति दिन 10 मिलियन पंक्तियों की प्रविष्टि दर INT रेंज को 200 दिनों में समाप्त कर देगी।
मसेदा

@ मसेदा: हाँ - क्या मैंने कुछ और दावा किया है? यह BIGINTसीमा को जल्दी से समाप्त नहीं करता है , हालांकि ....
marc_s

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

2
@ बरगैस्ट: क्या आप अपने डेटा को एक स्टेजिंग टेबल (पहचान के बिना) में थोक में नहीं डाल सकते थे और फिर इसे वहां से अपने वास्तविक डेटा टेबल में इस्तेमाल कर सकते हैं BIGINT IDENTITY?
marc_s

@marc_s: हां, प्रदान की गई गणना को इस प्रश्न के साथ संरेखित नहीं किया गया था: "यदि आप 1 पर शुरू होने वाले INT IDENTITY का उपयोग करते हैं, और आप हर सेकंड एक पंक्ति सम्मिलित करते हैं, तो आपको 2 बिलियन की सीमा को हिट करने से पहले 66.5 साल की आवश्यकता होगी"।
मद्दा

2

मैं आपको SQL 2012 में BIGINT डेटा प्रकार के SEQUENCE का उपयोग करने की सलाह देता हूं। यह कैश / नोचे जैसे विकल्पों के साथ पहचान की तुलना में बहुत अधिक लचीला है, आप अपने बैच ऑपरेशन के लिए sp_fterence_get_range के रूप में एक अनुक्रम रेंज भी असाइन कर सकते हैं।


दुर्भाग्य से, SEQUENCE Sql Azure पर समर्थित नहीं है।
टिमोथी ली रसेल

2

क्या कारण है कि आप पहचान का उपयोग नहीं कर सकते क्योंकि आपके द्वारा लोड किए जा रहे अलग-अलग तालिकाओं के बीच पहले से ही विदेशी कुंजी संबंध हैं? और आपके लिए कोई अन्य प्राकृतिक कुंजी नहीं है जो उन्हें एक संचालन क्षेत्र से उत्पादन क्षेत्र तक एक ऑपरेशन में जोड़ने में सक्षम हो? इस कारण से, मैं थोड़ा और जानना चाहूंगा कि वे वर्तमान में स्रोत प्रणाली में "लिंक" कैसे हैं इससे पहले कि आप कॉपी करें? क्या कई स्रोत प्रणालियां केवल अपने स्वयं के अनुक्रमों का उपयोग करती हैं और जब साझा डेटाबेस में लाया जाता है तो परस्पर विरोधी दृश्यों की संभावना होती है?

COMB ID / अनुक्रमिक GUID तकनीक वह है जिससे मैं परिचित हूं, और यह किसी भी समय कारगर है कि आपको प्रभावी रूप से डेटाबेस के बाहर असाइन की गई वैश्विक विशिष्टता की आवश्यकता है - यह प्रभावी रूप से डेटाबेस के अंदर और बाहर दोनों के लिए एक उपयोगी पंक्ति पहचान है। उस कारण से, अत्यधिक वितरित वातावरण या डिस्कनेक्ट किए गए परिदृश्यों में, यह एक ठीक विकल्प है

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

इसके अलावा, वितरित पीढ़ी के साथ, यदि पंक्तियाँ वास्तव में GUID कॉलम के क्रम में नहीं आती हैं, तो क्लस्टर इंडेक्स कुंजी (संकीर्ण, स्थिर, बढ़ती) के लिए इसका उपयोग करने वाले मुद्दे संभावित रूप से एक पहचान पर क्लस्टरिंग की तुलना में कुछ विखंडन का कारण बनते हैं बने हुए हैं।


0

सामान्य तौर पर यह संभव है OUTPUTकि INSERTकमांड के क्लॉज का उपयोग दोनों तालिकाओं में डेटा डालने और पहचान क्षेत्र के साथ संबंधित हो।

पहचानकर्ता जो टाइमस्टैम्प पर आधारित है, को विश्वसनीय नहीं माना जाना चाहिए - यह सिस्टम घड़ी पर निर्भर करता है जो बदले में कई चीजों पर निर्भर करता है - हार्डवेयर घड़ी से समय सिंक्रनाइज़ेशन सेवाओं तक।

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