Daten mit Datenbearbeitungssprache (DML) transformieren

Die BigQuery-Datenbearbeitungssprache (DML) ermöglicht das Aktualisieren, Einfügen und Löschen von Daten in BigQuery-Tabellen.

Sie können DML-Anweisungen genau wie eine SELECT-Anweisung ausführen. Allerdings müssen folgende Bedingungen erfüllt sein:

  • Sie müssen GoogleSQL verwenden. Wie Sie GoogleSQL aktivieren, erfahren Sie unter SQL-Dialekte wechseln.
  • Sie können keine Zieltabelle für die Abfrage angeben.

Eine Liste der BigQuery-DML-Anweisungen und Beispiele zu deren Verwendung finden Sie unter DML-Anweisungen (Datenbearbeitungssprache) in GoogleSQL.

Beschränkungen

  • Jede DML-Anweisung initiiert eine implizite Transaktion, was bedeutet, dass von der Anweisung vorgenommene Änderungen automatisch am Ende jeder erfolgreichen DML-Anweisung per Commit übernommen werden.

  • Zeilen, die kürzlich mit der tabledata.insertall Streaming-Methode geschrieben wurden, können nicht mit Datenbearbeitungssprache (Data Manipulation Language, DML) geändert werden, darunter: UPDATE, DELETE, MERGE oder TRUNCATE-Anweisungen. Die kürzlichen Schreibvorgänge sind jene, die innerhalb der letzten 30 Minuten ausgeführt wurden. Alle anderen Zeilen in der Tabelle können weiterhin durch die Anweisungen UPDATE, DELETE, MERGE oder TRUNCATE verändert werden. Es kann bis zu 90 Minuten dauern, bis die gestreamten Daten für Kopiervorgänge verfügbar sind.

    Alternativ können Zeilen, die kürzlich mit der Storage Write API geschrieben wurden, mit den Anweisungen UPDATE, DELETE oder MERGE geändert werden (Vorschau). Weitere Informationen finden Sie unter Datenbearbeitungssprache (DML) mit kürzlich gestreamten Daten verwenden.

  • Korrelierte Unterabfragen innerhalb von when_clause, search_condition, merge_update_clause oder merge_insert_clause werden für MERGE-Anweisungen nicht unterstützt.

  • Abfragen, die DML-Anweisungen enthalten, können keine Platzhaltertabelle als Ziel der Abfrage verwenden. Eine Platzhaltertabelle kann beispielsweise in der FROM-Klausel einer UPDATE-Abfrage verwendet werden, aber nicht als Ziel des UPDATE-Vorgangs.

Gleichzeitige Jobs

BigQuery verwaltet die Gleichzeitigkeit von DML-Anweisungen, mit denen Zeilen in einer Tabelle hinzugefügt, geändert oder gelöscht werden.

Gleichzeitigkeit von INSERT-DML-Anweisungen

Während eines Zeitraums von 24 Stunden werden die ersten 1.500 INSERT-Anweisungen unmittelbar nach dem Senden ausgeführt. Nachdem dieses Limit erreicht wurde, ist die Gleichzeitigkeit von INSERT-Anweisungen zum Schreiben in eine Tabelle auf 10 beschränkt. Zusätzliche INSERT-Anweisungen werden einer PENDING-Warteschlange hinzugefügt. Es können jeweils bis zu 100 INSERT-Anweisungen für eine Tabelle in die Warteschlange gestellt werden. Wenn eine INSERT-Anweisung abgeschlossen ist, wird die nächste INSERT-Anweisung aus der Warteschlange entfernt und ausgeführt.

Gleichzeitigkeit von UPDATE-, DELETE- und MERGE-DML-Anweisungen

Die DML-Anweisungen UPDATE, DELETE und MERGE werden als sich ändernde DML-Anweisungen bezeichnet. Wenn Sie eine oder mehrere sich ändernde DML-Anweisungen für eine Tabelle senden, während noch andere sich ändernde DML-Jobs für diese ausgeführt werden (oder ausstehend sind), führt BigQuery bis zu zwei von ihnen gleichzeitig aus, danach werden bis zu 20 als PENDING in der Warteschlange platziert. Wenn ein zuvor ausgeführter Job abgeschlossen ist, wird der nächste ausstehende Job aus der Warteschlange entfernt und ausgeführt. Derzeit teilen sich mutierende DML-Anweisungen in der Warteschlange eine tabellenspezifische Warteschlange mit einer maximalen Länge von 20. Zusätzliche Anweisungen nach der maximalen Warteschlangenlänge für jede einzelne Tabelle schlagen mit der Fehlermeldung fehl: Resources exceeded during query execution: Too many DML statements outstanding against table PROJECT_ID:TABLE, limit is 20.

