Scrittura di query in sessioni

Questo documento descrive come scrivere query in una sessione BigQuery. È destinata agli utenti che hanno già una conoscenza generale delle sessioni BigQuery e sanno come eseguire query in una sessione.

Una sessione archivia lo stato. Lo stato creato in una sessione viene mantenuto e 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 variabili di sessione, variabili di sistema di 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_id e @@dataset_id possono 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 su NULL, viene utilizzato il progetto per l'esecuzione della query. Le variabili di sistema @@dataset_project_id e @@dataset_id possono 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 non viene specificato un fuso orario come argomento.

Queste variabili di sistema possono essere utilizzate in qualsiasi momento durante la sessione e rientrano nell'ambito della sessione rimanente. Non puoi definire queste variabili, ma puoi assegnarle un nuovo valore con l'istruzione SET.

La dimensione massima di una variabile in una sessione è di 1 MB, mentre 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. Quando esegui questa operazione, tutte le query future della sessione vengono assegnate all'etichetta. Le etichette possono essere utilizzate in qualsiasi momento durante la sessione e rientrano nell'ambito della sessione rimanente. L'etichetta del job assegnata verrà visualizzata negli audit log.

Utilizzare le variabili in una sessione

Puoi creare, impostare e recuperare i dati a livello di sessione con le variabili. Le variabili possono essere utilizzate in qualsiasi momento durante la sessione e rientrano nell'ambito della sessione rimanente.

  • Per creare una variabile con ambito sessione, utilizza l'istruzione DECLARE all'esterno di un blocco BEGIN...END.
  • Per impostare una variabile con ambito sessione dopo averla creata, utilizza l'istruzione SET.
  • Una variabile dichiarata all'interno di un blocco BEGIN...END non è una variabile basata sulle sessioni.
  • È possibile fare riferimento a una variabile basata sulle sessioni all'interno di un blocco BEGIN...END.
  • Una variabile basata sulle sessioni può essere impostata all'interno di un blocco BEGIN...END.

La dimensione massima di una variabile in una sessione è di 1 MB, mentre la dimensione massima di tutte le variabili in una sessione è di 10 MB.

Utilizzare le tabelle temporanee nelle sessioni

Una tabella temporanea consente di salvare i risultati intermedi in una tabella. Una tabella temporanea è visibile a livello di sessione, quindi non è necessario salvarla o gestirla in un set di dati. Viene eliminato automaticamente al termine di una sessione. Ti vengono addebitati i costi per l'archiviazione delle tabelle temporanee mentre la sessione è attiva. Per ulteriori informazioni sulle tabelle temporanee, consulta Utilizzare le query con più istruzioni.

Utilizzare funzioni temporanee nelle sessioni

Una funzione temporanea è visibile a livello di sessione, quindi non è necessario salvarla o gestirla in un set di dati. Viene eliminato automaticamente al termine di una sessione.

Utilizzare le query con più istruzioni nelle sessioni

Puoi utilizzare query con più istruzioni di 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. Anche tutte le variabili di primo livello dichiarate in uno script sono variabili di sessione.

Esecuzione di transazioni multi-query con più istruzioni nelle sessioni

Puoi eseguire transazioni con più estratti conto su più query nell'ambito di una sessione. Ad esempio:

La seguente query avvia una transazione.

BEGIN TRANSACTION

All'interno della transazione, la seguente query crea una tabella temporanea denominata Flights e 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 seguente query 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 ruolo bigquery.admin, puoi emettere un'istruzione di rollback, utilizzando l'ID sessione associato alla transazione in Cloud Shell o una chiamata API. Quando esegui la query, utilizzando l'ID sessione associato alla transazione, l'ID sessione viene mostrato nei risultati.

Sessione di esempio

Ecco un esempio del flusso di lavoro della sessione nella console Google Cloud:

  1. Nella console Google Cloud, apri una nuova scheda dell'editor e crea una sessione.

  2. Nella scheda dell'editor, aggiungi la seguente query:

    CREATE TEMP TABLE Flights(total INT64)  AS SELECT * FROM UNNEST([10,23,3,14,55]) AS a;
    SELECT * FROM Flights;
    
  3. Esegui la query. Viene creata una tabella temporanea denominata Flights e vengono restituiti tutti i dati.

    +-------+
    | total |
    +-------+
    |    55 |
    |    23 |
    |     3 |
    |    14 |
    |    10 |
    +-------+
    
  4. Elimina i contenuti all'interno della scheda dell'editor e aggiungi la seguente query:

    SELECT * FROM Flights LIMIT 2;
    
  5. Esegui la query. Vengono restituiti i risultati per due record. Anche se hai eliminato la query precedente, le informazioni della query sono archiviate nella sessione corrente.

    +-------+
    | total |
    +-------+
    |    55 |
    |    23 |
    +-------+
    
  6. Elimina i contenuti all'interno della scheda dell'editor e aggiungi la seguente query:

    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. Esegui la query. La variabile basata sulle sessioni x viene utilizzata per limitare il numero di risultati restituiti per la tabella Flights. Esamina attentamente in che modo l'ambito influisce su questa variabile quando viene dichiarata al di fuori di un'istruzione BEGIN...END, impostata all'interno di un'istruzione BEGIN...END e poi viene nuovamente fatto riferimento all'esterno dell'istruzione BEGIN...END.

    +---------+
    | total_a |
    +---------+
    |     550 |
    |     230 |
    +---------+
    
    +---------+
    | total_b |
    +---------+
    |    5500 |
    |    2300 |
    +---------+
    
    +---------+
    | total_c |
    +---------+
    |    5500 |
    |    2300 |
    +---------+
    
  8. Elimina i contenuti all'interno della scheda dell'editor e aggiungi la seguente query:

    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. Esegui la query. La variabile di sistema basata sulle sessioni @@time_zone viene 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_zone a un nuovo valore. La terza istruzione restituisce un timestamp con il nuovo fuso orario.

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

Passaggi successivi