Principales respuestas
saltos de identity en SQL SERVER 2017

Pregunta
-
Amigos tengo el siguiente problema tengo una tabla con un ID de tipo int IDENTITY(1,1) , pasa que después de lapso de tiempo inactivo el ID tiene saltos por ejemplo
1
2
3
1000
2100
2500
este problema leí que tenia LA VERSION 2012, y creo ya debería estar solucionado en la VERSION 2017
como solucionar este problema ??
o por que pasa este inconveniente en la versión 2017
Saludos
Respuestas
-
Hola Diego Javier Quispe Sullca:
Identity no garantiza la consecutividad de los registros
create table saltosId (id int identity (1,1), caracter char(1)) go begin tran insert into saltosId (caracter) values ('a') commit go begin tran insert into saltosId (caracter) values ('b') commit go begin tran insert into saltosId (caracter) values ('c') rollback tran go begin tran insert into saltosId (caracter) values ('d') commit go select * from saltosId
id caracter 1 a 2 b 4 d En la documentación oficial de identity
Las columnas de identidad pueden usarse para generar valores de clave.Identity columns can be used for generating key values. La propiedad de identidad de una columna garantiza lo siguiente:The identity property on a column guarantees the following:-
Cada nuevo valor se genera basándose en el valor de inicialización y el incremento actual.Each new value is generated based on the current seed & increment.
-
Cada nuevo valor de una transacción determinada es diferente de otras transacciones simultáneas de la tabla.Each new value for a particular transaction is different from other concurrent transactions on the table.
La propiedad de identidad de una columna no garantiza lo siguiente:The identity property on a column does not guarantee the following:
-
Unicidad del valor: La unicidad debe aplicarse mediante una restricción PRIMARY KEY o UNIQUE, o mediante un índice UNIQUE.Uniqueness of the value – Uniqueness must be enforced by using a PRIMARY KEY or UNIQUE constraint or UNIQUE index.
-
Valores consecutivos en una transacción: No se garantiza que una transacción que inserta varias filas obtenga valores consecutivos para las filas porque podrían producirse otras inserciones simultáneas en la tabla.Consecutive values within a transaction – A transaction inserting multiple rows is not guaranteed to get consecutive values for the rows because other concurrent inserts might occur on the table. Si los valores deben ser consecutivos, la transacción debe usar un bloqueo exclusivo en la tabla o usar el nivel de aislamiento SERIALIZABLE.If values must be consecutive then the transaction should use an exclusive lock on the table or use the SERIALIZABLE isolation level.
-
Valores consecutivos después de un reinicio del servidor u otros errores: SQL ServerSQL Server podría almacenar en memoria caché los valores de identidad por motivos de rendimiento y algunos de los valores asignados podrían perderse durante un error de la base de datos o un reinicio del servidor.Consecutive values after server restart or other failures – SQL ServerSQL Server might cache identity values for performance reasons and some of the assigned values can be lost during a database failure or server restart. Esto puede tener como resultado espacios en el valor de identidad al insertarlo.This can result in gaps in the identity value upon insert. Si no es aceptable que haya espacios, la aplicación debe usar mecanismos propios para generar valores de clave.If gaps are not acceptable then the application should use its own mechanism to generate key values. El uso de un generador de secuencias con la opción NOCACHE puede limitar los espacios a transacciones que nunca se llevan a cabo.Using a sequence generator with the NOCACHE option can limit the gaps to transactions that are never committed.
Existe documentación sobre como limitar mediante una bandera "flag 272" esos saltos, y el porque se utiliza.
http://blog.enrique-zavaleta.com/porque-sql-server-se-salto-1000-ids/
- Propuesto como respuesta osrol viernes, 14 de septiembre de 2018 15:41
- Marcado como respuesta Pablo RubioModerator miércoles, 19 de septiembre de 2018 21:08
-
Todas las respuestas
-
Hola Diego Javier Quispe Sullca:
Identity no garantiza la consecutividad de los registros
create table saltosId (id int identity (1,1), caracter char(1)) go begin tran insert into saltosId (caracter) values ('a') commit go begin tran insert into saltosId (caracter) values ('b') commit go begin tran insert into saltosId (caracter) values ('c') rollback tran go begin tran insert into saltosId (caracter) values ('d') commit go select * from saltosId
id caracter 1 a 2 b 4 d En la documentación oficial de identity
Las columnas de identidad pueden usarse para generar valores de clave.Identity columns can be used for generating key values. La propiedad de identidad de una columna garantiza lo siguiente:The identity property on a column guarantees the following:-
Cada nuevo valor se genera basándose en el valor de inicialización y el incremento actual.Each new value is generated based on the current seed & increment.
-
Cada nuevo valor de una transacción determinada es diferente de otras transacciones simultáneas de la tabla.Each new value for a particular transaction is different from other concurrent transactions on the table.
La propiedad de identidad de una columna no garantiza lo siguiente:The identity property on a column does not guarantee the following:
-
Unicidad del valor: La unicidad debe aplicarse mediante una restricción PRIMARY KEY o UNIQUE, o mediante un índice UNIQUE.Uniqueness of the value – Uniqueness must be enforced by using a PRIMARY KEY or UNIQUE constraint or UNIQUE index.
-
Valores consecutivos en una transacción: No se garantiza que una transacción que inserta varias filas obtenga valores consecutivos para las filas porque podrían producirse otras inserciones simultáneas en la tabla.Consecutive values within a transaction – A transaction inserting multiple rows is not guaranteed to get consecutive values for the rows because other concurrent inserts might occur on the table. Si los valores deben ser consecutivos, la transacción debe usar un bloqueo exclusivo en la tabla o usar el nivel de aislamiento SERIALIZABLE.If values must be consecutive then the transaction should use an exclusive lock on the table or use the SERIALIZABLE isolation level.
-
Valores consecutivos después de un reinicio del servidor u otros errores: SQL ServerSQL Server podría almacenar en memoria caché los valores de identidad por motivos de rendimiento y algunos de los valores asignados podrían perderse durante un error de la base de datos o un reinicio del servidor.Consecutive values after server restart or other failures – SQL ServerSQL Server might cache identity values for performance reasons and some of the assigned values can be lost during a database failure or server restart. Esto puede tener como resultado espacios en el valor de identidad al insertarlo.This can result in gaps in the identity value upon insert. Si no es aceptable que haya espacios, la aplicación debe usar mecanismos propios para generar valores de clave.If gaps are not acceptable then the application should use its own mechanism to generate key values. El uso de un generador de secuencias con la opción NOCACHE puede limitar los espacios a transacciones que nunca se llevan a cabo.Using a sequence generator with the NOCACHE option can limit the gaps to transactions that are never committed.
Existe documentación sobre como limitar mediante una bandera "flag 272" esos saltos, y el porque se utiliza.
http://blog.enrique-zavaleta.com/porque-sql-server-se-salto-1000-ids/
- Propuesto como respuesta osrol viernes, 14 de septiembre de 2018 15:41
- Marcado como respuesta Pablo RubioModerator miércoles, 19 de septiembre de 2018 21:08
-
-
Estimado Javi Fernández F gracias por la respuesta, aclaraste mi duda.
Saludos
-
-
Hola Javi estoy haciendo el Basic Data Mining Tutorial especificamente el Processing Models in the Targeted Mailing Structure (Basic Data Mining Tutorial) el cual esta en https://docs.microsoft.com/en-us/sql/tutorials/processing-models-in-the-targeted-mailing-structure-basic-data-mining-tutorial?view=sql-server-2014
Al llegar al ultimo paso de esta leccion (To deploy the project and process all the mining models) me marca el siguiente error, todo esto en ambiente Visual Studio 2017 (SSDT), con Microsoft SQL Server 2017 tambien:
------------------------------------------------------------------------------------------
TITLE: Microsoft Visual Studio
No se puede procesar un modelo de minería de datos debido al siguiente error:
No se encuentra la estructura de minería de datos 'Targeted Mailing' de la base de datos 'BasicDataMining' del servidor ''.
For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft%C2%AE%20Visual%20Studio%C2%AE&ProdVer=15.9.28307.1000&EvtSrc=Microsoft.AnalysisServices.Design.ASDesign&EvtID=ProcessFailedMessage&LinkId=20476
Processing Models in the Targeted Mailing Structure (Basic Data Mining Tutorial)
No se encuentra la estructura de minería de datos 'Targeted Mailing' de la base de datos 'BasicDataMining' del servidor ''. (Microsoft.AnalysisServices.ManagementDialogs.AS)
------------------------------------------------------------------------------------------
Gracias de antemano por tu ayuda.
Muchas Gracias y Saludos Alejandro Uribe Rodriguez
-
Hola Alejandro Uribe Rodriguez:
Creo que tú pregunta no viene al caso de este hilo.
Plantea la pregunta en un nuevo hilo, de manera que a lo mejor, tanto tú como otros usuarios del foro se pueden responder o encontrar tu pregunta y las respuestas que se puedan aportar.
Gracias