MASSIVE Salto del valore della colonna Identity in SQL Server 2014
Quindi, nel bel mezzo della codifica e dei test di base, abbiamo visto un enorme salto non modellato nei valori di Identity per più tabelle. Non siamo a conoscenza di problemi di funzionamento del server o tentativi di operazioni in blocco, ma i DBA stanno esaminando i log.
I gap non sono i tipici 1.000 o 10.000 visti con i riavvii del server e simili.
Il divario per Application_NO
è 10.410.345 per una tabella con 2.320 righe
Transaction_Payment_NO
è balzato di un sorprendente 1.712.149.313 per un tavolo con 685 record.
Qualche idea su cosa potrebbe causare salti così grandi e apparentemente arbitrari?

Risposte
Alcuni possibili colpevoli:
- il processo di test crea molte righe in una transazione e quindi esegue il rollback della transazione
Questo sembra il motivo più probabile, come hai detto che stai attualmente facendo dei test. Forse sono in esecuzione alcuni test automatizzati che apportano modifiche a tali tabelle, verificano i risultati e quindi ripristinano le modifiche.
I valori di identità non vengono riutilizzati dopo che è stato eseguito il rollback di una transazione, che è ciò che fa sì che tu veda grandi lacune in questo scenario.
- Qualcuno ha usato il
RESEED
comando
Puoi modificare manualmente il valore corrente della "prossima identità" con questo comando:
DBCC CHECKIDENT ('dbo.Transaction_Payment_NO', RESEED, 1712149313);
Questo sembra meno probabile, perché tu o uno degli amministratori dovreste fare di tutto per farlo. Allo stesso modo...
- Qualcuno ha inserito quei valori manualmente
Puoi inserire quello che vuoi in una IDENTITY
colonna eseguendo prima questa istruzione:
SET IDENTITY_INSERT dbo.Transaction_Payment_NO ON;
- Failover e riavvii
Ne hai parlato nella domanda, ma solo per completezza: SQL Server memorizza nella cache i valori di identità per migliorare le prestazioni. Ma quei valori di identità pre-allocati possono andare persi se il servizio viene riavviato o si verifica un failover AG. Ciò porta tuttavia a lacune più prevedibili (10.000 nelle versioni moderne di SQL Server).