Abfragen in Sitzungen schreiben

In diesem Dokument wird beschrieben, wie Abfragen in einer BigQuery-Sitzung geschrieben werden. Es richtet sich an Nutzer, die bereits allgemeine Kenntnisse über BigQuery-Sitzungen haben und wissen, wie Abfragen in einer Sitzung ausgeführt werden.

Eine Sitzung speichert den Zustand. Der in einer Sitzung erstellte Zustand wird während der gesamten Sitzung verwaltet und verwendet. Wenn Sie also eine temporäre Tabelle in einem Abfrageeintrag erstellen, können Sie diese temporäre Tabelle für die verbleibende Sitzung in anderen Abfrageeinträgen verwenden.

Eine Sitzung unterstützt Sitzungsvariablen, Sitzungssystemvariablen, Abfragen mit mehreren Anweisungen und Transaktionen mit mehreren Anweisungen.

Prüfen Sie vor dem Ausführen dieser Schritte, ob Sie die erforderlichen Berechtigungen für die Arbeit in einer Sitzung haben.

Systemvariablen in einer Sitzung verwenden

Sie können Daten auf Sitzungsebene mit den folgenden Systemvariablen festlegen oder abrufen:

  • @@dataset_id: ID des Standard-Datasets im aktuellen Projekt. Die Systemvariablen @@dataset_project_id und @@dataset_id können zusammen festgelegt und verwendet werden.
  • @@dataset_project_id: Die ID des Standardprojekts für Datasets, die in der Abfrage verwendet werden. Wenn diese Systemvariable nicht festgelegt oder auf NULL gesetzt ist, wird das Projekt zur Abfrageausführung verwendet. Die Systemvariablen @@dataset_project_id und @@dataset_id können zusammen festgelegt und verwendet werden.
  • @@query_label: Das Joblabel, das der Sitzung zugewiesen werden soll. Das Label kann während der gesamten Sitzung und nicht nur für eine bestimmte Abfrage in der Sitzung verwendet werden.
  • @@session_id: Die ID der aktuellen Sitzung.
  • @@time_zone: Standardzeitzone, die in zeitzonenabhängigen SQL-Funktionen verwendet wird, wenn keine Zeitzone als Argument angegeben ist.

Diese Systemvariablen können jederzeit während der Sitzung verwendet werden und gelten für die verbleibende Sitzung. Sie definieren diese Variablen nicht, können ihnen jedoch mit der Anweisung SET einen neuen Wert zuweisen.

Die maximale Größe einer Variable in einer Sitzung beträgt 1 MB. Die maximale Größe aller Variablen in einer Sitzung beträgt 10 MB.

Einer Sitzung ein Label zuweisen

Sie können einer Sitzung ein Joblabel zuweisen. Damit werden alle zukünftigen Abfragen in der Sitzung dem Label zugewiesen. Labels können jederzeit während der Sitzung verwendet werden und gelten für die verbleibende Sitzung. Das von Ihnen zugewiesene Joblabel wird in den Audit-Logs angezeigt.

Variablen in einer Sitzung verwenden

Sie können Daten auf Sitzungsebene mit Variablen erstellen, festlegen und abrufen. Variablen können jederzeit während der Sitzung verwendet werden und gelten für die verbleibende Sitzung.

  • Verwenden Sie die Anweisung DECLARE außerhalb eines BEGIN...END-Blocks, um eine sitzungsbezogene Variable zu erstellen.
  • Verwenden Sie die Anweisung SET, um eine sitzungsbezogene Variable nach dem Erstellen festzulegen.
  • Eine in einem BEGIN...END-Block deklarierte Variable ist keine sitzungsbezogene Variable.
  • Eine sitzungsbezogene Variable kann innerhalb eines BEGIN...END-Blocks referenziert werden.
  • Eine sitzungsbezogene Variable kann in einem BEGIN...END-Block festgelegt werden.

Die maximale Größe einer Variable in einer Sitzung beträgt 1 MB. Die maximale Größe aller Variablen in einer Sitzung beträgt 10 MB.

Temporäre Tabellen in Sitzungen verwenden

Mit einer temporären Tabelle können Sie Zwischenergebnisse in einer Tabelle speichern. Eine temporäre Tabelle ist auf Sitzungsebene sichtbar, sodass Sie sie nicht in einem Dataset speichern oder verwalten müssen. Sie wird nach Beendigung einer Sitzung automatisch gelöscht. Während der Sitzung ist die Speicherung temporärer Tabellen in Rechnung gestellt. Weitere Informationen zu temporären Tabellen finden Sie unter Mit Abfragen mit mehreren Anweisungen arbeiten.

Temporäre Funktionen in Sitzungen verwenden

