sql >> Database teknologi >  >> RDS >> Sqlserver

Identitetsstigningen hopper i SQL Server-databasen

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...

  1. Du kan bruge en SEQUENCE i stedet for en identitetskolonne og definere en mindre cachestørrelse for eksempel og brug NEXT VALUE FOR i en kolonnestandard.
  2. Eller anvend sporingsflag 272, som gør IDENTITY allokering logget som i versioner op til 2008 R2. Dette gælder globalt for alle databaser.
  3. 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



  1. Få poster med maks. værdi for hver gruppe af grupperede SQL-resultater

  2. Sådan finder du forskellen mellem to datoer i MySQL

  3. MySQL Fire Trigger til både Insert og Update

  4. Rutinemæssige anbefalinger til sikkerhedskopiering af indhold