Secuencia vs identidad

87

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

Sleiman Jneidi
fuente
Después de usar ambos, prefiero Identity para uso global en una base de datos. Es decir, donde necesita un número de incremento automático como ObjectID y desea usarlo en muchas tablas. Se vuelve complicado hacer una secuencia y luego usar una aplicación (sitio web o aplicación, etc.) para administrar la inserción y actualización de tablas en función de un número de secuencia.
volumen uno

Respuestas:

81

Creo que encontrarás tu respuesta aquí.

Al utilizar el atributo de identidad para una columna, puede generar fácilmente números que se incrementan automáticamente (que se utilizan con tanta frecuencia como clave principal). Con Sequence, será un objeto diferente que puede adjuntar a una columna de la tabla mientras lo inserta. A diferencia de la identidad, el siguiente número para 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. Veremos esto en los próximos ejemplos.

Y aqui :

Secuencias: la comunidad de SQL Server ha solicitado las secuencias durante años y se incluyen en esta versión. La secuencia es un objeto definido por el usuario que genera una secuencia de un número. Aquí hay un ejemplo usando Sequence.

y aquí también:

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

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 un esquema definido por el usuario que genera una secuencia de valores numéricos de acuerdo con la especificación con la que se creó la secuencia. La secuencia de valores numéricos se genera en orden ascendente o descendente en un intervalo definido y puede ciclar (repetir) según se solicite. Las secuencias, a diferencia de las columnas de identidad, no están asociadas con tablas. Una aplicación se refiere a un objeto de secuencia para recibir su siguiente valor. La relación entre secuencias y tablas está controlada por la aplicación. Las aplicaciones de usuario pueden hacer referencia a un objeto de secuencia y coordinar las claves de valores en varias filas y tablas.

Se crea una secuencia independientemente de las tablas mediante la instrucción CREATE SEQUENCE. Las opciones le permiten controlar el incremento, los valores máximos y mínimos, el punto de partida, la capacidad de reinicio automático y el almacenamiento en caché para mejorar el rendimiento. Para obtener información sobre las opciones, consulte CREAR SECUENCIA.

A diferencia de los valores de columna de identidad, que se generan cuando se insertan filas, una aplicación puede obtener el siguiente número de secuencia antes de insertar la fila llamando a la función NEXT VALUE FOR. El número de secuencia se asigna cuando se llama a NEXT VALUE FOR incluso si el número nunca se inserta en una tabla. La función SIGUIENTE VALOR PARA se puede utilizar como valor predeterminado para una columna en una definición de tabla. Utilice sp_sequence_get_range para obtener un rango de múltiples números de secuencia a la vez.

Una secuencia se puede definir como cualquier tipo de datos enteros. Si no se especifica el tipo de datos, una secuencia toma el valor predeterminado de bigint.

Arion
fuente
21

La secuencia y la identidad se utilizan para generar un 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.

usuario1059637
fuente
14

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

Descubrí que el rendimiento con la identidad era siempre 3 veces más rápido que con la secuencia para inserciones por lotes.

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

  • 14 segundos para la identidad
  • 45 segundos para secuencia

Inserté las filas en una tabla que usaba un objeto de secuencia a través de una tabla predeterminada:

NEXT VALUE for <seq> for <col_name>

y también intenté especificar el valor de secuencia en la declaración de selección:

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 la inserción fila por fila y la diferencia entre la identidad y la 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ápida para volúmenes más altos (+ 1 millón de filas)

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

Stagg
fuente
¿Cuál fue el tamaño de caché de la secuencia?
Shannon Severance
50, aumentarlo hace una diferencia, pero recuerdo que la identidad aún era más rápida.
Stagg
2
byobi.com/blog/2012/09/… Proporciona una buena comparación detallada de varias configuraciones. Muestra que el aumento en el tamaño de la memoria caché de 50 a 500 produjo una diferencia de velocidad de aproximadamente el doble.
ulty4life
1
¿Sugiere que las secuencias son más lentas que la columna de identidad? Tuve la impresión opuesta, ya que las secuencias están en la memoria, a diferencia de la identidad que se obtiene del disco. Tus hallazgos son bastante sorprendentes. Me alegro de que lo hayas compartido.
RBT
1
con la secuencia, puede optimizar el rendimiento de la inserción por lotes usando alter sequence increment by ...para simplemente hacer espacio para sus nuevas filas y luego usar base + número_de_fila () o lo que sea para los valores reales.
gordy
6

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 clave después de configurar la replicación entre dos bases de datos, ya que las secuencias no estaban sincronizadas. algo a tener en cuenta antes de tomar una decisión.

Conocido
fuente
3

Creo que el mejor uso de las secuencias no es reemplazar una columna de identidad, sino crear un tipo de campo "Número de pedido".

En otras palabras, un número de pedido se expone al usuario final y puede tener reglas comerciales junto con él. Quieres que sea único, pero el simple hecho de usar una columna de identidad tampoco es realmente correcto.

Por ejemplo, diferentes tipos de pedidos pueden requerir una secuencia diferente, por lo que es posible que tenga una secuencia para pedidos por Internet, a diferencia de los pedidos internos.

En otras palabras, no piense en una secuencia como un simple reemplazo de la identidad, piense en ella como útil en los casos en que una identidad no se ajusta a los requisitos comerciales.

Greg Gum
fuente
1

Recientemente fue algo a considerar para identidad vs secuencia. Parece que MSFT ahora sugiere una secuencia si es posible que desee mantener la identidad sin espacios. Tuvimos un problema en el que había grandes lagunas en la identidad, pero según esta declaración resaltada explicaría nuestro problema de que SQL almacenaba en caché la identidad y después de reiniciar perdimos esos números.

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 otras fallas: SQL Server puede almacenar en caché los valores de identidad por razones de rendimiento y algunos de los valores asignados se pueden perder durante una falla de la base de datos o el reinicio del servidor. Esto puede resultar en lagunas en el valor de identidad al insertarlo. Si las brechas no son aceptables, la aplicación debe usar su propio 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 comprometen.

awilbourn
fuente
1
Hay una buena respuesta bastante a qué va a omitir IDENTITYlos números enlazan y SEQUENCEtiene el mismo problema que se describe aquí el enlace , pero se puede limitar mediante el establecimiento de un tamaño de caché más pequeña pero entonces no es una solución de compromiso con la velocidad.
Mrphin