database - हरण - फ्लो चार्ट बनाने की विधि




हाय/लो एल्गोरिदम क्या है? (4)

हाय / लो एल्गोरिदम क्या है?

मैंने इसे NHibernate दस्तावेज़ में पाया है (यह अद्वितीय कुंजी, खंड 5.1.4.2 उत्पन्न करने का एक तरीका है), लेकिन मुझे यह कैसे पता चलता है कि यह कैसे काम करता है इसकी एक अच्छी व्याख्या नहीं मिली है।

मुझे पता है कि निबर्ननेट इसे संभालता है, और मुझे अंदरूनी जानने की आवश्यकता नहीं है, लेकिन मैं सिर्फ उत्सुक हूं।


जॉन के जवाब के अलावा:

यह डिस्कनेक्ट काम करने में सक्षम होने के लिए प्रयोग किया जाता है। एक ग्राहक तब सर्वर को एक उच्च संख्या के लिए पूछ सकता है और लो संख्या को बढ़ाने वाली वस्तुओं को बना सकता है। जब तक लो रेंज का उपयोग नहीं किया जाता है तब तक सर्वर से संपर्क करने की आवश्यकता नहीं होती है।


मूल विचार यह है कि आपके पास प्राथमिक कुंजी बनाने के लिए दो संख्याएं हैं- एक "उच्च" संख्या और "कम" संख्या। एक क्लाइंट मूल रूप से "उच्च" अनुक्रम को बढ़ा सकता है, यह जानकर कि यह "निम्न" मानों की विविधता के साथ पिछले "उच्च" मान की पूरी श्रृंखला से सुरक्षित रूप से कुंजी उत्पन्न कर सकता है।

उदाहरण के लिए, मान लीजिए कि आपके पास 35 के वर्तमान मूल्य के साथ "उच्च" अनुक्रम है, और "कम" संख्या 0-1023 की सीमा में है। फिर ग्राहक अनुक्रम को 36 तक बढ़ा सकता है (अन्य क्लाइंट के लिए 35 का उपयोग करते समय चाबियाँ उत्पन्न करने में सक्षम होने के लिए) और पता है कि चाबियाँ 35/0, 35/1, 35/2, 35/3 ... 35/1023 हैं सभी उपलब्ध।

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


हाय / लो एल्गोरिदम अनुक्रम डोमेन को "हाय" समूहों में विभाजित करता है। एक "हाय" मान तुल्यकालिक रूप से असाइन किया जाता है। प्रत्येक "हाय" समूह को "लो" प्रविष्टियों की अधिकतम संख्या दी जाती है, जो समवर्ती डुप्लिकेट प्रविष्टियों के बारे में चिंता किए बिना ऑफ-लाइन असाइन कर सकते हैं।

  1. "हाय" टोकन डेटाबेस द्वारा असाइन किया गया है, और दो समवर्ती कॉलों को निरंतर अद्वितीय मान देखने की गारंटी है
  2. एक बार "हाय" टोकन पुनर्प्राप्त हो जाने के बाद हमें केवल "incrementSize" ("lo" प्रविष्टियों की संख्या) की आवश्यकता होती है
  3. पहचानकर्ता श्रेणी निम्नलिखित सूत्र द्वारा दी गई है:

    [(hi -1) * incrementSize) + 1, (hi * incrementSize) + 1)
    

    और "लो" मान सीमा में होगा:

    [0, incrementSize)
    

    प्रारंभ मूल्य से लागू किया जा रहा है:

    [(hi -1) * incrementSize) + 1)
    
  4. जब सभी "लो" मानों का उपयोग किया जाता है, तो एक नया "हाय" मान प्राप्त किया जाता है और चक्र जारी रहता है

आप इस आलेख में एक और विस्तृत स्पष्टीकरण पा सकते हैं:

और यह दृश्य प्रस्तुति भी पालन करना आसान है:

