अनुक्रम बनाम पहचान


87

SQL सर्वर 2012 Sequenceको एक नई सुविधा के रूप में पेश किया गया, जो कि Oracle और Postgres में है। पहचानों पर अनुक्रम कहाँ पसंद किए जाते हैं? और हमें दृश्यों की आवश्यकता क्यों है?


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

जवाबों:


81

मुझे लगता है कि आपको यहां अपना जवाब मिल जाएगा

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

और यहाँ :

अनुक्रम: वर्षों से SQL सर्वर समुदाय द्वारा अनुक्रम का अनुरोध किया गया है, और यह इस रिलीज में शामिल है। अनुक्रम एक उपयोगकर्ता परिभाषित वस्तु है जो एक संख्या का एक क्रम उत्पन्न करता है। यहाँ अनुक्रम का उपयोग कर एक उदाहरण है।

और यहाँ भी:

SQL सर्वर अनुक्रम ऑब्जेक्ट SQL तालिकाओं में एक पहचान स्तंभ की तरह संख्याओं का अनुक्रम उत्पन्न करता है। लेकिन अनुक्रम संख्याओं का लाभ अनुक्रम संख्या वस्तु एकल वर्ग तालिका के साथ सीमित नहीं है।

और msdn पर आप उपयोग के बारे में अधिक पढ़ सकते हैं और हमें इसकी आवश्यकता क्यों है ( यहां ):

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

क्रिएट सीन स्टेटमेंट का उपयोग करके तालिकाओं के स्वतंत्र रूप से एक सीक्वेंस बनाया जाता है। विकल्प आपको वृद्धि, अधिकतम और न्यूनतम मान, प्रारंभिक बिंदु, स्वचालित पुनरारंभ क्षमता और प्रदर्शन में सुधार के लिए कैशिंग को नियंत्रित करने में सक्षम करते हैं। विकल्पों के बारे में जानकारी के लिए, सृजन की आवश्यकता देखें।

पहचान कॉलम मानों के विपरीत, जो पंक्तियों को सम्मिलित किए जाने पर उत्पन्न होते हैं, एक अनुप्रयोग अगले क्रम संख्या को फ़ंक्शन के लिए कॉल करके पंक्ति सम्मिलित करने से पहले अगला अनुक्रम संख्या प्राप्त कर सकता है। अनुक्रम संख्या आवंटित की जाती है, जब NEXT VALUE के लिए बुलाया जाता है, भले ही संख्या किसी तालिका में सम्मिलित न हो। फ़ंक्शन के लिए NEXT VALUE का उपयोग तालिका परिभाषा में स्तंभ के लिए डिफ़ॉल्ट मान के रूप में किया जा सकता है। एक साथ कई अनुक्रम संख्याओं की एक सीमा प्राप्त करने के लिए sp_fterence_get_range का उपयोग करें।

एक अनुक्रम को किसी भी पूर्णांक डेटा प्रकार के रूप में परिभाषित किया जा सकता है। यदि डेटा प्रकार निर्दिष्ट नहीं है, तो अनुक्रम अनुक्रम bigint के लिए चूक जाता है।


21

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

यदि आपके पास एक ऐसा परिदृश्य है जहाँ आपको विश्व स्तर पर (कई तालिकाओं में) एक ऑटो नंबर बनाए रखने की आवश्यकता है, तो आपको विशेष संख्या के बाद अपने अंतराल को फिर से शुरू करने की आवश्यकता है और आपको इसे प्रदर्शन के लिए भी कैश करने की आवश्यकता है, यहां वह स्थान है जहां हमें अनुक्रम की आवश्यकता है और नहीं पहचान।


14

हालांकि अनुक्रम पहचान स्तंभों की तुलना में अधिक लचीलापन प्रदान करते हैं, मुझे नहीं लगा कि उनके पास कोई प्रदर्शन लाभ था।

मैंने पाया कि बैच आवेषण के लिए अनुक्रम का उपयोग करने से पहचान का उपयोग प्रदर्शन लगातार 3 गुना तेज था।

मैंने लगभग 1.5M पंक्तियाँ और प्रदर्शन डाला:

  • पहचान के लिए 14 सेकंड
  • अनुक्रम के लिए 45 सेकंड

मैंने एक तालिका में पंक्तियाँ डालीं, जो तालिका डिफ़ॉल्ट के माध्यम से अनुक्रम ऑब्जेक्ट का उपयोग करती है:

NEXT VALUE for <seq> for <col_name>

और चुनिंदा कथन में अनुक्रम मान निर्दिष्ट करने का भी प्रयास किया:

