Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Das Identitätsinkrement springt in der SQL Server-Datenbank

Dieses Verhalten tritt aufgrund einer Leistungsverbesserung seit SQL Server 2012 auf.

Es verwendet jetzt standardmäßig eine Cache-Größe von 1.000, wenn es IDENTITY zuweist Werte für ein int -Spalte und ein Neustart des Dienstes können unbenutzte Werte "verlieren" (Die Cache-Größe beträgt 10.000 für bigint /numeric ).

Dies wird in der Dokumentation erwähnt

SQL Server kann Identitätswerte aus Leistungsgründen zwischenspeichern, und einige der zugewiesenen Werte können während eines Datenbankausfalls oder Serverneustarts verloren gehen. Dies kann beim Einfügen zu Lücken im Identitätswert führen. Wenn Lücken nicht akzeptabel sind, sollte die Anwendung ihren eigenen Mechanismus verwenden, um Schlüsselwerte zu generieren. Verwendung eines Sequenzgenerators mit dem NOCACHE Option kann die Lücken auf Transaktionen begrenzen, die nie festgeschrieben werden.

Aus den von Ihnen gezeigten Daten geht hervor, dass dies nach der Dateneingabe für den 22. Dezember passiert ist und dann beim Neustart von SQL Server die Werte 1206306 - 1207305 reserviert wurden . Nach der Dateneingabe für den 24. - 25. Dezember erfolgte ein weiterer Neustart und SQL Server reservierte den nächsten Bereich 1207306 - 1208305 sichtbar in den Einträgen für den 28..

Wenn Sie den Dienst nicht ungewöhnlich häufig neu starten, ist es unwahrscheinlich, dass "verlorene" Werte den vom Datentyp zugelassenen Wertebereich erheblich beeinträchtigen. Daher ist es am besten, sich darüber keine Sorgen zu machen.

Wenn dies aus irgendeinem Grund ein echtes Problem für Sie ist, sind einige mögliche Problemumgehungen ...

  1. Sie können eine SEQUENCE verwenden anstelle einer Identitätsspalte und definieren Sie beispielsweise eine kleinere Cache-Größe und verwenden Sie NEXT VALUE FOR in einer Spaltenvorgabe.
  2. Oder wenden Sie das Trace-Flag 272 an, das die IDENTITY erstellt Zuordnung wie in Versionen bis 2008 R2 protokolliert. Dies gilt global für alle Datenbanken.
  3. Oder führen Sie für neuere Versionen ALTER DATABASE SCOPED CONFIGURATION SET IDENTITY_CACHE = OFF aus um das Identitäts-Caching für eine bestimmte Datenbank zu deaktivieren.

Sie sollten sich darüber im Klaren sein, dass keine dieser Problemumgehungen lückenlos ist. Dies wurde von IDENTITY nie garantiert wie es nur durch Serialisieren von Einfügungen in die Tabelle möglich wäre. Wenn Sie eine lückenlose Spalte benötigen, müssen Sie eine andere Lösung als IDENTITY verwenden oder SEQUENCE