Du stöter på detta beteende på grund av en prestandaförbättring sedan SQL Server 2012.
Den använder nu som standard en cachestorlek på 1 000 vid tilldelning av IDENTITY
värden för en int
kolumnen och omstart av tjänsten kan "förlora" oanvända värden (cachestorleken är 10 000 för bigint
/numeric
).
Detta nämns i dokumentationen
SQL Server kan cache identitetsvärden av prestandaskäl och några av de tilldelade värdena kan gå förlorade under ett databasfel eller omstart av servern. Detta kan resultera i luckor i identitetsvärdet vid insättning. Om luckor inte är acceptabla bör applikationen använda sin egen mekanism för att generera nyckelvärden. Använda en sekvensgenerator med
NOCACHE
alternativet kan begränsa luckorna till transaktioner som aldrig har genomförts.
Från de data du har visat ser det ut som att detta hände efter datainmatningen för den 22 december och då den startade om reserverade SQL Server värdena 1206306 - 1207305
. Efter att datainmatning för 24 - 25 december gjordes en ny omstart och SQL Server reserverade nästa intervall 1207306 - 1208305
syns i inläggen för den 28:e.
Såvida du inte startar om tjänsten med ovanlig frekvens är det osannolikt att några "förlorade" värden kommer att göra någon betydande buckla i värdeintervallet som tillåts av datatypen, så den bästa policyn är att inte oroa dig för det.
Om detta av någon anledning är ett verkligt problem för dig är några möjliga lösningar...
- Du kan använda en
SEQUENCE
istället för en identitetskolumn och definiera en mindre cachestorlek till exempel och användNEXT VALUE FOR
i en kolumn standard. - Eller använd spårningsflagga 272 som gör
IDENTITY
allokering loggas som i versioner upp till 2008 R2. Detta gäller globalt för alla databaser. - Eller, för de senaste versionerna, kör
ALTER DATABASE SCOPED CONFIGURATION SET IDENTITY_CACHE = OFF
för att inaktivera identitetscachelagring för en specifik databas.
Du bör vara medveten om att ingen av dessa lösningar garanterar inga luckor. Detta har aldrig garanterats av IDENTITY
eftersom det bara skulle vara möjligt genom att serialisera inlägg till tabellen. Om du behöver en spaltfri kolumn måste du använda en annan lösning än någon av IDENTITY
eller SEQUENCE