none
saltos de identity en SQL SERVER 2017 RRS feed

  • 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

    jueves, 13 de septiembre de 2018 22:44

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 erroresSQL 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 failuresSQL 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/

    Un saludo

    • 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
    viernes, 14 de septiembre de 2018 5:21

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 erroresSQL 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 failuresSQL 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/

    Un saludo

    • 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
    viernes, 14 de septiembre de 2018 5:21
  • Estimado Javi Fernández F gracias por la respuesta, aclaraste mi duda.

    Saludos

    miércoles, 19 de septiembre de 2018 18:46
  • En lugar de IDENTITY, podría hacer uso del NEXT VALUE FOR SEQUENCE
    miércoles, 19 de septiembre de 2018 21:43
  • 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

    viernes, 14 de febrero de 2020 18:31
  • 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

    viernes, 14 de febrero de 2020 18:34