Interaktive Prioritäts-DML-Jobs, die länger als sechs Stunden in der Warteschlange stehen, schlagen mit der folgenden Fehlermeldung fehl:

DML statement has been queued for too long

Konflikte mit DML-Anweisungen

Mutierende DML-Anweisungen, die gleichzeitig in einer Tabelle ausgeführt werden, verursachen Konflikte mit DML-Anweisungen, wenn durch die Anweisungen versucht wird, dieselbe Partition zu mutieren. Die Anweisungen sind erfolgreich, solange sie nicht dieselbe Partition ändern. BigQuery versucht bis zu dreimal, fehlgeschlagene Anweisungen noch einmal auszuführen.

  • Eine INSERT-DML-Anweisung, die Zeilen in eine Tabelle einfügt, steht nicht im Konflikt mit einer anderen gleichzeitig ausgeführten DML-Anweisung.

  • Eine MERGE-DML-Anweisung steht nicht in Konflikt mit anderen gleichzeitig ausgeführten DML-Anweisungen, solange mit der Anweisung nur Zeilen eingefügt werden und vorhandene Zeilen nicht gelöscht oder aktualisiert werden. Dazu können MERGE-Anweisungen mit UPDATE- oder DELETE-Klauseln gehören, sofern diese Klauseln nicht bei der Ausführung der Abfrage aufgerufen werden.

Preise

Informationen zu DML-Preisen finden Sie unter Preise für Data Manipulation Language auf der Seite „Preise“.

Best Practices

Für eine optimale Leistung empfiehlt Google folgende Muster:

  • Vermeiden Sie es, zu viele einzelne Zeilenaktualisierungen oder -einfügungen zu senden. Gruppieren Sie stattdessen DML-Vorgänge wo möglich. Weitere Informationen finden Sie unter DML-Anweisungen, die einzelne Zeilen aktualisieren oder einfügen.

  • Wenn Aktualisierungen oder Löschvorgänge im Allgemeinen für ältere Daten oder innerhalb eines bestimmten Zeitraums durchgeführt werden, empfiehlt sich eine Partitionierung Ihrer Tabellen. Durch die Partitionierung wird dafür gesorgt, dass die Änderungen auf bestimmte Partitionen innerhalb der Tabelle beschränkt sind.

  • Partitionieren Sie Tabellen nicht, wenn die Datenmenge in jeder Partition klein ist und jede Aktualisierung einen großen Teil der Partitionen ändert.

  • Wenn Sie häufig Zeilen aktualisieren, in denen eine oder mehrere Spalten in einen engen Wertebereich fallen, können Sie geclusterte Tabellen verwenden. Clustering sorgt dafür, dass Änderungen auf bestimmte Gruppen von Blöcken beschränkt sind, und reduziert die zu lesende und schreibende Datenmenge. Das folgende Beispiel zeigt eine UPDATE-Anweisung, die nach einem Bereich von Spaltenwerten filtert:

    UPDATE mydataset.mytable
    SET string_col = 'some string'
    WHERE id BETWEEN 54 AND 75;
    

    Hier ist ein ähnliches Beispiel, das nach einer kleinen Liste von Spaltenwerten filtert:

    UPDATE mydataset.mytable
    SET string_col = 'some string'
    WHERE id IN (54, 57, 60);
    

    In diesen Fällen sollten Sie das Clustering auf der Spalte id vornehmen.

  • Wenn Sie OLTP-Funktionen benötigen, können Sie föderierte Cloud SQL-Abfragen verwenden, mit denen BigQuery Daten abfragen kann, die in Cloud SQL gespeichert sind.

Best Practices zur Optimierung der Abfrageleistung finden Sie unter Einführung in die Optimierung der Abfrageleistung.

Nächste Schritte

  • Informationen zur DML-Syntax und Beispiele finden Sie unter DML-Syntax.
  • Informationen zum Verwenden von DML-Anweisungen in geplanten Abfragen finden Sie unter Abfragen planen.