SQL11 (Denali): Nuevo Objeto SEQUENCE

En el CTP1 Denali tenemos un nuevo objeto muy interesante denominado SEQUENCE para manejar secuencia de números entre el rango de -2^31 – 1 hasta 2^31 –1. SEQUENCE soluciona muchos problemas relacionado al uso de la propiedad IDENTITY, no está amarrado a la columna y se puede usar para varias columnas en diferentes tablas. También es útil como alternativa limitada a ROW_NUMBER. Su uso es bien sencillo, práctico y flexible, ofrece mejor performance que IDENTITY, no se puede usar dentro de funciones ni con DISTINCT, UNION, EXCEPT y INTERSECT pero sí con UNION ALL, y para garantizar la unicidad se recomienda crear un índice sobre las columnas que se alimentan de los valores de esta función. Cuidado con el uso de índices, puede mejorar las consultas, pero a la vez impactar negativamente en las operaciones de actualización.

Definitivamente SEQUENCE será de demasiada utilidad, sin embargo, no olvidar que cada cosa tiene sus escenarios de uso y también sus limitaciones.  Para crear un objeto SEQUENCE suficiente con esto:

CREATE SEQUENCE dbo.MySeq
AS INT
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 100
CYCLE
CACHE 20
;
 
Para usarlo:
 
select NEXT VALUE FOR dbo.MySeq
GO 4
 
Resultado:
(no column name)
1
2
3
4
 
Si volvemos a ejecutar la sentencia anterior, el resultado será los número del 5 al 8 y asi sucesivamente. Si en algún momento deseamos reinicializar la secuencia podemos lograrlo asi:
ALTER SEQUENCE dbo.MySeq RESTART 
 
Y si deseamos la secuencia sea cíclica simplemente usamos el atributo CYCLE en la definición del objeto. Por otra parte, como alternativa básica a ROW_NUMBER() podemos usarlo de la siguiente manera:
 
select next value for dbo.MySeq as [nro],  Employees.FirstName   from Employees 
image
o también de esta manera:
select next value for dbo.MySeq  over (order by customers.CustomerID ) as [nro], 
customers.CustomerID, Customers.ContactName
from Customers
 
Pueden revisar a más detalle acerca de SEQUENCE en las referencias que doy a continuación donde existe suficiente cantidad de ejemplos con las que se pueden familiarizar.

Creating and Using Sequence Numbers
http://msdn.microsoft.com/en-us/library/ff878058(v=SQL.110).aspx
sp_sequence_get_range (Transact-SQL)
http://msdn.microsoft.com/en-us/library/ff878352(v=SQL.110).aspx
SQL Server v.Next (Denali) : Using SEQUENCE
http://sqlblog.com/blogs/aaron_bertrand/archive/2010/11/11/sql-server-11-denali-using-sequence.aspx

PercyReyes,

Published 15/11/2010 16:56 por Percy Reyes
Archivado en:
Comparte este post:
http://geeks.ms/blogs/ozonicco/archive/2010/11/15/184840.aspx

Comentarios

# re: SQL Server 2011 (Denali): Nuevo Objeto SEQUENCE

Esto recuerda a los GENERADORES de InterBase, disponibles desde hace más de una década. Poco nuevo hay bajo el sol...

Saludos - Octavio

Tuesday, November 16, 2010 4:47 AM por Octavio Hernández

# re: SQL Server 2011 (Denali): Nuevo Objeto SEQUENCE

Y tambien recuerda a los generadores de Oracle

Tuesday, November 16, 2010 8:49 AM por Juan Pablo Cano

# re: SQL Server 2011 (Denali): Nuevo Objeto SEQUENCE

@Octavio, @Juan Pablo, de ser así que es un campo exactamente igual y con el mismo objetivo y características, entonces se podrá decir que es nuevo para SQL Server (y gracias) pero no para los motores gestores de bases de datos. Todo lo que sea mejorar, bienvenido. :-)

La duda que tengo con SEQUENCE es como actúa con dos usuarios concurrentes al que a cada uno se le da un número de secuencia conscutivo (por ejemplo 2034 y 2035) y mientras que el 2035 se registra adecuadamente en la tabla, el 2034 realiza un rollback.

En ese punto, si entra un usuario posterior... ¿le da el 2034 o le da el 2036?.

¿Hay que hacer algo especial ahí?.

Un saludo.

Tuesday, November 16, 2010 9:18 AM por Jorge Serrano

# re: SQL Server 2011 (Denali): Nuevo Objeto SEQUENCE

@Octavio, Juan: Lo importante es que está característica ya está disponible para SQL Server, si ya estaba en otros productos ya es una cosa que no merece de más comentario.

@Jorge: Con SEQUENCE se podrá saber previamente el valor antes de realizar la inserción (por ejemplo), y tomar la correcta decisión, sin embargo, si se hace un rollback más adelante de la transacción el valor generado de SEQUENCE no se hace rollback, por lo tanto, SEQUENCE no proporciona consistencia transacional. En tu caso que planteas, al siguiente usuario se le dará el número 2036.

A pesar de esto, SEQUENCE es mucho más flexible y con mejor performance que IDENTITY!

Saludos,

Tuesday, November 16, 2010 4:22 PM por Percy Reyes