web-dev-qa-db-fra.com

La valeur de la colonne d'identité passe soudainement à 1001 dans le serveur SQL

J'utilise le serveur SQL 2012 (Denali). Je me demande pourquoi toutes les valeurs de colonne d'identité commencent à 1001 et ainsi de suite. Au début, la colonne Identity commence à partir de 1,2 et ainsi de suite et ajoute une identité en douceur, mais soudain, elle passe à 1001 1002 et plus pour toute la table de la base de données contenant la colonne d'identité. Quelle pourrait être la raison? Veuillez aider.

47
Rajaram Shelar

Microsoft a changé la façon dont ils traitent les valeurs d'identité dans SQL Server 2012 et, par conséquent, vous pouvez voir les écarts d'identité entre vos enregistrements après le redémarrage de votre instance de serveur SQL ou de votre machine serveur. Il peut y avoir d'autres raisons à ces écarts d'ID, cela peut être dû au redémarrage automatique du serveur après l'installation d'une mise à jour.

Vous pouvez utiliser ci-dessous deux choix

  • Utiliser l'indicateur de trace 272 o Cela entraînera la génération d'un enregistrement de journal pour chaque valeur d'identité générée. Les performances de la génération d'identité peuvent être affectées en activant cet indicateur de trace.
  • Utiliser un générateur de séquence avec le paramètre NO CACHE

    Définition de l'indicateur de trace 272 sur SQL Server 2012 que vous attendez ici

  • Ouvrez "SQL Server Configuration Manager"

  • Cliquez sur "SQL Server Services" dans le volet gauche
  • Cliquez avec le bouton droit sur le nom de votre instance SQL Server dans le volet droit -> Par défaut: SQL Server (MSSQLSERVER)
  • Cliquez sur "Propriétés"
  • Cliquez sur "Paramètres de démarrage"
  • Dans la zone de texte "spécifier un paramètre de démarrage", tapez "-T272"
  • Cliquez sur "Ajouter"
  • Confirmer les modifications
73
Kitty

Je pense que vous avez l'explication dans un commentaire sur cet élément de connexion. Le basculement ou le redémarrage entraîne un rétablissement de l'identité

Pour augmenter les performances des machines haut de gamme, nous introduisons une préallocation pour la valeur d'identité en 2012. Et cette fonctionnalité peut être désactivée en utilisant TF 272 (vous obtiendrez alors le comportement de 2008R2).

Les propriétés d'identité sont stockées séparément dans des métadonnées. Si une valeur est utilisée dans l'identité et que l'incrément est appelé, la nouvelle valeur de départ sera définie. Aucune opération, y compris Rollback, Failover, ..... ne peut modifier la valeur de départ sauf le réamorçage DBCC. Le basculement s'applique à l'objet table, mais pas à l'objet identité. Ainsi, pour le basculement, vous pouvez appeler le point de contrôle avant le basculement manuel, mais vous pouvez voir un écart pour les cas non planifiés. Si l'écart est un problème, je vous suggère d'utiliser TF 272.

Pour l'arrêt du gestionnaire de contrôle, nous avons un correctif pour la prochaine version (avec un autre TF). Cette correction prendra en charge la plupart des cas d'arrêt du gestionnaire de contrôle.

12
Mikael Eriksson

Je suppose que vous pouvez utiliser la séquence à la place, la séquence vous donne un contrôle complet à 100% et est à bien des égards bien supérieure à l'identité ... L'identité est tellement facile et pratique

http://msdn.Microsoft.com/en-us/library/ff878091.aspx

Pour autant que je sache, lorsque vous effectuez une insertion avec identité et échoue, l'identité est utilisée de toute façon, Vérifié

avec la séquence, vous pouvez le faire "combler" les lacunes en utilisant le cycle. Bien que, comme le souligne Amy Barrett, cela est créé hors de la portée de la transaction.

Il existe une optimisation des performances lorsque vous utilisez un cache qui peut également être utile.

1
Christopher Bonitz