2013-08-26 6 views
9

हम एसक्यूएल सर्वर चला रहे हैं 2012 SP1 x64 (11.0.3000.0)एसक्यूएल सर्वर: प्राथमिक कुंजी

के मनमाने ढंग से ऑटो वेतन वृद्धि मैं ऑटो incrementing के रूप में InvoiceId क्षेत्र, प्राथमिक कुंजी के साथ निम्न तालिका:

CREATE TABLE Orders(
    InvoiceId   bigint   IDENTITY(1001,1) NOT FOR REPLICATION, 
    OrderId    varchar(8)  NOT NULL, 
    ... -- other fields removed for brevity 
    CONSTRAINT [PK_ORDERS] PRIMARY KEY CLUSTERED (InvoiceId) 
    ON [PRIMARY], 
) 

नई पंक्तियों डाला जाता है, हालांकि की तरह एक साधारण संग्रहीत प्रक्रिया के बाद:

SET XACT_ABORT ON 
SET NOCOUNT ON 

BEGIN TRANSACTION 
    INSERT INTO Orders(
      OrderId, 
      ... -- other fields removed for brevity 
     ) 
    VALUES (
      @orderId, 
      ... 
     )    

    SELECT @newRowId = SCOPE_IDENTITY() 
COMMIT TRANSACTION 

ऊपर sproc रिटर्न पंक्ति-आईडी नव निर्मित (Orders.InvoiceId) कॉलर के लिए।

कोड [InvoiceId] 1001 से शुरू करने और प्रत्येक उत्तरोत्तर आवेषण के लिए 1 से incrementing के साथ पूरी तरह काम कर रहा था,।

हमारे उपयोगकर्ताओं को लगभग 130 पंक्तियाँ सम्मिलित किया गया। [InvoiceId] 1130 में किया गया था, तो अगले डालने पर अपने मूल्य पर पहुंच!

data

मैं क्या सिर्फ यहाँ क्या हुआ है के रूप में विस्मित कर रहा हूँ:

यहाँ डेटा स्क्रीनशॉट है। ऑटो-इंक काउंटर अचानक 10,000 अंक क्यों छोड़ गया?

हम बारकोड उत्पन्न करने के लिए [InvoiceId] के मान का उपयोग कर रहे हैं, इसलिए हम मूल्य को एक विशिष्ट श्रृंखला में रहना पसंद करेंगे, अधिमानतः एक संगत श्रृंखला में।

मैं T-SQL प्रलेखन अवलोकन लेकिन मेरी समस्या से संबंधित कुछ भी खोजने में असफल रहा है। क्या यह पहचान क्षेत्र का सामान्य व्यवहार (मनमाना आबादी) है?

अद्यतन धन्यवाद Marting & एरन के लिए, मैं एक काम के आसपास पाया है। यहाँ official response Microsoft से है:

एसक्यूएल सर्वर 2012 में पहचान संपत्ति के कार्यान्वयन अन्य सुविधाओं में निवेश की सुविधा के लिए बदल दिया गया है। SQL सर्वर के पिछले संस्करणों में पहचान पीढ़ी की ट्रैकिंग उत्पन्न प्रत्येक पहचान मूल्य के लिए लेन-देन लॉग रिकॉर्ड पर भरोसा किया। एसक्यूएल सर्वर 2012 में हम बैचों में पहचान मूल्यों पैदा करते हैं और केवल बैच की अधिकतम मूल्य लॉग इन करें। इससे की लेन-देन लॉग में लिखी गई जानकारी स्केलेबिलिटी में सुधार की मात्रा और आवृत्ति को कम कर देता है।

आप एक ही पहचान पीढ़ी अर्थ विज्ञान की आवश्यकता के रूप में एसक्यूएल सर्वर के पिछले संस्करणों दो विकल्प उपलब्ध हैं, तो:

