Scrivere query nelle sessioni
Questo documento descrive come scrivere query in una sessione BigQuery. È destinato agli utenti che hanno già una conoscenza generale delle sessioni BigQuery e sanno come eseguire query in una sessione.
Una sessione memorizza lo stato. Lo stato creato in una sessione viene mantenuto ed è utilizzabile per tutta la durata della sessione. Pertanto, se crei una tabella temporanea in una voce di query, puoi utilizzarla in altre voci di query per il resto della sessione.
Una sessione include il supporto per le variabili di sessione, variabili di sistema della sessione, query con più istruzioni e transazioni con più istruzioni.
Prima di completare questi passaggi, assicurati di disporre delle autorizzazioni necessarie per lavorare in una sessione.
Utilizzare le variabili di sistema in una sessione
Puoi impostare o recuperare i dati a livello di sessione con le seguenti variabili di sistema:
@@dataset_id: l'ID del set di dati predefinito nel progetto corrente. Le variabili di sistema@@dataset_project_ide@@dataset_idpossono essere impostate e utilizzate insieme.@@dataset_project_id: l'ID del progetto predefinito per i set di dati utilizzati nella query. Se questa variabile di sistema non è impostata o è impostata suNULL, viene utilizzato il progetto di esecuzione della query. Le variabili di sistema@@dataset_project_ide@@dataset_idpossono essere impostate e utilizzate insieme.@@query_label: l'etichetta del job da assegnare alla sessione. L'etichetta può essere utilizzata per l'intera sessione, non solo per una query specifica nella sessione.@@session_id: l'ID della sessione corrente.@@time_zone: il fuso orario predefinito da utilizzare nelle funzioni SQL dipendenti dal fuso orario, quando un fuso orario non è specificato come argomento.
Queste variabili di sistema possono essere utilizzate in qualsiasi momento durante la sessione e sono nell'ambito della sessione rimanente. Non definisci queste variabili, ma possono
essere assegnate a loro un nuovo valore con l'
SET istruzione.
La dimensione massima di una variabile in una sessione è di 1 MB e la dimensione massima di tutte le variabili in una sessione è di 10 MB.
Assegnare un'etichetta a una sessione
Puoi assegnare un'etichetta del job a una sessione. In questo caso, tutte le query future nella sessione vengono assegnate all'etichetta. Le etichette possono essere utilizzate in qualsiasi momento durante la sessione e sono nell'ambito della sessione rimanente. L'etichetta del job che assegni verrà visualizzata in audit log.
Utilizzare le variabili in una sessione
Puoi creare, impostare e recuperare i dati a livello di sessione con variabili. Le variabili possono essere utilizzate in qualsiasi momento durante la sessione e sono nell'ambito della sessione rimanente.
- Per creare una variabile con ambito di sessione, utilizza l'
DECLAREistruzione al di fuori di unBEGIN...ENDblocco. - Per impostare una variabile con ambito di sessione dopo la creazione, utilizza l'
SETistruzione. - Una variabile dichiarata all'interno di un blocco
BEGIN...ENDnon è una variabile con ambito di sessione. - È possibile fare riferimento a una variabile con ambito di sessione all'interno di un blocco
BEGIN...END. - È possibile impostare una variabile con ambito di sessione all'interno di un blocco
BEGIN...END.
La dimensione massima di una variabile in una sessione è di 1 MB e la dimensione massima di tutte le variabili in una sessione è di 10 MB.
Utilizzare le tabelle temporanee nelle sessioni
Una tabella temporanea ti consente di salvare i risultati intermedi in una tabella. Una tabella temporanea è visibile a livello di sessione, quindi non devi salvarla o gestirla in un set di dati. Viene eliminata automaticamente al termine di una sessione. Ti viene addebitato lo spazio di archiviazione delle tabelle temporanee mentre la sessione è attiva. Per ulteriori informazioni, consulta Utilizzare le tabelle temporanee in una query con più istruzioni.
Utilizzare le funzioni temporanee nelle sessioni
Una funzione temporanea o funzione di aggregazione temporanea è visibile a livello di sessione, quindi non devi salvarla o gestirla in un set di dati. Viene eliminata automaticamente al termine di una sessione.
Utilizzare le query con più istruzioni nelle sessioni
Puoi utilizzare le query con più istruzioni GoogleSQL in una sessione. Uno script può includere tabelle temporanee e variabili di sistema per ogni script. Le variabili di sessione e le tabelle temporanee sono visibili agli script. Tutte le variabili di primo livello dichiarate in uno script sono anche variabili di sessione.
Eseguire transazioni con più istruzioni e più query nelle sessioni
Puoi eseguire transazioni con più istruzioni su più query in una sessione. Ad esempio:
La query seguente inizia una transazione.
BEGIN TRANSACTION
All'interno della transazione, la query seguente crea una tabella temporanea denominata Flights e poi restituisce i dati in questa tabella. Nella query sono incluse due istruzioni.
CREATE TEMP TABLE Flights(total INT64) AS SELECT * FROM UNNEST([10,23,3,14,55]) AS a;
SELECT * FROM Flights;
La query seguente esegue il commit della transazione.
COMMIT
Puoi trovare una transazione attiva che influisce sulla tabella 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 vuoi annullare una transazione in corso e hai il bigquery.admin
ruolo, puoi emettere un'istruzione di rollback,
utilizzando l'ID sessione associato alla transazione in Cloud Shell
o con una chiamata API. Quando esegui la query,
utilizzando l'ID sessione associato alla transazione, l'ID sessione viene visualizzato nei
risultati.
Sessione di esempio
Ecco un esempio del flusso di lavoro della sessione in Google Cloud console:
In Google Cloud console, apri una nuova scheda dell'editor e crea una sessione.
Nella scheda dell'editor, aggiungi la query seguente:
CREATE TEMP TABLE Flights(total INT64) AS SELECT * FROM UNNEST([10,23,3,14,55]) AS a; SELECT * FROM Flights;Esegui la query. Viene creata una tabella temporanea denominata
Flightse vengono restituiti tutti i dati.+-------+ | total | +-------+ | 55 | | 23 | | 3 | | 14 | | 10 | +-------+Elimina i contenuti all'interno della scheda dell'editor e aggiungi la query seguente:
SELECT * FROM Flights LIMIT 2;Esegui la query. Vengono restituiti i risultati per due record. Anche se hai eliminato la query precedente, le informazioni della query vengono memorizzate nella sessione corrente.
+-------+ | total | +-------+ | 55 | | 23 | +-------+Elimina i contenuti all'interno della scheda dell'editor e aggiungi la query seguente:
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;Esegui la query. La variabile con ambito di sessione
xviene utilizzata per limitare il numero di risultati restituiti per la tabellaFlights. Esamina attentamente in che modo l'ambito influisce su questa variabile quando viene dichiarata al di fuori di un'istruzioneBEGIN...END, impostata all'interno di un'istruzioneBEGIN...ENDe poi a cui viene fatto riferimento di nuovo al di fuori dell'istruzioneBEGIN...END.+---------+ | total_a | +---------+ | 550 | | 230 | +---------+ +---------+ | total_b | +---------+ | 5500 | | 2300 | +---------+ +---------+ | total_c | +---------+ | 5500 | | 2300 | +---------+Elimina i contenuti all'interno della scheda dell'editor e aggiungi la query seguente:
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;Esegui la query. La variabile di sistema con ambito di sessione
@@time_zoneviene utilizzata per assegnare un fuso orario a un timestamp. La prima istruzione restituisce un timestamp con il fuso orario predefinito (in questo esempio,UTC). L'istruzione successiva assegna@@time_zonea un nuovo valore. La terza istruzione restituisce un timestamp con il nuovo fuso orario.+-------------------------------+ | default_time_zone | +-------------------------------+ | 2008-12-20 15:30:00+00 | +-------------------------------+ +-------------------------------+ | new_time_zone | +-------------------------------+ | 2008-12-20 07:30:00-08 | +-------------------------------+
Passaggi successivi
- Scopri di più su come utilizzare le sessioni, inclusi come creare, utilizzare, terminare ed elencare le sessioni.
- Scopri di più sulle query con più istruzioni in GoogleSQL.
- Scopri di più sulle transazioni con più istruzioni in GoogleSQL.