Escribir consultas en sesiones
En este documento se describe cómo escribir consultas en una sesión de BigQuery. Está dirigido a usuarios que ya tienen conocimientos generales sobre las sesiones de BigQuery y saben cómo ejecutar consultas en una sesión.
Una sesión almacena el 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 durante el resto de la sesión.
Una sesión incluye compatibilidad con variables de sesión, variables de sistema de sesión, consultas con varias instrucciones y transacciones con varias instrucciones.
Antes de completar estos pasos, asegúrate de que tienes los permisos necesarios para trabajar en una sesión.
Usar variables del sistema en una sesión
Puede definir o recuperar datos a nivel de sesión con las siguientes variables del sistema:
@@dataset_id
: ID del conjunto de datos predeterminado del proyecto actual. Las variables del sistema@@dataset_project_id
y@@dataset_id
se pueden definir y usar juntas.@@dataset_project_id
: ID del proyecto predeterminado de los conjuntos de datos que se usan en la consulta. Si esta variable de sistema no se define o se define comoNULL
, se usará el proyecto que ejecuta la consulta. Las variables del sistema@@dataset_project_id
y@@dataset_id
se pueden definir y usar juntas.@@query_label
: la etiqueta del trabajo que se va a asignar a la sesión. La etiqueta se puede usar durante toda la sesión, no solo para una consulta específica de la sesión.@@session_id
: ID de la sesión actual.@@time_zone
: zona horaria predeterminada que se usará en las funciones SQL que dependen de la zona horaria cuando no se especifique ninguna como argumento.
Estas variables de sistema se pueden usar en cualquier momento durante la sesión y están en el ámbito de la sesión restante. No defines estas variables, pero se les puede asignar un nuevo valor con la instrucció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 de una sesión es de 10 MB.
Asignar una etiqueta a una sesión
Puedes asignar una etiqueta de tarea 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 se aplican al resto de la sesión. La etiqueta de trabajo que asignes aparecerá en los registros de auditoría.
Usar variables en una sesión
Puedes crear, definir y recuperar datos a nivel de sesión con variables. Las variables se pueden usar en cualquier momento durante la sesión y están en el ámbito de la sesión restante.
- Para crear una variable de ámbito de sesión, usa la instrucción
DECLARE
fuera de un bloqueBEGIN...END
. - Para definir una variable de ámbito de sesión después de haberla creado, usa la instrucción
SET
. - Una variable declarada dentro de un bloque
BEGIN...END
no es una variable de ámbito de sesión. - Se puede hacer referencia a una variable de ámbito de sesión dentro de un bloque
BEGIN...END
. - Una variable de ámbito de sesión se puede definir 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 de una sesión es de 10 MB.
Usar tablas temporales en sesiones
Una tabla temporal te permite guardar resultados intermedios en una tabla. Una tabla temporal es visible a nivel de sesión, por lo que no es necesario guardarla ni mantenerla en un conjunto de datos. Se elimina automáticamente cuando 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, consulta Usar tablas temporales en una consulta con varias instrucciones.
Usar funciones temporales en sesiones
Una función temporal o una función de agregación temporal se puede ver a nivel de sesión, por lo que no es necesario guardarla ni mantenerla en un conjunto de datos. Se elimina automáticamente cuando finaliza una sesión.
Trabajar 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 del 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.
Ejecutar transacciones con varias consultas y varias instrucciones en sesiones
Puedes ejecutar transacciones con varias instrucciones en varias consultas de 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, a continuación, devuelve 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 a 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 quieres 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,
con 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 Google Cloud :
En la Google Cloud consola, abre una pestaña de editor nueva y crea una sesión.
En la pestaña del editor, añade la siguiente consulta:
CREATE TEMP TABLE Flights(total INT64) AS SELECT * FROM UNNEST([10,23,3,14,55]) AS a; SELECT * FROM Flights;
Ejecuta la consulta. Se crea una tabla temporal llamada
Flights
y se devuelven todos los datos.+-------+ | total | +-------+ | 55 | | 23 | | 3 | | 14 | | 10 | +-------+
Elimina el contenido de la pestaña del editor y añade la siguiente consulta:
SELECT * FROM Flights LIMIT 2;
Ejecuta la consulta. Se devuelven los resultados de dos registros. Aunque hayas eliminado la consulta anterior, la información de la consulta se almacena en la sesión actual.
+-------+ | total | +-------+ | 55 | | 23 | +-------+
Elimina el contenido de la pestaña del editor y añade 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;
Ejecuta la consulta. La variable de ámbito de sesión
x
se usa para limitar el número de resultados devueltos en la tablaFlights
. Fíjate bien en cómo afecta el ámbito a esta variable cuando se declara fuera de una instrucciónBEGIN...END
, se asigna dentro de una instrucciónBEGIN...END
y, a continuación, se hace referencia a ella fuera de la instrucciónBEGIN...END
.+---------+ | total_a | +---------+ | 550 | | 230 | +---------+ +---------+ | total_b | +---------+ | 5500 | | 2300 | +---------+ +---------+ | total_c | +---------+ | 5500 | | 2300 | +---------+
Elimina el contenido de la pestaña del editor y añade 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;
Ejecuta la consulta. La variable de sistema de ámbito de sesión
@@time_zone
se usa para asignar una zona horaria a una marca de tiempo. La primera instrucción devuelve una marca de tiempo con la zona horaria predeterminada (en este ejemplo,UTC
). La siguiente instrucción asigna@@time_zone
a un nuevo valor. La tercera instrucción devuelve una marca de tiempo con la nueva zona horaria.+-------------------------------+ | default_time_zone | +-------------------------------+ | 2008-12-20 15:30:00+00 | +-------------------------------+ +-------------------------------+ | new_time_zone | +-------------------------------+ | 2008-12-20 07:30:00-08 | +-------------------------------+
Siguientes pasos
- Consulta más información sobre cómo trabajar con sesiones, incluido cómo crear, usar, finalizar y enumerar tus sesiones.
- Consulta más información sobre las consultas de varias instrucciones en GoogleSQL.
- Consulta más información sobre las transacciones de varias instrucciones en GoogleSQL.