• उपयोग ट्रेस ध्वज 272 ओ इस कारण होगा एक लॉग रिकॉर्ड प्रत्येक उत्पन्न पहचान के लिए उत्पन्न करने मूल्य। पहचान उत्पादन का प्रदर्शन इस ट्रेस ध्वज को चालू करके प्रभावित हो सकता है।

उपयोग • कोई कैश सेटिंग (http://msdn.microsoft.com/en-us/library/ff878091.aspx) ओ यह साथ एक दृश्य जनरेटर एक लॉग रिकॉर्ड प्रत्येक उत्पन्न अनुक्रम मूल्य के लिए उत्पन्न होने का कारण होगा। ध्यान दें कि अनुक्रम मूल्य निर्माण का प्रदर्शन कोई कैच का उपयोग करके प्रभावित हो सकता है।

उदाहरण:

CREATE SEQUENCE s1 AS INT START WITH 1 NO CACHE; 
CREATE TABLE t1 (Id INT PRIMARY KEY DEFAULT NEXT VALUE FOR s1, col INT NOT NULL); 
+5

'IDENTITY' सन्निहित गारंटी नहीं है, लेकिन वर्ष 2012 में जहां यह अचानक सेवा पुनरारंभ करने के बाद बड़े अंतराल छोड़ने कूद कर सकते हैं में एक ज्ञात समस्या है। –

+0

धन्यवाद @ मार्टिनस्मिथ! यह मेरे मामले में मुद्दा लगता है। मुझे पहचान वृद्धि कूदने से पहले डीबी मशीन को रिबूट करना याद है! मैं इससे कैसे बच सकता हूं? – masroore

+1

आप निश्चित रूप से इससे बच नहीं सकते क्योंकि संगतता की गारंटी कभी नहीं दी गई थी, लेकिन एक ट्रेस ध्वज है जिसे आप धीरे-धीरे (लॉग) 2008 व्यवहार प्राप्त करने के लिए सेट कर सकते हैं या आप छोटे कैश आकार के साथ अनुक्रम का उपयोग कर सकते हैं। [यहां चर्चा] देखें [https://connect.microsoft.com/SQLServer/feedback/details/739013/failover-or-restart-results-in-reseed-of-identity) –

उत्तर

2

अद्यतन & Aron मार्ट करने के लिए धन्यवाद, मुझे एक काम मिल गया है। माइक्रोसॉफ्ट से आधिकारिक प्रतिक्रिया यहां दी गई है:

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

आप SQL सर्वर के पिछले संस्करणों के रूप में ही पहचान पीढ़ी अर्थ विज्ञान की आवश्यकता होती है वहाँ दो उपलब्ध विकल्प हैं:

• का प्रयोग करें ट्रेस ध्वज 272 ओ इस कारण होगा एक लॉग रिकॉर्ड प्रत्येक उत्पन्न पहचान मूल्य के लिए उत्पन्न किया जा करने के लिए। इस ट्रेस ध्वज को चालू करके पहचान पीढ़ी का प्रदर्शन प्रभावित हो सकता है।

• कोई कैच सेटिंग (http://msdn.microsoft.com/en-us/library/ff878091.aspx) के साथ अनुक्रम जनरेटर का उपयोग करें o यह प्रत्येक जेनरेट अनुक्रम मान के लिए लॉग रिकॉर्ड उत्पन्न करने का कारण बनता है। ध्यान दें कि अनुक्रम मूल्य उत्पादन का प्रदर्शन कोई कैच का उपयोग करके प्रभावित किया जा सकता है।

उदाहरण:

CREATE SEQUENCE s1 AS INT START WITH 1 NO CACHE; 
CREATE TABLE t1 (Id INT PRIMARY KEY DEFAULT NEXT VALUE FOR s1, col INT NOT NULL); 
0

वैकल्पिक रूप से, आप काउंटर के साथ एक समर्पित तालिका हो सकता है। यह एक अच्छा डिजाइन पैटर्न नहीं है लेकिन यह आपको पहचान के काम के पूर्ण नियंत्रण में डाल देता है।

संबंधित मुद्दे