Saut de valeur de colonne MASSIVE Identity dans SQL Server 2014

Aug 19 2020

Ainsi, au milieu du codage et des tests de base, nous avons constaté un énorme saut sans motif dans les valeurs d'identité pour plusieurs tables. Nous n'avons pas connaissance d'erreurs de serveur ou de tentatives d'opérations en masse, mais les administrateurs de bases de données examinent les journaux.

Les écarts ne sont pas les 1 000 ou 10 000 typiques observés avec les redémarrages de serveur et autres.

L'écart pour Application_NOest de 10 410 345 pour un tableau de 2 320 lignes

Transaction_Payment_NOa sauté un étonnant 1 712 149 313 pour une table avec 685 enregistrements.

Des idées sur ce qui pourrait causer des sauts aussi importants et apparemment arbitraires ?

Réponses

5 JoshDarnell Aug 19 2020 at 01:06

Quelques coupables possibles :

  1. le processus de test crée de nombreuses lignes dans une transaction, puis annule la transaction

Cela semble être la raison la plus probable, car vous avez mentionné que vous effectuez actuellement des tests. Il existe peut-être des tests automatisés en cours d'exécution qui apportent des modifications à ces tables, vérifient les résultats, puis annulent les modifications.

Les valeurs d'identité ne sont pas réutilisées après l'annulation d'une transaction, ce qui vous fait voir de grands écarts dans ce scénario.

  1. Quelqu'un a utilisé la RESEEDcommande

Vous pouvez modifier manuellement la valeur "next identity" actuelle avec cette commande :

DBCC CHECKIDENT ('dbo.Transaction_Payment_NO', RESEED, 1712149313);

Celui-ci semble moins probable, car vous ou l'un des administrateurs devrez faire tout votre possible pour le faire. De la même manière...

  1. Quelqu'un a inséré ces valeurs manuellement

Vous pouvez insérer ce que vous voulez dans une IDENTITYcolonne en exécutant d'abord cette instruction :

SET IDENTITY_INSERT dbo.Transaction_Payment_NO ON;
  1. Basculements et redémarrages

Vous l'avez mentionné dans la question, mais juste pour être complet - SQL Server met en cache les valeurs d'identité afin d'améliorer les performances. Mais ces valeurs d'identité pré-allouées peuvent être perdues si le service redémarre ou si un basculement AG se produit. Cela conduit cependant à des écarts plus prévisibles (10 000 sur les versions modernes de SQL Server).