Eine temporäre Funktion ist auf Sitzungsebene sichtbar, sodass Sie sie nicht in einem Dataset speichern oder verwalten müssen. Sie wird nach Beendigung einer Sitzung automatisch gelöscht.

Mit Abfragen mit mehreren Anweisungen in Sitzungen arbeiten

Sie können in einer Sitzung GoogleSQL-Abfragen mit mehreren Anweisungen verwenden. Ein Skript kann temporäre Tabellen und Systemvariablen für jedes Skript enthalten. Sitzungsvariablen und temporäre Tabellen sind für Skripts sichtbar. Alle in einem Skript deklarierten Variablen der obersten Ebene sind auch Sitzungsvariablen.

Transaktionen mit mehreren Abfragen und Anweisungen in Sitzungen ausführen

Sie können Transaktionen mit mehreren Anweisungen für mehrere Abfragen in einer Sitzung ausführen. Beispiel:

Mit der folgenden Abfrage wird eine Transaktion gestartet.

BEGIN TRANSACTION

Innerhalb der Transaktion erstellt die folgende Abfrage eine temporäre Tabelle mit dem Namen Flights und gibt dann die Daten in dieser Tabelle zurück. Die Abfrage enthält zwei Anweisungen.

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

SELECT * FROM Flights;

Mit der folgenden Abfrage wird ein Commit der Transaktion durchgeführt.

COMMIT

Sie finden eine aktive Transaktion, die sich auf die Tabelle Flights auswirkt:

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;

Wenn Sie eine laufende Transaktion abbrechen möchten und die Rolle bigquery.admin haben, können Sie einen Rollback einer Anweisung ausführen. Verwenden Sie dazu die Sitzungs-ID, die der Transaktion in Cloud Shell oder einem API-Aufruf zugeordnet ist. Wenn Sie die Abfrage ausführen und dabei die Sitzungs-ID der Transaktion verwenden, wird die Sitzungs-ID in den Ergebnissen angezeigt.

Beispielsitzung

Dies ist ein Beispiel für den Sitzungsworkflow in der Cloud Console:

  1. Öffnen Sie in der Google Cloud Console einen neuen Editor-Tab und erstellen Sie eine Sitzung.

  2. Fügen Sie im Editor-Tab die folgende Abfrage hinzu:

    CREATE TEMP TABLE Flights(total INT64)  AS SELECT * FROM UNNEST([10,23,3,14,55]) AS a;
    SELECT * FROM Flights;
    
  3. Führen Sie die Abfrage aus. Eine temporäre Tabelle mit dem Namen Flights wird erstellt und alle Daten werden zurückgegeben.

    +-------+
    | total |
    +-------+
    |    55 |
    |    23 |
    |     3 |
    |    14 |
    |    10 |
    +-------+
    
  4. Löschen Sie den Inhalt im Editor-Tab und fügen Sie die folgende Abfrage hinzu:

    SELECT * FROM Flights LIMIT 2;
    
  5. Führen Sie die Abfrage aus. Die Ergebnisse für zwei Datensätze werden zurückgegeben. Obwohl Sie die vorherige Abfrage gelöscht haben, werden die Informationen der Abfrage in der aktuellen Sitzung gespeichert.

    +-------+
    | total |
    +-------+
    |    55 |
    |    23 |
    +-------+
    
  6. Löschen Sie den Inhalt im Editor-Tab und fügen Sie die folgende Abfrage hinzu:

    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. Führen Sie die Abfrage aus. Die sitzungsbezogene Variable x wird verwendet, um die Anzahl der für die Tabelle Flights zurückgegebenen Ergebnisse zu begrenzen. Sehen Sie sich genau an, wie sich der Geltungsbereich auf diese Variable auswirkt, wenn sie außerhalb einer BEGIN...END-Anweisung deklariert, in einer BEGIN...END-Anweisung festgelegt und dann außerhalb der BEGIN...END-Anweisung wieder referenziert wird.

    +---------+
    | total_a |
    +---------+
    |     550 |
    |     230 |
    +---------+
    
    +---------+
    | total_b |
    +---------+
    |    5500 |
    |    2300 |
    +---------+
    
    +---------+
    | total_c |
    +---------+
    |    5500 |
    |    2300 |
    +---------+
    
  8. Löschen Sie den Inhalt im Editor-Tab und fügen Sie die folgende Abfrage hinzu:

    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. Führen Sie die Abfrage aus. Die sitzungsbezogene Systemvariable @@time_zone wird verwendet, um einem Zeitstempel eine Zeitzone zuzuweisen. Die erste Anweisung gibt einen Zeitstempel mit der Standardzeitzone zurück (in diesem Beispiel UTC). Mit der nächsten Anweisung wird @@time_zone einem neuen Wert zugewiesen. Die dritte Anweisung gibt einen Zeitstempel mit der neuen Zeitzone zurück.

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

Nächste Schritte