Du støder på denne adfærd på grund af en forbedring af ydeevnen siden SQL Server 2012.
Den bruger nu som standard en cachestørrelse på 1.000 ved tildeling af IDENTITY
værdier for en int
kolonne og genstart af tjenesten kan "tabe" ubrugte værdier (cachestørrelsen er 10.000 for bigint
/numeric
).
Dette er nævnt i dokumentationen
SQL Server kan cache identitetsværdier af ydeevneårsager, og nogle af de tildelte værdier kan gå tabt under en databasefejl eller genstart af serveren. Dette kan resultere i huller i identitetsværdien ved indsættelse. Hvis huller ikke er acceptable, skal applikationen bruge sin egen mekanisme til at generere nøgleværdier. Brug af en sekvensgenerator med NOCACHE
option kan begrænse hullerne til transaktioner, der aldrig er forpligtet.
Ud fra de data, du har vist, ser det ud til, at dette skete efter dataindtastningen for 22. december, og da den genstartede, reserverede SQL Server værdierne 1206306 - 1207305
. Efter dataindtastning for 24. - 25. december blev genstartet igen, og SQL Server reserverede det næste område 1207306 - 1208305
ses i posterne for den 28.
Medmindre du genstarter tjenesten med en usædvanlig hyppighed, er det usandsynligt, at nogen "tabte" værdier vil gøre noget væsentligt indhug i rækkevidden af værdier, der tillades af datatypen, så den bedste politik er ikke at bekymre dig om det.
Hvis dette af en eller anden grund er et reelt problem for dig, er nogle mulige løsninger...
- Du kan bruge en
SEQUENCE
i stedet for en identitetskolonne og definere en mindre cachestørrelse for eksempel og brugNEXT VALUE FOR
i en kolonnestandard. - Eller anvend sporingsflag 272, som gør
IDENTITY
allokering logget som i versioner op til 2008 R2. Dette gælder globalt for alle databaser. - Eller, for nyere versioner, udfør
ALTER DATABASE SCOPED CONFIGURATION SET IDENTITY_CACHE = OFF
for at deaktivere identitetscachen for en bestemt database.
Du skal være opmærksom på, at ingen af disse løsninger sikrer, at der ikke er huller. Dette er aldrig blevet garanteret af IDENTITY
da det kun ville være muligt ved at serialisere indsatser til bordet. Hvis du har brug for en spaltefri kolonne, skal du bruge en anden løsning end enten IDENTITY
eller SEQUENCE