Si verifica questo comportamento a causa di un miglioramento delle prestazioni rispetto a SQL Server 2012.
Ora per impostazione predefinita utilizza una dimensione della cache di 1.000 durante l'allocazione di IDENTITY
valori per un int
colonna e il riavvio del servizio può "perdere" i valori inutilizzati (la dimensione della cache è 10.000 per bigint
/numeric
).
Questo è menzionato nella documentazione
SQL Server potrebbe memorizzare nella cache i valori di identità per motivi di prestazioni e alcuni dei valori assegnati possono andare persi durante un errore del database o il riavvio del server. Ciò può causare lacune nel valore di identità all'inserimento. Se le lacune non sono accettabili, l'applicazione dovrebbe utilizzare il proprio meccanismo per generare valori chiave. Utilizzo di un generatore di sequenze con il NOCACHE
l'opzione può limitare le lacune alle transazioni che non vengono mai impegnate.
Dai dati che hai mostrato sembra che ciò sia accaduto dopo l'immissione dei dati per il 22 dicembre, quindi quando è stato riavviato SQL Server ha riservato i valori 1206306 - 1207305
. Dopo l'immissione dei dati per il 24 - 25 dicembre è stato eseguito un altro riavvio e SQL Server ha riservato l'intervallo successivo 1207306 - 1208305
visibile nelle voci per il 28.
A meno che tu non riavvii il servizio con una frequenza insolita, è improbabile che i valori "persi" incidano in modo significativo nell'intervallo di valori consentiti dal tipo di dati, quindi la politica migliore è non preoccuparsene.
Se questo è per qualche motivo un vero problema per te, alcune possibili soluzioni alternative sono...
- Puoi usare una
SEQUENCE
invece di una colonna di identità e definire, ad esempio, una dimensione della cache più piccola e utilizzareNEXT VALUE FOR
in una colonna predefinita. - Oppure applica il flag di traccia 272 che rende
IDENTITY
allocazione registrata come nelle versioni fino al 2008 R2. Questo vale a livello globale per tutti i database. - Oppure, per le versioni recenti, eseguire
ALTER DATABASE SCOPED CONFIGURATION SET IDENTITY_CACHE = OFF
per disabilitare la memorizzazione nella cache dell'identità per un database specifico.
Dovresti essere consapevole che nessuna di queste soluzioni alternative non assicura lacune. Questo non è mai stato garantito da IDENTITY
come sarebbe possibile solo serializzando gli inserti nella tabella. Se hai bisogno di una colonna gapless, dovrai utilizzare una soluzione diversa da quella di IDENTITY
o SEQUENCE