En su respuesta a ¿Cuál es mejor: columnas de identidad o valores de identificación únicos generados? mrdenny dice:
Cuando salga SQL Denali, admitirá secuencias que serán más eficientes que la identidad, pero usted no puede crear algo más eficiente.
No estoy muy seguro. Conociendo las secuencias de Oracle , tengo que crear un activador para la inserción, encapsular cada inserción en una llamada de un procedimiento almacenado, o rezar para que no olvide usar la secuencia correctamente cuando hago una inserción ad-hoc.
Dudo que las ventajas de las secuencias sean tan obvias.
sql-server
sql-server-2012
sequence
bernd_k
fuente
fuente
Respuestas:
Contestaré aquí también. Tiene que ver con lo interno de cómo
IDENTITY
y cómoSEQUENCE
funciona.Con
IDENTITY
, SQL Server almacena en caché los valores en la memoria para que estén fácilmente disponibles. Vea la respuesta de Martin Smith para los detalles. A medida que se utilizan los valores, un proceso en segundo plano genera más valores. Como puede imaginar, este grupo puede agotarse bastante rápido, dejando la aplicación a merced del proceso en segundo plano que está generando los valores.Con
SEQUENCE
, SQL Server le permite definir qué tan grande debe ser el caché. Si bien SQL Server en realidad no mantiene los valores en la memoria caché, solo mantiene el valor actual y el valor final superior, esto reducirá en gran medida la cantidad de IO que se necesita para crear valores.No configure el caché demasiado alto, ya que esto reducirá la cantidad de números que se pueden usar: si SQL Server se bloqueara, se perderían los valores especificados en el rango de caché actual que no se usaron.
En cuanto a la inserción de filas, solo especifique un valor predeterminado para la columna, de esta manera:
fuente
Desde que se escribió el artículo de Itzik Ben Gan, el tamaño de caché codificado de 10
IDENTITY
parece haber cambiado. De los comentarios sobre este elemento de conexiónlos libro de consultas de T-SQL contiene la siguiente tabla, pero enfatiza que estos valores no están documentados ni se garantiza que no se modifiquen.
El artículo aquí prueba varios tamaños de caché de secuencia e inserta tamaños de lote y ofrece los siguientes resultados.
Lo que parece mostrar que para inserciones grandes
IDENTITY
realizaSEQUENCE
. Sin embargo, no prueba el tamaño de caché 1,000 y también esos resultados son solo una prueba. Mirando específicamente el tamaño de caché 1,000 con varios tamaños de lote de insertos, obtuve los siguientes resultados (probando cada tamaño de lote 50 veces y agregando los resultados de la siguiente manera, todo el tiempo en μs).Para lotes más grandes, el
IDENTITY
versión parece generalmente más rápida .El libro de consulta de TSQL también explica por qué
IDENTITY
puede tener una ventaja de rendimiento sobre la secuencia.La
IDENTITY
tabla es específica ySEQUENCE
no lo es. Si el desastre llegara a la mitad de la inserción antes de que se vacíe el búfer de registro, no importa si la identidad recuperada es anterior, ya que el proceso de recuperación también deshacerá la inserción, por lo que SQL Server no fuerza el vaciado del búfer de registro en cada identidad escritura en disco relacionada con caché. Sin embargo, para Secuencia esto se aplica, ya que el valor puede usarse para cualquier propósito, incluso fuera de la base de datos. Entonces, en el ejemplo anterior con un millón de inserciones y un tamaño de caché de 1,000, esto es un adicional de mil descargas de registros.Script para reproducir
fuente