SQL Server 2012 se introdujo Sequence
como 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?
sql
sql-server
tsql
sql-server-2012
Sleiman Jneidi
fuente
fuente
Respuestas:
Creo que encontrarás tu respuesta aquí.
Y aqui :
y aquí también:
y en msdn también puede leer más sobre el uso y por qué lo necesitamos ( aquí ):
fuente
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.
fuente
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:
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.
fuente
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.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.
fuente
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.
fuente
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.
fuente
IDENTITY
los números enlazan ySEQUENCE
tiene 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.