El incremento de identidad está saltando en la base de datos de SQL Server
En una de mis tablas Fee
en la columna "ReceiptNo" en SQL Server 2012, el incremento de identidad de la base de datos de repente comenzó a saltar a 100 en lugar de 1, dependiendo de las dos cosas siguientes.
si es 1205446 salta a 1206306, si es 1206321, salta a 1207306 y si es 1207314, salta a 1208306. Lo que quiero hacerles notar es que los últimos tres dígitos permanecen constantes, es decir, 306 cada vez que se salta. ocurre como se muestra en la siguiente imagen.
este problema ocurre cuando reinicio mi computadora
Este comportamiento se debe a una mejora del rendimiento desde SQL Server 2012.
Ahora, de forma predeterminada, utiliza un tamaño de caché de 1000 al asignar IDENTITY
valores para una int
columna y reiniciar el servicio puede "perder" valores no utilizados (el tamaño de caché es 10,000 para bigint
/ numeric
).
Esto se menciona en la documentación.
SQL Server puede almacenar en caché los valores de identidad por motivos de rendimiento y algunos de los valores asignados pueden perderse durante una falla de la base de datos o un reinicio del servidor. Esto puede dar lugar a lagunas en el valor de identidad al insertarlo. Si las lagunas no son aceptables, entonces la aplicación debería utilizar su propio mecanismo para generar valores clave. El uso de un generador de secuencia con la
NOCACHE
opción puede limitar las brechas a las transacciones que nunca se confirman.
Además, esta brecha aparentemente puede ocurrir después de algunos tipos de transacciones revertidas. Violín .
Según los datos que ha mostrado, parece que esto sucedió después de la entrada de datos del 22 de diciembre y luego, cuando reinició SQL Server, reservó los valores 1206306 - 1207305
. Después de la entrada de datos del 24 al 25 de diciembre, se realizó otro reinicio y SQL Server reservó el siguiente rango 1207306 - 1208305
visible en las entradas del día 28.
A menos que reinicie el servicio con una frecuencia inusual, es poco probable que los valores "perdidos" afecten significativamente el rango de valores permitidos por el tipo de datos, por lo que la mejor política es no preocuparse por eso.
Si por alguna razón esto es un problema real para usted, algunas posibles soluciones son...
- Puede usar una
SEQUENCE
columna de identidad en lugar de una y definir un tamaño de caché más pequeño, por ejemplo, y usarloNEXT VALUE FOR
en una columna predeterminada. - O aplique el indicador de seguimiento 272, que hace que la
IDENTITY
asignación se registre como en las versiones hasta 2008 R2. Esto se aplica globalmente a todas las bases de datos. - O, para versiones recientes, ejecútelo
ALTER DATABASE SCOPED CONFIGURATION SET IDENTITY_CACHE = OFF
para deshabilitar el almacenamiento en caché de identidad para una base de datos específica.
Debe tener en cuenta que ninguna de estas soluciones garantiza que no haya lagunas. Esto nunca ha sido garantizado, IDENTITY
ya que solo sería posible serializando las inserciones en la tabla (sin dicha serialización, los valores de identidad se pueden asignar a una declaración de inserción que termina fallando, por ejemplo, debido a una violación de restricciones. O a una transacción que simplemente se revierte). Si necesita una columna realmente sin espacios, deberá utilizar una solución diferente a IDENTITY
o SEQUENCE
( ejemplo )
Este problema ocurre después de reiniciar SQL Server.
La solucion es:
Ejecute el Administrador de configuración de SQL Server .
Seleccione Servicios de SQL Server .
Haga clic derecho en SQL Server y seleccione Propiedades .
En la ventana que se abre en Parámetros de inicio , escriba
-T272
y haga clic en Agregar , luego presione el botón Aplicar y reinicie.
Desde SQL Server 2017+
usted podría utilizar ALTERAR LA CONFIGURACIÓN DEL ALCANCE DE LA BASE DE DATOS :
IDENTITY_CACHE = { ENCENDIDO | APAGADO }
Habilita o deshabilita la caché de identidad en el nivel de la base de datos. El valor predeterminado es ENCENDIDO. El almacenamiento en caché de identidad se utiliza para mejorar el rendimiento de INSERT en tablas con columnas de identidad. Para evitar espacios en los valores de la columna Identidad en los casos en que el servidor se reinicia inesperadamente o conmuta por error a un servidor secundario, deshabilite la opción IDENTITY_CACHE. Esta opción es similar al indicador de seguimiento 272 de SQL Server existente, excepto que se puede configurar en el nivel de la base de datos en lugar de solo en el nivel del servidor.
(...)
G. Establecer IDENTITY_CACHE
Este ejemplo deshabilita la caché de identidad.
ALTER DATABASE SCOPED CONFIGURATION SET IDENTITY_CACHE=OFF ;