Срещате това поведение поради подобрение на производителността след SQL Server 2012.
Сега по подразбиране използва размер на кеша от 1000, когато разпределя IDENTITY стойности за int колона и рестартирането на услугата може да "загуби" неизползвани стойности (Размерът на кеша е 10 000 за bigint /numeric ).
Това е посочено в документацията
SQL Server може да кешира стойностите на самоличността от съображения за производителност и някои от присвоените стойности могат да бъдат загубени по време на повреда на базата данни или рестартиране на сървъра. Това може да доведе до пропуски в стойността на идентичността при вмъкване. Ако пропуските не са приемливи, приложението трябва да използва свой собствен механизъм за генериране на ключови стойности. Използване на генератор на последователности с
NOCACHEопцията може да ограничи пропуските до транзакции, които никога не са ангажирани.
От данните, които сте показали, изглежда, че това се е случило след въвеждането на данни за 22 декември, а след това, когато се рестартира, SQL Server запази стойностите 1206306 - 1207305 . След въвеждане на данни за 24 - 25 декември беше направено ново рестартиране и SQL Server запази следващия диапазон 1207306 - 1208305 видимо в записите за 28.
Освен ако не рестартирате услугата с необичайна честота, е малко вероятно всички „загубени“ стойности да направят значителна вдлъбнатина в диапазона от стойности, разрешени от типа данни, така че най-добрата политика е да не се притеснявате за това.
Ако това по някаква причина е реален проблем за вас, някои възможни решения са...
- Можете да използвате
SEQUENCEвместо колона за идентичност и дефинирайте например по-малък размер на кеша и използвайтеNEXT VALUE FORв колона по подразбиране. - Или приложете флаг за проследяване 272, който прави
IDENTITYразпределението се регистрира както във версии до 2008 R2. Това се отнася глобално за всички бази данни. - Или за последните версии изпълнете
ALTER DATABASE SCOPED CONFIGURATION SET IDENTITY_CACHE = OFFза да деактивирате кеширането на самоличността за конкретна база данни.
Трябва да сте наясно, че никое от тези заобиколни решения не гарантира липса на пропуски. Това никога не е било гарантирано от IDENTITY тъй като това би било възможно само чрез сериализиране на вмъквания към таблицата. Ако имате нужда от колона без празнини, ще трябва да използвате различно решение от IDENTITY или SEQUENCE