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 ...
- Sie können eine
SEQUENCE
verwenden anstelle einer Identitätsspalte und definieren Sie beispielsweise eine kleinere Cache-Größe und verwenden SieNEXT VALUE FOR
in einer Spaltenvorgabe. - 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. - 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