Срещате това поведение поради подобрение на производителността след 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