SELECT NEXT VALUE for <seq>, <other columns> from <table>

दोनों पहचान विधि की तुलना में समान कारक थे। मैंने अनुक्रम के लिए डिफ़ॉल्ट कैश विकल्प का उपयोग किया।

अरियन की पहली कड़ी में संदर्भित लेख पंक्ति-दर-पंक्ति प्रविष्टि के लिए प्रदर्शन दिखाता है और पहचान और अनुक्रम के बीच का अंतर 10,000 आवेषण के लिए 16.6 सेकंड से 14.3 सेकंड था।

कैशिंग विकल्प के प्रदर्शन पर एक बड़ा प्रभाव पड़ता है, लेकिन उच्च संस्करणों (+ 1M पंक्तियों) के लिए पहचान तेज़ होती है

Utly4life की टिप्पणी के अनुसार एक अनिश्चित विश्लेषण के लिए इस लिंक को देखें ।


अनुक्रम का कैश आकार क्या था।
शैनन सेवरेंस

50, इसे बढ़ाने से फर्क पड़ता है, लेकिन मुझे याद है कि पहचान अभी भी तेज थी।
स्टैग

2
byobi.com/blog/2012/09/… विभिन्न विन्यासों की एक अच्छी विस्तृत तुलना प्रदान करता है। 50 से 500 तक कैश आकार में वृद्धि से पता चलता है कि लगभग 2x गति अंतर है।
22

क्या आप सुझाव दे रहे हैं कि पहचान स्तंभ की तुलना में क्रम धीमा है? मुझे एक विपरीत प्रभाव पड़ा क्योंकि दृश्यों में पहचान के विपरीत स्मृति होती है जो डिस्क से प्राप्त होती है। आपके निष्कर्ष काफी आश्चर्यजनक हैं। खुशी है कि आपने साझा किया।
RBT

1
अनुक्रम के साथ आप alter sequence increment by ...बस अपनी नई पंक्तियों के लिए जगह बनाने के लिए बैच इंसर्ट प्रदर्शन का अनुकूलन कर सकते हैं और फिर आधार + row_number () या वास्तविक मानों के लिए जो भी उपयोग करें।
गोर्डी

5

मुझे पता है कि यह थोड़ा पुराना है, लेकिन मुझे थोड़ा सा अवलोकन करना चाहता है।

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


3

मुझे लगता है कि अनुक्रम का सबसे अच्छा उपयोग एक पहचान कॉलम को बदलने के लिए नहीं है, बल्कि एक "ऑर्डर नंबर" फ़ील्ड बनाने के लिए है।

दूसरे शब्दों में, एक ऑर्डर नंबर अंतिम उपयोगकर्ता के सामने आता है और इसके साथ व्यावसायिक नियम भी हो सकते हैं। आप चाहते हैं कि यह अद्वितीय हो, लेकिन सिर्फ एक पहचान कॉलम का उपयोग करना वास्तव में सही नहीं है।

उदाहरण के लिए, अलग-अलग प्रकार के ऑर्डर के लिए अलग-अलग अनुक्रम की आवश्यकता हो सकती है, इसलिए आपके पास इन-हाउस ऑर्डर के विपरीत इंटरनेट ऑर्डर के लिए एक अनुक्रम हो सकता है।

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


1

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

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql-identity-property?view=sql-server-2017

सर्वर पुनरारंभ या अन्य विफलताओं के बाद लगातार मान - SQL सर्वर प्रदर्शन कारणों के लिए पहचान मानों को कैश कर सकता है और कुछ निर्दिष्ट मान डेटाबेस विफलता या सर्वर पुनरारंभ के दौरान खो सकते हैं। यह डालने पर पहचान मूल्य में अंतराल के परिणामस्वरूप हो सकता है। यदि अंतराल स्वीकार्य नहीं हैं, तो अनुप्रयोग को महत्वपूर्ण मान उत्पन्न करने के लिए अपने स्वयं के तंत्र का उपयोग करना चाहिए। NOCACHE विकल्प के साथ एक अनुक्रम जनरेटर का उपयोग करने वाले लेनदेन के अंतराल को सीमित कर सकते हैं जो कभी भी प्रतिबद्ध नहीं हैं।


1
इस बात का बहुत अच्छा जवाब है कि आप IDENTITYनंबर लिंक को क्यों छोड़ रहे हैं और SEQUENCEइसमें उसी तरह की समस्या है जैसा कि यहाँ वर्णित लिंक पर है लेकिन आप इसे एक छोटे CACHE आकार को सेट करके सीमित कर सकते हैं लेकिन फिर भी गति के साथ व्यापार बंद है।
मृफिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.