SQL सर्वर 2012 के बाद से प्रदर्शन में सुधार के कारण आप इस व्यवहार का सामना कर रहे हैं।
यह अब डिफ़ॉल्ट रूप से IDENTITY
. आवंटित करते समय 1,000 के कैश आकार का उपयोग करता है int
. के लिए मान कॉलम और सेवा को पुनरारंभ करने से अप्रयुक्त मान "खो" सकते हैं (कैश आकार 10,000 है bigint
के लिए /numeric
)
दस्तावेज़ीकरण में इसका उल्लेख किया गया है
<ब्लॉकक्वॉट>
SQL सर्वर प्रदर्शन कारणों से पहचान मानों को कैश कर सकता है और कुछ असाइन किए गए मान डेटाबेस विफलता या सर्वर पुनरारंभ होने के दौरान खो सकते हैं। इसके परिणामस्वरूप डालने पर पहचान मूल्य में अंतराल हो सकता है। यदि अंतराल स्वीकार्य नहीं हैं तो एप्लिकेशन को प्रमुख मान उत्पन्न करने के लिए अपने स्वयं के तंत्र का उपयोग करना चाहिए। NOCACHE
. के साथ अनुक्रम जनरेटर का उपयोग करना विकल्प अंतराल को उन लेन-देन तक सीमित कर सकता है जो कभी प्रतिबद्ध नहीं हैं।
आपके द्वारा दिखाए गए डेटा से ऐसा लगता है कि यह 22 दिसंबर के लिए डेटा प्रविष्टि के बाद हुआ, फिर जब SQL सर्वर ने फिर से शुरू किया तो मान 1206306 - 1207305
आरक्षित कर दिया। . 24 - 25 दिसंबर के लिए डेटा प्रविष्टि के बाद एक और पुनरारंभ किया गया और SQL सर्वर ने अगली श्रेणी 1207306 - 1208305
आरक्षित कर दी 28 तारीख की प्रविष्टियों में दिखाई दे रहा है।
जब तक आप असामान्य आवृत्ति के साथ सेवा को फिर से शुरू नहीं कर रहे हैं, तब तक किसी भी "खोए हुए" मूल्यों से डेटाटाइप द्वारा अनुमत मूल्यों की सीमा में कोई महत्वपूर्ण सेंध लगाने की संभावना नहीं है, इसलिए सबसे अच्छी नीति इसके बारे में चिंता करने की नहीं है।
यदि यह किसी कारण से आपके लिए एक वास्तविक समस्या है तो कुछ संभावित समाधान हैं...
- आप एक
SEQUENCE
का उपयोग कर सकते हैं एक पहचान कॉलम के बजाय और उदाहरण के लिए एक छोटे कैश आकार को परिभाषित करें औरNEXT VALUE FOR
का उपयोग करें एक कॉलम में default. - या ट्रेस फ़्लैग 272 लागू करें जो
IDENTITY
बनाता है 2008 R2 तक के संस्करणों में आवंटन लॉग किया गया। यह विश्व स्तर पर सभी डेटाबेस पर लागू होता है। - या, हाल के संस्करणों के लिए,
ALTER DATABASE SCOPED CONFIGURATION SET IDENTITY_CACHE = OFF
निष्पादित करें विशिष्ट डेटाबेस के लिए पहचान कैशिंग अक्षम करने के लिए।
आपको पता होना चाहिए कि इनमें से कोई भी समाधान अंतराल नहीं होने का आश्वासन देता है। इसकी कभी भी IDENTITY
द्वारा गारंटी नहीं दी गई है क्योंकि यह केवल तालिका में प्रविष्टियों को क्रमबद्ध करके ही संभव होगा। अगर आपको एक गैपलेस कॉलम की जरूरत है, तो आपको IDENTITY
. के अलावा किसी अन्य समाधान का उपयोग करने की आवश्यकता होगी या SEQUENCE