sql >> Databasteknik >  >> RDS >> Sqlserver

Identitetsökningen hoppar i SQL Server-databasen

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

  1. Du kan använda en SEQUENCE istället för en identitetskolumn och definiera en mindre cachestorlek till exempel och använd NEXT VALUE FOR i en kolumn standard.
  2. 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.
  3. 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



  1. Säkerhetskopiera endast SQL-schema?

  2. Använder sp_help_schedule i SQL Server

  3. Android - Bättre tillvägagångssätt för att ladda SD-KORT-bilder

  4. Infoga en bild i postgresql-databasen