lunes, 13 de julio de 2015

Receta T-SQL No. 2-9: Pausa de la Ejecución de un Batch Durante un Período

Índice

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
3.1 Sentencia WAITFOR
3.2 Utilidades de WAITFOR
4. Práctica: Código T-SQL
4.1 Práctica #1
4.2 Práctica #2
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

Aprenderemos a usar la sentencia WAITFOR para detener o bloquear la ejecución de un batch T-SQL durante un período determinado. Exploraremos la utilidad de esta sentencia a través de un par de ejemplos de práctica. También enunciáremos las demás aplicaciones interesantes de WAITFOR: espera hasta que una transacción se haya ejecutado durante cierto tiempo, y la modificación de un número de registros en una transacción.

1. Problema

Pausar la ejecución de un batch T-SQL durante un período.

2. Solución

T-SQL cuenta con la sentencia WAITFOR para la especificación un período de espera.

3. Discusión de la Solución

3.1 Sentencia WAITFOR

La sentencia WAITFOR [2] permite, además de bloquear la ejecución de un batch durante un período específico:
  • retrasar la ejecución hasta determinada hora del día, 
  • establecer la espera hasta que se hayan modificado un número determinado de registros, e 
  • inclusive hasta que se retorne un registro en una transacción.
La sintaxis de uso de esta sentencia es así:

WAITFOR
{
    DELAY 'time_to_pass'
    | TIME 'time_to_execute'
    | [ ( receive_statement ) | ( get_conversation_group_statement ) ] 
      [ , TIMEOUT timeout ]
}

Donde:
  • DELAY: Indica la continuación de la ejecución de un batch, un procedimiento almacenado, o una transacción pasado un período.
    • 'time_to_pass': Tiempo de espera. Máximo 24 horas.
  • TIME: Indica el momento en que ha de continuar la ejecución de un batch, un precedimiento almacenado, o una transacción.
    • 'time_to_execute': Tiempo en que debe empezar la ejecución.
    • receive_statement: Sentencia RECEIVE valida. Opcional.
    • get_conversation_group_statement: Sentencia GET CONVERSATION GROUP valida. Opcional.
  • TIMEOUT timeout: Período de espera, en milisegundos, en la recepción de un mensaje en una cola. Opcional.
(Las sentencias RECEIVE y GET CONVERSATION GROUP las estudiáremos con detalle en futuras recetas.)

Podemos poner dos ejemplos de uso básicos de este sentencia:

Ejemplo de uso 1: Ejecución de procedimiento almacenado después de dos horas de retraso:

BEGIN
    WAITFOR DELAY '02:00';
    EXECUTE sp_helpdb;
END;
GO

Ejemplo de uso 2: Ejecución de procedimiento almacenado en un hora determinada -22:20-:

EXECUTE sp_add_job @tarea = 'TareaPrueba';
BEGIN
    WAITFOR TIME '22:20'
    EXECUTE sp_update_job @tarea = 'TareaPrueba';
        @Mensaje = 'TareaEjecutada'
END;
GO

3.2 Utilidades de WAITFOR

Entre las utilidades interesantes de WAITFOR tenemos [1]:
  • Ejecución asincrónica: Asumamos que hemos ejecutado un procedimiento almacenado y debemos esperar un período (e.g., 10 minutos) hasta que se haya finalizado su ejecución; una vez finalizado se han de ejecutar otras tareas que son dependientes de éste.
  • Tareas de mantenimiento: Queremos que un procedimiento almacenado se ejecute a una hora determinada (e.g., horas no operativas del negocio); esto para la ejecución de tareas de mantenimiento o consolidación de datos de las tablas, o generación de reportes basados en agregaciones.

4. Práctica: Código T-SQL

4.1 Práctica #1:

En este primer ejemplo retrasaremos la ejecución de una sentencia SELECT pasados 10 segundos:

WAITFOR DELAY '00:00:10';
BEGIN
SELECT TransactionID, Quantity
FROM Production.TransactionHistory;
END;

> Prueba de ejecución:

4.2 Práctica #2:
Ejecución de sentencia T-SQL retrasada por 10 segundos.
Animación 1. Ejecución de sentencia T-SQL retrasada por 10 segundos.

Ahora veremos cómo podemos postponer la ejecución de una sentencia T-SQL a las 07:52:23, siendo las ~07:52:12:

WAITFOR TIME '07:52:13';
BEGIN
SELECT COUNT(*)
FROM Production.TransactionHistory;
END;

> Prueba de ejecución:
Ejecución de sentencia T-SQL a las 07:51:23.
Animación 2. Ejecución de sentencia T-SQL a las 07:51:23.

5. Conclusiones

Estudiamos la sentencia WAITFOR: con la cual podemos retrasar, o postponer (entre otras operaciones) la ejecución de una sentencia, procedimiento almacenado, o transacción. En la sección práctica, demostramos el uso de esta sentencia a través de simples ejemplos que nos dan una intuición acerca de su utilidad (enunciada en la sección 3.2).

En la próxima receta T-SQL estudiáremos la creación y uso de cursores.

6. Glosario

  • Agregación
  • Batch
  • Consulta
  • Ejecución
  • Procedimiento almacenado
  • Transacción

7. Literatura & Enlaces

[1]: SQL Server 2012 T-SQL Recipes - A Problem-Solucion Approach by Jason Brimhall, David Dye, Jonathan Gennick, Andy Roberts, and Wayne Sheffield. Copyright 2012 Jason Brimhall, David Dye, Jonathan Gennick, Andy Roberts, and Wayne Sheffield, 978-1-4302-4200-0.
[2]: WAITFOR (Transact-SQL) - https://msdn.microsoft.com/en-us/library/ms187331.aspx


S

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.