Escrever consultas em sessões
Este documento descreve como escrever consultas numa sessão do BigQuery. Destina-se a utilizadores que já têm uma compreensão geral das sessões do BigQuery e sabem como executar consultas numa sessão.
Uma sessão armazena o estado. O estado criado numa sessão é mantido e utilizável durante toda a sessão. Assim, se criar uma tabela temporária numa entrada de consulta, pode usar essa tabela temporária noutras entradas de consulta durante o resto da sessão.
Uma sessão inclui suporte para variáveis de sessão, variáveis de sistema de sessão, consultas com várias declarações e transações com várias declarações.
Antes de concluir estes passos, certifique-se de que tem as autorizações necessárias para trabalhar numa sessão.
Use variáveis do sistema numa sessão
Pode definir ou obter dados ao nível da sessão com as seguintes variáveis do sistema:
@@dataset_id
: o ID do conjunto de dados predefinido no projeto atual. As variáveis de sistema@@dataset_project_id
e@@dataset_id
podem ser definidas e usadas em conjunto.@@dataset_project_id
: o ID do projeto predefinido para conjuntos de dados que são usados na consulta. Se esta variável do sistema não estiver definida ou estiver definida comoNULL
, é usado o projeto de execução de consultas. As variáveis do sistema@@dataset_project_id
e@@dataset_id
podem ser definidas e usadas em conjunto.@@query_label
: a etiqueta de tarefa a atribuir à sessão. A etiqueta pode ser usada durante toda a sessão, não apenas para uma consulta específica na sessão.@@session_id
: o ID da sessão atual.@@time_zone
: o fuso horário predefinido a usar em funções SQL dependentes do fuso horário, quando não é especificado um fuso horário como argumento.
Estas variáveis do sistema podem ser usadas em qualquer altura durante a sessão e estão no âmbito da sessão restante. Não define estas variáveis, mas pode atribuir-lhes um novo valor com a declaração SET
.
O tamanho máximo de uma variável numa sessão é de 1 MB e o tamanho máximo de todas as variáveis numa sessão é de 10 MB.
Atribua uma etiqueta a uma sessão
Pode atribuir uma etiqueta de trabalho a uma sessão. Quando o faz, todas as consultas futuras na sessão são atribuídas à etiqueta. As etiquetas podem ser usadas em qualquer altura durante a sessão e estão no âmbito da sessão restante. A etiqueta de tarefa que atribui é apresentada nos registos de auditoria.
Use variáveis numa sessão
Pode criar, definir e obter dados ao nível da sessão com variáveis. As variáveis podem ser usadas em qualquer altura durante a sessão e estão no âmbito da sessão restante.
- Para criar uma variável ao nível da sessão, use a declaração
DECLARE
fora de um blocoBEGIN...END
. - Para definir uma variável ao nível da sessão depois de ter sido criada, use a declaração
SET
. - Uma variável declarada no interior de um bloco
BEGIN...END
não é uma variável com âmbito de sessão. - Pode fazer referência a uma variável ao nível da sessão dentro de um bloco
BEGIN...END
. - Uma variável ao nível da sessão pode ser definida dentro de um bloco
BEGIN...END
.
O tamanho máximo de uma variável numa sessão é de 1 MB e o tamanho máximo de todas as variáveis numa sessão é de 10 MB.
Use tabelas temporárias em sessões
Uma tabela temporária permite-lhe guardar resultados intermédios numa tabela. Uma tabela temporária é visível ao nível da sessão, pelo que não tem de a guardar nem manter num conjunto de dados. É eliminada automaticamente após o término de uma sessão. É-lhe cobrado o armazenamento de tabelas temporárias enquanto a sessão estiver ativa. Para mais informações, consulte o artigo Use tabelas temporárias numa consulta com várias declarações.
Use funções temporárias em sessões
Uma função temporária ou uma função de agregação temporária é visível ao nível da sessão, pelo que não precisa de a guardar nem a manter num conjunto de dados. É eliminada automaticamente após o término de uma sessão.
Trabalhe com consultas de várias declarações em sessões
Pode usar consultas com várias declarações GoogleSQL numa sessão. Um script pode incluir tabelas temporárias e variáveis do sistema para cada script. As variáveis de sessão e as tabelas temporárias são visíveis para os scripts. Todas as variáveis de nível superior declaradas num script também são variáveis de sessão.
Execute transações com várias consultas e várias declarações em sessões
Pode executar transações com várias declarações em várias consultas numa sessão. Por exemplo:
A seguinte consulta inicia uma transação.
BEGIN TRANSACTION
Dentro da transação, a seguinte consulta cria uma tabela temporária denominada Flights
e, em seguida, devolve os dados nesta tabela. São incluídas duas declarações na consulta.
CREATE TEMP TABLE Flights(total INT64) AS SELECT * FROM UNNEST([10,23,3,14,55]) AS a;
SELECT * FROM Flights;
A seguinte consulta confirma a transação.
COMMIT
Pode encontrar uma transação ativa que afeta a tabela 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;
Se quiser cancelar uma transação em curso e tiver a função bigquery.admin
, pode emitir uma declaração de reversão,
usando o ID da sessão associado à transação no Cloud Shell
ou com uma chamada API. Quando executa a consulta,
usando o ID da sessão associado à transação, o ID da sessão é apresentado nos
resultados.
Exemplo de sessão
Segue-se um exemplo do fluxo de trabalho da sessão na Trusted Cloud consola:
Na Trusted Cloud consola, abra um novo separador do editor e crie uma sessão.
No separador do editor, adicione a seguinte consulta:
CREATE TEMP TABLE Flights(total INT64) AS SELECT * FROM UNNEST([10,23,3,14,55]) AS a; SELECT * FROM Flights;
Execute a consulta. É criada uma tabela temporária denominada
Flights
e todos os dados são devolvidos.+-------+ | total | +-------+ | 55 | | 23 | | 3 | | 14 | | 10 | +-------+
Elimine o conteúdo no separador do editor e adicione a seguinte consulta:
SELECT * FROM Flights LIMIT 2;
Execute a consulta. São devolvidos os resultados de dois registos. Embora tenha eliminado a consulta anterior, as informações da consulta são armazenadas na sessão atual.
+-------+ | total | +-------+ | 55 | | 23 | +-------+
Elimine o conteúdo no separador do editor e adicione a seguinte 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;
Execute a consulta. A variável ao nível da sessão
x
é usada para limitar o número de resultados devolvidos para a tabelaFlights
. Analise atentamente a forma como o âmbito afeta esta variável quando é declarada fora de uma declaraçãoBEGIN...END
, definida numa declaraçãoBEGIN...END
e, em seguida, referenciada novamente fora da declaraçãoBEGIN...END
.+---------+ | total_a | +---------+ | 550 | | 230 | +---------+ +---------+ | total_b | +---------+ | 5500 | | 2300 | +---------+ +---------+ | total_c | +---------+ | 5500 | | 2300 | +---------+
Elimine o conteúdo no separador do editor e adicione a seguinte 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;
Execute a consulta. A variável de sistema ao nível da sessão
@@time_zone
é usada para atribuir um fuso horário a uma data/hora. A primeira declaração devolve uma data/hora com o fuso horário predefinido (neste exemplo,UTC
). A declaração seguinte atribui@@time_zone
a um novo valor. A terceira declaração devolve uma data/hora com o novo fuso horário.+-------------------------------+ | default_time_zone | +-------------------------------+ | 2008-12-20 15:30:00+00 | +-------------------------------+ +-------------------------------+ | new_time_zone | +-------------------------------+ | 2008-12-20 07:30:00-08 | +-------------------------------+
O que se segue?
- Saiba como trabalhar com sessões, incluindo como criar, usar, terminar e listar as suas sessões.
- Saiba mais sobre as consultas com várias declarações no GoogleSQL.
- Saiba mais acerca das transações com várias declarações no GoogleSQL.