En una de mis tablas Fee
en la columna "ReceiptNo" en el incremento de identidad de la base de datos de SQL Server 2012, de repente comenzó a saltar a 100 en lugar de 1, dependiendo de las siguientes dos cosas.
si es 1205446, salta a 1206306, si es 1206321, salta a 1207306 y si es 1207314, salta a 1208306. Lo que quiero que note es que los últimos tres dígitos permanecen constantes, es decir, 306 cada vez que salta ocurre como se muestra en la siguiente imagen.
Este problema ocurre cuando reinicio mi computadora
order by ReceiptNo
a su consulta, ¿esos registros realmente no están allí? ¿Está seguro de que cuando se insertan registros no hay errores? Si un registro intenta insertarse y falla, la identidad aumentará, lo mismo si se eliminan los registros. Si se eliminan los registros,ReceiptNo
no se restablece. ¿Puedes publicar la tabla de creación para laFee
tabla?1206306
,1207306
,1207806
) significa la explicación de la rosca de artículos Conectar casi seguro que se aplica.Respuestas:
Se encuentra con este comportamiento debido a una mejora en el rendimiento desde SQL Server 2012.
Ahora, por defecto, usa un tamaño de caché de 1,000 cuando asigna
IDENTITY
valores para unaint
columna y reinicia el servicio puede "perder" los valores no utilizados (el tamaño de caché es 10,000 parabigint
/numeric
).Esto se menciona en la documentació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 rango1207306 - 1208305
visible en las entradas para el 28.A menos que reinicie el servicio con una frecuencia inusual, es poco probable que los valores "perdidos" hagan mella significativa en el rango de valores permitidos por el tipo de datos, por lo que la mejor política es no preocuparse por ello.
Si por alguna razón esto es un problema real para usted, algunas posibles soluciones son ...
SEQUENCE
columna de identidad en lugar de una y definir un tamaño de caché más pequeño, por ejemplo, y usarNEXT VALUE FOR
en una columna predeterminada.IDENTITY
asignación se registre como en versiones hasta 2008 R2. Esto se aplica globalmente a todas las bases de datos.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 alternativas no garantiza lagunas. Esto nunca ha sido garantizado
IDENTITY
ya que solo sería posible serializando inserciones en la tabla. Si necesita una columna sin espacios en blanco que tendrá que utilizar una solución diferente a cualquieraIDENTITY
oSEQUENCE
fuente
SEQUENCE
lugar de unIDENTITY
y configurar la secuencia para que tenga un tamaño de caché de0
.CREATE TABLE
, veo que está usandonumeric(7)
y ha comenzado la numeración, lo1200001
que significa que se quedaría sin8,799
días (24 años) si usa 1,000 por día.big int
columna generalmente "saltará" en 10,000 por reinicio.Este problema se produce después de reiniciar el servidor SQL.
La solucion es:
Ejecute el Administrador de configuración de SQL Server .
Seleccione Servicios de SQL Server .
Haga clic con el botón derecho en SQL Server y seleccione Propiedades .
En la ventana de apertura en Parámetros de inicio , escriba
-T272
y haga clic en Agregar , luego presione el botón Aplicar y reinicie.fuente
Desde
SQL Server 2017+
usted podría usar ALTER DATABASE SCOPED CONFIGURATION :fuente
Sé que mi respuesta podría llegar tarde a la fiesta. Pero he resuelto de otra manera agregando un procedimiento almacenado de inicio en SQL Server 2012.
Cree un siguiente procedimiento almacenado en la base de datos maestra.
Luego agréguelo a Inicio usando la siguiente sintaxis.
Esta es una buena idea si tiene pocas tablas. pero si tiene que hacerlo para muchas tablas, este método aún funciona pero no es una buena idea.
fuente
Este sigue siendo un problema muy común entre muchos desarrolladores y aplicaciones, independientemente de su tamaño.
Lamentablemente, las sugerencias anteriores no solucionan todos los escenarios, es decir, alojamiento compartido, no puede confiar en su host para establecer el parámetro de inicio -t272.
Además, si tiene tablas existentes que usan estas columnas de identidad para las claves primarias, es un ENORME esfuerzo eliminar esas columnas y recrear otras nuevas para usar la solución alternativa de la secuencia BS. La solución alternativa de secuencia solo es buena si está diseñando tablas nuevas desde cero en SQL 2012+
La conclusión es que, si está en SQL Server 2008R2, MANTÉNGASE EN ELLO. En serio, quédate ahí. Hasta que Microsoft admita que introdujeron un error ENORME, que todavía está allí incluso en Sql Server 2016, no deberíamos actualizarlo hasta que lo posean y lo FIJEN.
Microsoft introdujo un cambio radical, es decir, rompieron una API funcional que ya no funciona según lo diseñado, debido a que su sistema olvida su identidad actual en un reinicio. Caché o no caché, esto es inaceptable, y el desarrollador de Microsoft con el nombre de Bryan necesita ser el propietario, en lugar de decirle al mundo que es "por diseño" y una "característica". Claro, el almacenamiento en caché es una característica, pero perder la noción de cuál debería ser la próxima identidad NO ES UNA CARACTERÍSTICA. Es un error!
Compartiré la solución alternativa que utilicé, porque Mis bases de datos están en servidores de alojamiento compartido, además, no estoy soltando y recreando mis columnas de Clave primaria, eso sería una gran PITA.
En cambio, este es mi truco vergonzoso (pero no tan vergonzoso como este error POS que ha introducido Microsoft).
Hack / Fix:
Antes de los comandos de inserción, simplemente reinicialice su identidad antes de cada inserción. Esta solución solo se recomienda si no tiene control de administrador sobre su instancia de SQL Server, de lo contrario, sugiero volver a reiniciar el servidor.
Solo esas 3 líneas inmediatamente antes de su inserción, y debería estar listo para comenzar. Realmente no afectará tanto el rendimiento, es decir, pasará desapercibido.
Buena suerte.
fuente
Hay muchas razones posibles para saltar valores de identidad. Van desde inserciones revertidas hasta gestión de identidad para la replicación. No puedo decir qué está causando esto en su caso sin pasar algún tiempo en su sistema.
Sin embargo, debe saber que en ningún caso puede suponer que una columna de identidad sea contigua. Hay demasiadas cosas que pueden causar lagunas.
Puede encontrar un poco más de información sobre esto aquí: http://sqlity.net/en/792/the-gap-in-the-identity-value-sequence/
fuente