Escribe consultas en sesiones

En este documento, se describe cómo escribir consultas en una sesión de BigQuery. Está dirigido a usuarios que ya tengan una comprensión general de las sesiones de BigQuery y sepan cómo ejecutar consultas en una sesión.

Una sesión almacena un estado. El estado creado en una sesión se mantiene y se puede usar durante toda la sesión. Por lo tanto, si creas una tabla temporal en una entrada de consulta, puedes usarla en otras entradas de consulta para el resto de la sesión.

Una sesión incluye compatibilidad con variables de sesión, variables de sistema de sesión, consultas de varias instrucciones y transacciones de varias instrucciones.

Antes de completar estos pasos, asegúrate de tener los permisos necesarios para trabajar en una sesión.

Usa variables del sistema en una sesión

Puedes configurar o recuperar datos a nivel de la sesión con las siguientes variables del sistema:

  • @@dataset_id: El ID del conjunto de datos predeterminado en el proyecto actual. Las variables del sistema @@dataset_project_id y @@dataset_id se pueden configurar y usar juntas.
  • @@dataset_project_id: Es el ID del proyecto predeterminado para los conjuntos de datos que se usan en la consulta. Si esta variable del sistema no está configurada o si se configura como NULL, se usa el proyecto que ejecuta la consulta. Las variables del sistema @@dataset_project_id y @@dataset_id se pueden configurar y usar juntas.
  • @@query_label: Es la etiqueta de trabajo que se asignará a la sesión. La etiqueta se puede usar en toda la sesión, no solo para una consulta específica en la sesión.
  • @@session_id: Es el ID de la sesión actual.
  • @@time_zone: La zona horaria predeterminada que se debe usar en funciones de SQL que dependen de esta cuando no se especifica una zona horaria explícita como argumento.

Estas variables del sistema se pueden usar en cualquier momento durante la sesión y están dentro del alcance de la sesión restante. No debes definir estas variables, pero se les puede asignar un valor nuevo con la declaración SET.

El tamaño máximo de una variable en una sesión es de 1 MB, y el tamaño máximo de todas las variables en una sesión es de 10 MB.

Asigna una etiqueta a una sesión

Puedes asignar una etiqueta de trabajo a una sesión. Cuando lo hagas, todas las consultas futuras de la sesión se asignarán a la etiqueta. Las etiquetas se pueden usar en cualquier momento durante la sesión y están dentro del alcance de la sesión restante. La etiqueta del trabajo que asignes aparecerá en los registros de auditoría.

Usa variables en una sesión

Puedes crear, configurar y recuperar datos a nivel de sesión con variables. Estas variables se pueden usar en cualquier momento durante la sesión y están dentro del alcance de la sesión restante.

  • Para crear una variable centrada en la sesión, usa la declaración DECLARE fuera de un bloque BEGIN...END.
  • Para establecer una variable centrada en la sesión después de crearla, usa la declaración SET.
  • Una variable declarada dentro de un bloque BEGIN...END no es una variable centrada en la sesión.
  • Se puede hacer referencia a una variable centrada en la sesión dentro de un bloque BEGIN...END.
  • Una variable centrada en la sesión se puede establecer dentro de un bloque BEGIN...END.

El tamaño máximo de una variable en una sesión es de 1 MB, y el tamaño máximo de todas las variables en una sesión es de 10 MB.

Usa tablas temporales en sesiones

Una tabla temporal te permite guardar resultados intermedios en una tabla. Una tabla temporal es visible a nivel de la sesión, por lo que no es necesario guardarla ni mantenerla en un conjunto de datos. Se borra automáticamente después de que finaliza una sesión. Se te cobra por el almacenamiento de tablas temporales mientras la sesión está activa. Para obtener más información sobre las tablas temporales, consulta Trabaja con consultas de varias declaraciones.

Usa funciones temporales en las sesiones

Una función temporal es visible a nivel de la sesión, por lo que no es necesario guardarla ni mantenerla en un conjunto de datos. Se borra automáticamente después de que finaliza una sesión.

Trabaja con consultas de varias instrucciones en sesiones

Puedes usar consultas de varias instrucciones de GoogleSQL en una sesión. Una secuencia de comandos puede incluir tablas temporales y variables de sistema para cada secuencia de comandos. Las variables de sesión y las tablas temporales son visibles para las secuencias de comandos. Todas las variables de nivel superior declaradas en una secuencia de comandos también son variables de sesión.

Ejecuta transacciones de múltiples consultas de varias instrucciones en sesiones

Puedes ejecutar transacciones de varias instrucciones en múltiples consultas en una sesión. Por ejemplo:

La siguiente consulta inicia una transacción.

BEGIN TRANSACTION

