अनुक्रम पुन: उपयोग कर रहा है


11

मेरे पास एक अनुक्रम है जो मेरे सिस्टम में ऑब्जेक्ट्स के लिए ट्रैकिंग नंबर उत्पन्न करता है। यह काफी समय से ठीक काम कर रहा था।

पिछले हफ्ते हमने देखा कि यह मूल्यों का फिर से उपयोग करना शुरू कर रहा था।

ऐसा प्रतीत होता है कि शाम को विभिन्न बिंदुओं पर, यह उस मूल्य पर रोलबैक होगा जो पिछले दिन था। यह उस बिंदु से मान उत्पन्न करना जारी रखेगा।

इसलिए उदाहरण के लिए मुझे कुछ इस तरह मिल सकता है:

10112
+१०११३
10114
10115
10116
10117
10118
+१०११३
10114
10115
10116
...

ऐसा होने पर कोई भी पैटर्न प्रतीत नहीं होता है, पहले उपयोग और दूसरे उपयोग के बीच की अवधि (कुछ 10 मिनट या कई घंटे के रूप में) या कितने वापस रोल किए गए हैं (कुछ के रूप में 1 और कई सौ के रूप में)।

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

क्या किसी को इस बात का अंदाजा है कि हर रात एक सीक्वेंस रोलबैक और पुन: उपयोग मूल्यों का क्या कारण हो सकता है?

अद्यतन: टिप्पणियों में कुछ सवालों के जवाब देने के लिए:

  • @@Version:

    Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) अक्टूबर 19 2012 13:38:57

  • स्क्रिप्ट बनाएँ:

    CREATE SEQUENCE [schemaName].[SequenceName] 
      AS [bigint]
      START WITH 410014104
      INCREMENT BY 1
      MINVALUE 410000000
      MAXVALUE 419999999
      CYCLE 
      CACHE 
    GO
    
  • मेरे पास एक अद्वितीय बाधा नहीं है (लेकिन मैं एक को डालने की योजना बना रहा हूं)। हालांकि, यह केवल मुझे यह जानने में मदद करेगा कि मैंने कब एक मूल्य का पुन: उपयोग किया है। मानों को रीसेट करने का क्या कारण है। मैंने उस पर एक नौकरी लगाई, जिसे हर 5 मिनट में एक नया मूल्य मिल जाएगा। समय और मूल्य कूद एक पैटर्न का पालन नहीं करते हैं।

  • यदि कोई त्रुटि है, तो मैंने इवेंट लॉग की जाँच की है। केवल यही लगता है कि यह हो रहा है: http://support.microsoft.com/kb/2793634 आज हम ठीक कर रहे हैं। मुझे नहीं लगता कि ये संबंधित हैं, लेकिन यह हो सकता है।

1
इस स्तंभ पर कोई PK या विशिष्ट बाधा क्यों नहीं है? उस जगह में के साथ, इस पुन: उपयोग पकड़े जाएगा, और आप अनुमान लगाना यह जहां, से आ रहा है की कोशिश करने की जरूरत नहीं है, जब तक कि आपके आवेदन कोड सिर्फ सभी त्रुटियों को ... निगल
हारून बर्ट्रेंड


क्या आप अपने अनुक्रम की परिभाषा दिखा सकते हैं? क्या आप यह देखने के लिए त्रुटि लॉग की जांच कर सकते हैं कि क्या कोई महत्वपूर्ण घटना रातोंरात हुई है (जैसे कि विफलता, सेवा पुनरारंभ, स्मृति समस्याएं, आदि)?
हारून बर्ट्रेंड

2
क्या है @@VERSION? पर्यावरण के बारे में भी कुछ बदला है? कुछ इसी तरह की रिपोर्ट करने के लिए एक कनेक्ट आइटम है । ओपी ने कहा कि यह संबद्ध है11.0.3000.0
मार्टिन स्मिथ