जबकि हाय / लो ऑप्टिमाइज़र पहचानकर्ता पीढ़ी को अनुकूलित करने के लिए ठीक है, यह हमारी पहचानकर्ता रणनीति के बारे में कुछ भी जानने के बिना, हमारे डेटाबेस में पंक्तियों को डालने वाली अन्य प्रणालियों के साथ अच्छी तरह से नहीं खेलता है।

हाइबरनेट pooled-lo ऑप्टिमाइज़र प्रदान करता है, जो एक इंटरऑपरेबिलिटी अनुक्रम आवंटन तंत्र के साथ एक हाय / लो जनरेटर रणनीति को जोड़ती है। यह ऑप्टिमाइज़र अन्य सिस्टम के साथ कुशल और अंतःक्रियाशील दोनों है, जो पिछले विरासत हाय / लो पहचानकर्ता रणनीति की तुलना में बेहतर उम्मीदवार है।


हाय-लो आवंटक से बेहतर, "रैखिक चंक" आवंटक है। यह एक समान टेबल-आधारित सिद्धांत का उपयोग करता है लेकिन छोटे, आसानी से आकार वाले हिस्सों को आवंटित करता है और अच्छे मानव-अनुकूल मूल्य उत्पन्न करता है।

create table KEY_ALLOC (
    SEQ varchar(32) not null,
    NEXT bigint not null,
    primary key (SEQ)
);

अगले आवंटित करने के लिए, कहें, 20 कुंजी (जिन्हें सर्वर में एक श्रेणी के रूप में रखा जाता है और आवश्यकतानुसार उपयोग किया जाता है):

select NEXT from KEY_ALLOC where SEQ=?;
update KEY_ALLOC set NEXT=(old value+20) where SEQ=? and NEXT=(old value);

यह प्रदान करना कि आप इस लेनदेन को प्रतिबद्ध कर सकते हैं (विवाद को संभालने के लिए रीट्रीज़ का उपयोग करें), आपने 20 कुंजी आवंटित की हैं और आवश्यकतानुसार उन्हें बांट सकते हैं।

केवल 20 के एक खंड के आकार के साथ, यह योजना ओरेकल अनुक्रम से आवंटित करने से 10x तेज है, और सभी डेटाबेस के बीच 100% पोर्टेबल है। आवंटन प्रदर्शन हाय-लो के बराबर है।

अंबालर के विचार के विपरीत, यह कुंजीपटल को एक संगत रैखिक संख्या रेखा के रूप में मानता है।

यह समग्र कुंजी के लिए प्रोत्साहन से बचाता है (जो वास्तव में कभी भी एक अच्छा विचार नहीं था) और जब सर्वर पुनरारंभ होता है तो पूरे लो-शब्द को बर्बाद करने से बचा जाता है। यह "दोस्ताना", मानव-स्तर के प्रमुख मूल्य उत्पन्न करता है।

मिस्टर अंबलर का विचार, तुलनात्मक रूप से, उच्च 16- या 32-बिट्स आवंटित करता है, और बड़े मानव-असंगत रूपों को उच्च-शब्द वृद्धि के रूप में उत्पन्न करता है।

आवंटित कुंजी की तुलना:

Linear_Chunk       Hi_Lo
100                65536
101                65537
102                65538
.. server restart
120                131072
121                131073
122                131073
.. server restart
140                196608

मैं वास्तव में श्रीमान अंबलर से 9 0 के दशक में इस बेहतर योजना का सुझाव देने के लिए उससे मेल खाता था, लेकिन वह रैखिक संख्या-रेखा का उपयोग करने के फायदे और स्पष्ट सादगी को स्वीकार करने के लिए बहुत अटक गया और कठोर था।

डिजाइन-वार, कोई समाधान तुलनात्मक लाभ प्राप्त करते समय Linear_Chunk की तुलना में उनका समाधान मौलिक रूप से संख्या-रेखा (समग्र कुंजी, बड़े hi_word उत्पादों) पर अधिक जटिल है। इस प्रकार उनका डिजाइन गणितीय साबित हुआ है।








hilo