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 aufNULL
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 einesBEGIN...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:
Öffnen Sie in der Google Cloud Console einen neuen Editor-Tab und erstellen Sie eine Sitzung.
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;
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 | +-------+
Löschen Sie den Inhalt im Editor-Tab und fügen Sie die folgende Abfrage hinzu:
SELECT * FROM Flights LIMIT 2;
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 | +-------+
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;
Führen Sie die Abfrage aus. Die sitzungsbezogene Variable
x
wird verwendet, um die Anzahl der für die TabelleFlights
zurückgegebenen Ergebnisse zu begrenzen. Sehen Sie sich genau an, wie sich der Geltungsbereich auf diese Variable auswirkt, wenn sie außerhalb einerBEGIN...END
-Anweisung deklariert, in einerBEGIN...END
-Anweisung festgelegt und dann außerhalb derBEGIN...END
-Anweisung wieder referenziert wird.+---------+ | total_a | +---------+ | 550 | | 230 | +---------+ +---------+ | total_b | +---------+ | 5500 | | 2300 | +---------+ +---------+ | total_c | +---------+ | 5500 | | 2300 | +---------+
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;
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 BeispielUTC
). 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 | +-------------------------------+