2
ठीक है, CYCLE अनिवार्य रूप से SQL सर्वर को बताता है कि आप पुन: उपयोग के मूल्यों के साथ ठीक हैं। मुझे इस बात का बिल्कुल पता नहीं है कि आप इस मुद्दे पर क्यों चल रहे हैं, और यह नहीं जानते कि आपको पता चलेगा कि (आपने कितना समय दिया, इसकी जाँच करने में आपको एक सपाट टायर क्यों मिला, इससे पहले कि आप इसे बदल दें?)। मुझे अभी भी लगता है कि आपका सबसे अच्छा दांव डुप्लिकेट को रोकने के लिए एक बाधा है, और पुन: उपयोग को रोकने की उम्मीद में कैशिंग को बंद करना है।
हारून बर्ट्रेंड

जवाबों:


11

सबसे पहले, यदि आप इस कॉलम में डुप्लिकेट नहीं चाहते हैं, तो स्पष्ट रूप से बताएं

ALTER TABLE dbo.whatever ADD CONSTRAINT uq_that_column UNIQUE (that_column);

(या हो सकता है कि आप प्राथमिक कुंजी बनाना चाहते हैं, या क्लस्टर इंडेक्स को बदल सकते हैं, या आपके पास क्या है ...)

किसी भी मामले में, जब आप डुप्लिकेट उत्पन्न करते हैं तो त्रुटि उत्पन्न करना केवल डुप्लिकेट सम्मिलित करने से बेहतर है कि आपको बाद में निपटना होगा।

इसके बाद, विचार करें कि SEQUENCE सिर्फ एक नंबर जनरेटर है, और डिफ़ॉल्ट रूप से इसमें 50 मानों का कैश होता है। इस बात पर निर्भर करता है कि आपके लेन-देन कैसे सेट किए जाते हैं, और सर्वर पर अन्य महत्वपूर्ण घटनाएं क्या होती हैं, यह संभव है कि SQL सर्वर "भूल" कर सकता है कि यह आपके लिए कुछ मान उत्पन्न करता है। क्षमा करें, लेकिन मुझे नहीं पता कि इस बग को पुन: पेश करने में कौन से मापदंड कारक हैं। इसके आसपास जाने का तरीका (जब तक कि बग को हल नहीं किया जाता / समझाया जाता है ) का उपयोग करने के लिए अनुक्रम को बदलना है NO CYCLEऔर NO CACHE, उदाहरण के लिए:

ALTER SEQUENCE dbo.mysequence NO CYCLE NO CACHE; 

ध्यान दें कि NO CACHEप्रदर्शन और संगामिति को प्रभावित कर सकता है, लेकिन अंतराल, खो ब्लॉकों और जो जानता है, शायद आपकी समस्या को भी खत्म करने में मदद करेगा।

आप यह भी सत्यापित कर सकते हैं कि आप सबसे हालिया सर्विस पैक और CU पर हैं। इस बिंदु पर मैं 3437 के साथ SP1 और CU10 की सलाह देता हूं ; SP2 बाहर है, लेकिन अभी भी एक महत्वपूर्ण समस्या है ऑनलाइन rebuilds के साथ जो आपको प्रभावित कर सकता है


खैर, मैं इसे समर्थन नहीं कर सकता। इसलिए अगर कोई CACHE इसे ठीक नहीं करेगा, तो मैं यही करूंगा।
टीका

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

पता चला है कि बस के साथ इसे स्थापित करने के NO CYCLEलिए पर्याप्त था। (कम से कम यह कल रात नहीं हुआ।) मदद के लिए धन्यवाद!
टीका

1
FIX: अनुक्रम ऑब्जेक्ट डुप्लिकेट अनुक्रम मान तब उत्पन्न करता है जब SQL Server 2012 या SQL Server 2014 मेमोरी प्रेशर के अंतर्गत होता है। मान लें कि आप एक सीक्वेंस ऑब्जेक्ट बनाते हैं जिसमें CACHE विकल्प सक्षम किया गया है Microsoft SQL Server 2012 या SQL Server 2014। जब आवृत्ति स्मृति दबाव में हो , और कई समवर्ती कनेक्शन समान अनुक्रम ऑब्जेक्ट से अनुक्रम मान का अनुरोध करते हैं, डुप्लिकेट अनुक्रम मान उत्पन्न हो सकते हैं। इसके अलावा, एक अद्वितीय या प्राथमिक कुंजी (PK) उल्लंघन त्रुटि तब होती है जब डुप्लिकेट अनुक्रम मान एक तालिका में डाला जाता है।
एंडोमर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.