Dentro de la transacción, la siguiente consulta crea una tabla temporal llamada Flights y, luego, muestra los datos de esta tabla. Se incluyen dos instrucciones en la consulta.

CREATE TEMP TABLE Flights(total INT64)  AS SELECT * FROM UNNEST([10,23,3,14,55]) AS a;

SELECT * FROM Flights;

La siguiente consulta confirma la transacción.

COMMIT

Puedes encontrar una transacción activa que afecte la tabla Flights:

WITH running_transactions AS (
  SELECT DISTINCT transaction_id
  FROM
    `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
    WHERE creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
    EXCEPT DISTINCT
    SELECT transaction_id FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
    WHERE
      creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
      AND statement_type = "COMMIT_TRANSACTION"
      OR statement_type = "ROLLBACK_TRANSACTION"
)
SELECT
  jobs.transaction_id AS transaction_id,
  project_id,
  user_email,
  session_info.session_id,
  query
FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT AS jobs, running_transactions
  WHERE
  creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
  AND destination_table = ("Flights")
  AND jobs.transaction_id = running_transactions.transaction_id;

Si deseas cancelar una transacción en curso y tienes el rol bigquery.admin, puedes emitir una instrucción de reversión con el ID de sesión asociado a la transacción en Cloud Shell, o con una llamada a la API. Cuando ejecutas la consulta mediante el ID de sesión asociado a la transacción, el ID de sesión se muestra en los resultados.

Sesión de ejemplo

Este es un ejemplo del flujo de trabajo de la sesión en la consola de Google Cloud:

  1. En la consola de Google Cloud, abre una pestaña nueva del editor y crea una sesión.

  2. En la pestaña Editor, agrega la siguiente consulta:

    CREATE TEMP TABLE Flights(total INT64)  AS SELECT * FROM UNNEST([10,23,3,14,55]) AS a;
    SELECT * FROM Flights;
    
  3. Ejecuta la consulta. Se crea una tabla temporal llamada Flights y se muestran todos los datos.

    +-------+
    | total |
    +-------+
    |    55 |
    |    23 |
    |     3 |
    |    14 |
    |    10 |
    +-------+
    
  4. Borre el contenido dentro de la pestaña del editor y agregue la siguiente consulta:

    SELECT * FROM Flights LIMIT 2;
    
  5. Ejecuta la consulta. Se muestran los resultados de dos registros. Aunque borraste la consulta anterior, la información de la consulta se almacena en la sesión actual.

    +-------+
    | total |
    +-------+
    |    55 |
    |    23 |
    +-------+
    
  6. Borre el contenido dentro de la pestaña del editor y agregue la siguiente consulta:

    DECLARE x INT64 DEFAULT 10;
    
    SELECT total * x AS total_a FROM Flights LIMIT 2;
    
    BEGIN
      SET x = 100;
      SELECT total * x AS total_b FROM Flights LIMIT 2;
    END;
    
    SELECT total * x AS total_c FROM Flights LIMIT 2;
    
  7. Ejecuta la consulta. La variable centrada en la sesión x se usa a fin de limitar la cantidad de resultados que se muestran para la tabla Flights. Mira con atención cómo el alcance afecta a esta variable cuando se declara fuera de una instrucción BEGIN...END, configurada dentro de una instrucción BEGIN...END y, luego, se hace referencia a ella fuera de la instrucción BEGIN...END de nuevo.

    +---------+
    | total_a |
    +---------+
    |     550 |
    |     230 |
    +---------+
    
    +---------+
    | total_b |
    +---------+
    |    5500 |
    |    2300 |
    +---------+
    
    +---------+
    | total_c |
    +---------+
    |    5500 |
    |    2300 |
    +---------+
    
  8. Borre el contenido dentro de la pestaña del editor y agregue la siguiente consulta:

    SELECT STRING(TIMESTAMP "2008-12-20 15:30:00+00", @@time_zone) AS default_time_zone;
    
    SET @@time_zone = "America/Los_Angeles";
    
    SELECT STRING(TIMESTAMP "2008-12-20 15:30:00+00", @@time_zone) AS new_time_zone;
    
  9. Ejecuta la consulta. La variable del sistema centrada en la sesión @@time_zone se usa para asignar una zona horaria a una marca de tiempo. La primera instrucción muestra una marca de tiempo con la zona horaria predeterminada (en este ejemplo, UTC). La siguiente instrucción asigna @@time_zone a un valor nuevo. La tercera instrucción muestra una marca de tiempo con la zona horaria nueva.

    +-------------------------------+
    | default_time_zone             |
    +-------------------------------+
    | 2008-12-25 15:30:00+00        |
    +-------------------------------+
    
    +-------------------------------+
    | new_time_zone                 |
    +-------------------------------+
    | 2008-12-20 07:30:00-08        |
    +-------------------------------+
    

¿Qué sigue?