Secuencia vs identidad


SQL Server 2012 introdujo Sequence como una nueva característica, igual que en Oracle y Postgres. ¿Dónde se prefieren las secuencias sobre las identidades? Y ¿por qué necesitamos secuencias?

Author: Sleiman Jneidi, 2012-04-08

5 answers

Creo que encontrarás tu respuesta aquí

Usando el atributo identity para una columna, puede generar fácilmente auto-incremento de números (que tan a menudo se utiliza como una clave primaria). Con Secuencia, será un objeto diferente que se puede adjuntar a un columna de la tabla mientras se inserta. A diferencia de la identidad, el siguiente número para el el valor de la columna se recuperará de la memoria en lugar del disco – esto hace que la Secuencia sea significativamente más rápida que la Identidad. Lo haremos ver esto en los próximos ejemplos.

Y aquí:

Secuencias: Las secuencias han sido solicitadas por la comunidad de SQL Server durante años, y está incluido en esta versión. Sequence es un usuario objeto definido que genera una secuencia de un número. Aquí está un ejemplo usando Secuencia.

Y aquí también:

Un objeto de secuencia de SQL Server genera una secuencia de números igual que una columna de identidad en tablas sql. Pero el ventaja de la secuencia numbers es el objeto de número de secuencia no está limitado con sql único tabla.

Y en msdn también puede leer más sobre el uso y por qué lo necesitamos (aquí):

Una secuencia es un objeto enlazado a esquema definido por el usuario que genera secuencia de valores numéricos según la especificación con la que la secuencia fue creada. Se genera la secuencia de valores numéricos en orden ascendente o descendente a un intervalo definido y puede ciclo (repetir) según lo solicitado. Las secuencias, a diferencia de las columnas de identidad, son no asociado con tablas. Una aplicación se refiere a un objeto de secuencia para recibir su próximo valor. La relación entre secuencias y tablas es controlado por la aplicación. Las aplicaciones de usuario pueden haga referencia a un objeto de secuencia y coordine las claves de valores a través de múltiples filas y tablas.

Se crea una secuencia independientemente de las tablas mediante el Declaración de secuencia. Opciones habilitar usted para controlar el incremento, valores máximos y mínimos, punto de inicio, reinicio automático capacidad y almacenamiento en caché para mejorar el rendimiento. Para información sobre las opciones, consulte CREAR SECUENCIA.

A diferencia de los valores de columna de identidad, que se generan cuando las filas son insertado, una aplicación puede obtener el siguiente número de secuencia antes insertar la fila llamando al SIGUIENTE VALOR PARA la función. Secuencia número se asigna cuando se llama el SIGUIENTE VALOR PARA incluso si el numero nunca se inserta en una tabla. El SIGUIENTE VALOR PARA la función puede ser se utiliza como valor predeterminado para una columna en una definición de tabla. Utilizar sp_sequence_get_range para obtener un rango de múltiples números de secuencia en una vez.

Una secuencia se puede definir como cualquier tipo de datos entero. Si el tipo de datos no se especifica, una secuencia por defecto es bigint.

 60
Author: Arion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-08 12:25:44

Tanto la secuencia como la identidad se utilizan para generar el número automático, pero la principal diferencia es que la Identidad depende de la tabla y la Secuencia es independiente de la tabla.

Si tiene un escenario en el que necesita mantener un número automático globalmente (en varias tablas), también necesita reiniciar su intervalo después de un número particular y necesita almacenarlo en caché también para el rendimiento, aquí está el lugar donde necesitamos secuencia y no identidad.

A continuación se presentan los artículos que definen el real ejemplo mundial de secuencia, su implementación y también la diferencia entre secuencia e identidad.

Http://raresql.com/2012/04/29/how-sequence-works-in-sql-server-2012 / http://raresql.com/2012/05/01/difference-between-identity-and-sequence /

 17
Author: user1059637,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-23 15:44:08

Aunque las secuencias proporcionan más flexibilidad que las columnas de identidad, no encontré que tuvieran ningún beneficio de rendimiento.

Encontré que el rendimiento con identity era consistentemente 3 veces más rápido que con sequence para inserciones por lotes.

Inserté aproximadamente 1,5 M filas y el rendimiento fue:

  • 14 segundos para la identidad
  • 45 segundos para la secuencia

He insertado las filas en una tabla que utiliza objeto de secuencia a través de una tabla por defecto:

NEXT VALUE for <seq> for <col_name>

Y también intentó especificar el valor de la secuencia en la instrucción select:

SELECT NEXT VALUE for <seq>, <other columns> from <table>

Ambos fueron el mismo factor más lento que el método de identidad. Usé la opción de caché predeterminada para la secuencia.

El artículo al que se hace referencia en el primer enlace de Arion muestra el rendimiento de inserción fila por fila y la diferencia entre identidad y secuencia fue de 16,6 segundos a 14,3 segundos para 10.000 inserciones.

La opción de almacenamiento en caché tiene un gran impacto en el rendimiento, pero la identidad es más rápido para volúmenes más altos (+1M filas)

Vea este enlace para un análisis en profundidad según el comentario de utly4life.

 12
Author: Stagg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-12 08:09:21

Sé que esto es un poco viejo, pero quería agregar una observación que me mordió.

Cambié de identidad a secuencia para tener mis índices en orden. Más tarde descubrí que la secuencia no se transfiere con la replicación. Comencé a recibir violaciones de claves después de configurar la replicación entre dos bases de datos ya que las secuencias no estaban sincronizadas. sólo algo de lo que tener cuidado antes de tomar una decisión.

 2
Author: Ken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-25 14:57:03

Recientemente fue mordido por algo a considerar para identidad vs secuencia. Parece MSFT ahora sugiere secuencia si es posible que desee mantener la identidad sin lagunas. Tuvimos un problema en el que había grandes lagunas en la identidad, pero en base a esta declaración resaltada explicaría nuestro problema de que SQL almacenó en caché la identidad y después del reinicio los perdimos numero.

Https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql-identity-property?view=sql-server-2017

Valores consecutivos después del reinicio del servidor u otros errores: SQL Server puede almacenar en caché valores de identidad por razones de rendimiento y algunos de los valores asignados pueden perderse durante un error de la base de datos o un reinicio del servidor. Esto puede dar lugar a lagunas en el valor de identidad al insertar. Si las lagunas no son aceptables, entonces la aplicación debe utilizar su propia mecanismo para generar valores clave. El uso de un generador de secuencias con la opción NOCACHE puede limitar las brechas a las transacciones que nunca se confirman.

 1
Author: awilbourn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-22 02:10:00