Blog de Consultec

Por fin está disponible Microsoft SQL Server 2012 Release Candidate 0. Esta nueva versión de Sql Server trae muchas mejoras interesantes, de hecho, se dividirá el artículo en dos partes. Nos centraremos en analizar las principales novedades que nos aporta en cuanto a Transact Sql (T-SQL) se refiere:

1.     Sequence

El tan esperado objeto sequence -que le será familiar a los profesionales de Oracle- nos permite definir en un sitio global un contador de valores en un orden e intervalo determinados y puede repetirse si se desea. Un sequence es un buen sustituto para los campos identity, a través de los cuáles generamos fácilmente números autoincrementables. A diferencia del identity, el sequence:

  • Devuelve el siguiente valor de memoria en vez de acceder a disco.
  • No está asociado a ninguna tabla, es decir, puede ser utilizado en varias tablas.
  • Se puede obtener el nuevo valor antes de usarlo en una instrucción INSERT.
  • Se puede definir y modificar cualquier propiedad del sequence: el tipo de datos, valor actual, incremento, valor mínimo, valor máximo, ciclo, etc.

Creamos un objeto sequence: 

Creamos una tabla que utiliza el objeto sequence creado e insertamos un registro en ella. La clave se generará automáticamente:

Creamos otra tabla que utilizará el mismo objeto sequence, pero no lo definiremos por defecto. Después insertamos valores en la tabla creada especificando de forma explícita el valor de la clave:

Podemos utilizar el valor de una secuencia dentro de un conjunto de instrucciones:

 

Destacar que no respetan transacciones, es decir, si generamos el valor de un sequence dentro de una transacción y se hace un rollback, la generación del número no se deshace.

Consideraciones y limitaciones

  • El sequence utiliza el tipo bigint (8 bytes) por defecto, por tanto si los requerimientos son almacenar números más pequeños debemos cambiar el tipo de datos a un tinyint, smallint o int.
  • Debemos definir un valor de comienzo de la secuencia, porque si no por defecto Sql Server establecerá el valor mínimo soportado por el tipo. Por ejemplo para el bigint el valor de inicio sería   “-9.223.372.036.854.775.808″.
  • El incremento por defecto es 1, aunque puede ser negativo.
  • Debemos especificar CYCLE/NOCYCLE para definir el comportamiento que tendrá el sequence cuando alcance el valor máximo.

 

2.     Paginación con OFFSET/FETCH NEXT

Nuestra consulta puede devolver cientos, miles o incluso millones de filas, pero el usuario normalmente no puede hacer frente a tantos datos a la vez, necesita paginar los resultados. El tamaño de página puede variar; 10, 25, 50 o 100 resultados a la vez, pero más que esto suele ser demasiado. Lógicamente podemos ejecutar la consulta, devolver todos los resultados y filtrar en nuestra aplicación solo aquel subconjunto que necesitemos.  Pero esto puede ser ineficiente, si solo necesitamos una página, eso es lo que debemos devolver del SQL.

Hasta SQL Server 2005, paginar los resultados de una consulta era difícil de conseguir. Con SQL Server 2005 y la llegada de nuevas funciones de ranking como el ROW_NUMBER, pudimos implementar la paginación. La función ROW_NUMBER nos genera un número secuencial por cada fila de resultado y de esta forma podemos filtrar en el WHERE cuántos resultados queremos obtener.

Esto sigue funcionando pero requiere añadir una columna adicional al resultado que podemos no necesitar y requiere además utilizar SELECT anidadas o CTEs para conseguir la paginación. Digamos que la sintaxis no es muy intuitiva.

Utilizando la cláusula OFFSET/FETCH NEXT introducida en SQL Server 2012 podemos obtener los mismos resultados de una manera más sencilla. Si usamos OFFSET/FETCH NEXT con una cláusula ORDER BY nos devuelve los datos de una página concreta.  En el OFFSET especificamos a partir de que fila vamos a devolver (empieza en 0) o cuántas filas nos vamos a saltar y en el FETCH NEXT especificamos cuántas filas vamos a devolver en el conjunto de datos.

Mañana,  la segunda parte de las novedades…

Mari Carmen Romero Jiménez

Tags: ,

1 Comentario para el post

  • javito
    febrero 2nd, 2012

    Muy interesante el artículo!

    Yo lo que me pregunto es como habrá que diseñar el tema de las secuencias si se quiere hacer una replicación de mezcla de algunas tablas de la base de datos. En versiones anteriores, había opciones de replica del IDENTITY, pero ahora, al no pertencer a la tabla…que pasará?

    A la espera de la segunda parte para aprender más cositas.
    Muchas Gracias!!

Enviar comentarios