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.

Weitere Informationen zur Berechnung der Anzahl der von einer DML-Anweisung verarbeiteten Byte finden Sie unter On-Demand-Abfragegrößenberechnung.

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 BigQuery Storage Write API (REST) 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 (gRPC) geschrieben wurden, mit den Anweisungen UPDATE, DELETE oder MERGE geändert werden. 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.

DML-Anweisungen

In den folgenden Abschnitten werden die verschiedenen Arten von DML-Anweisungen und ihre Verwendung beschrieben.

INSERT-Anweisung

Mit der Anweisung INSERT können Sie einer vorhandenen Tabelle neue Zeilen hinzufügen. Im folgenden Beispiel werden neue Zeilen mit explizit angegebenen Werten in die Tabelle dataset.Inventory eingefügt.

INSERT dataset.Inventory (product, quantity)
VALUES('whole milk', 10),
      ('almond milk', 20),
      ('coffee beans', 30),
      ('sugar', 0),
      ('matcha', 20),
      ('oat milk', 30),
      ('chai', 5)

/+-------------------+----------+
 |      product      | quantity |
 +-------------------+----------+
 | almond milk       |       20 |
 | chai              |        5 |
 | coffee beans      |       30 |
 | matcha            |       20 |
 | oat milk          |       30 |
 | sugar             |        0 |
 | whole milk        |       10 |
 +-------------------+----------+/

Weitere Informationen zu INSERT-Anweisungen finden Sie unter INSERT-Anweisung.

DELETE-Anweisung

Verwenden Sie die Anweisung DELETE, um Zeilen in einer Tabelle zu löschen. Im folgenden Beispiel werden alle Zeilen in der Tabelle dataset.Inventory gelöscht, die den quantity-Wert 0 haben.

DELETE dataset.Inventory
WHERE quantity = 0

/+-------------------+----------+
 |      product      | quantity |
 +-------------------+----------+
 | almond milk       |       20 |
 | chai              |        5 |
 | coffee beans      |       30 |
 | matcha            |       20 |
 | oat milk          |       30 |
 | whole milk        |       10 |
 +-------------------+----------+/

Wenn Sie alle Zeilen in einer Tabelle löschen möchten, verwenden Sie stattdessen die Anweisung TRUNCATE TABLE. Weitere Informationen zu DELETE-Anweisungen finden Sie unter DELETE-Anweisung.

TRUNCATE-Anweisung

Mit der Anweisung TRUNCATE können Sie alle Zeilen aus einer Tabelle entfernen, die Tabellenmetadaten, einschließlich Tabellenschema, Beschreibung und Labels, bleiben jedoch intakt. Im folgenden Beispiel werden alle Zeilen aus der Tabelle dataset.Inventory entfernt.

TRUNCATE dataset.Inventory

Wenn Sie bestimmte Zeilen in einer Tabelle löschen möchten, verwenden Sie stattdessen die Anweisung DELETE. Weitere Informationen zur TRUNCATE-Anweisung finden Sie unter TRUNCATE-Anweisung.

UPDATE-Anweisung

Mit der Anweisung UPDATE werden vorhandene Zeilen in einer Tabelle aktualisiert. Die UPDATE-Anweisung muss auch das Keyword WHERE enthalten, um eine Bedingung anzugeben. Im folgenden Beispiel wird der Wert quantity von Zeilen für Produkte, die den String milk enthalten, um 10 verringert.

UPDATE dataset.Inventory
SET quantity = quantity - 10,
WHERE product LIKE '%milk%'

/+-------------------+----------+
 |      product      | quantity |
 +-------------------+----------+
 | almond milk       |       10 |
 | chai              |        5 |
 | coffee beans      |       30 |
 | matcha            |       20 |
 | oat milk          |       20 |
 | whole milk        |        0 |
 +-------------------+----------+/

UPDATE-Anweisungen können auch FROM-Klauseln enthalten, um verknüpfte Tabellen einzuschließen. Weitere Informationen zu UPDATE-Anweisungen finden Sie unter UPDATE-Anweisung.

MERGE-Anweisung

Die MERGE-Anweisung kombiniert die Vorgänge INSERT, UPDATE und DELETE in einer einzigen Anweisung und führt die Vorgänge atomar aus, um Daten von einer Tabelle in eine andere zusammenzuführen. Weitere Informationen und Beispiele zur MERGE-Anweisung finden Sie unter MERGE-Anweisung.

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.

Wenn Sie DML-INSERT-Anweisungen häufiger ausführen müssen, können Sie Daten mit der Storage Write API (gRPC) in Ihre Tabelle streamen.

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:DATASET.TABLE, limit is 20.

Interaktive Prioritäts-DML-Jobs, die länger als sieben 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.

  • Die automatische DML-Warteschlange gilt nur für eigenständige DML-Anweisungen, die außerhalb einer Transaktion mit mehreren Anweisungen ausgeführt werden. Bei mutierenden DML-Anweisungen innerhalb einer Transaktion mit mehreren Anweisungen wird eine Sperre auf Tabellenebene und nicht auf Ebene einzelner Partitionen angewendet. Gleichzeitige Transaktionen mit mehreren Anweisungen, die dieselbe Tabelle ändern, werden nicht in die Warteschlange gestellt und schlagen sofort fehl, auch wenn sie auf unterschiedliche Partitionen abzielen. Wenn eine gespeicherte Prozedur oder eine Abfrage mit mehreren Anweisungen nur eine einzige mutierende DML-Anweisung ausführt, z. B. eine MERGE-Anweisung, sollten Sie die Anweisung nicht in BEGIN TRANSACTION- und COMMIT TRANSACTION-Anweisungen verpacken. Weitere Informationen finden Sie unter Transaktions-Nebenläufigkeit.

Detaillierte DML

Feingranulare DML ist eine Leistungsverbesserung, die die Ausführung von UPDATE-, DELETE- und MERGE-Anweisungen (auch als mutierende DML-Anweisungen bezeichnet) optimiert.

Hinweise zur Leistung

Wenn die detaillierte DML nicht aktiviert ist, werden DML-Mutationen auf Dateigruppenebene ausgeführt. Das kann zu ineffizienten Datenüberschreibungen führen, insbesondere bei dünnbesetzten Mutationen. Dies kann zu einem zusätzlichen Slot-Verbrauch und längeren Ausführungszeiten führen.

Feingranulare DML ist eine Leistungsverbesserung, die diese mutierenden DML-Anweisungen optimiert. Dazu wird ein detaillierterer Ansatz eingeführt, der die Menge der Daten reduzieren soll, die auf Dateigruppenebene neu geschrieben werden müssen. Dieser Ansatz kann die Verarbeitungs-, E/A- und Slot-Zeit für mutierende DML-Jobs erheblich reduzieren.

Bei der Verwendung von detaillierter DML sind einige Leistungsaspekte zu beachten:

  • Bei detaillierten DML-Vorgängen werden gelöschte Daten in einem hybriden Ansatz verarbeitet, bei dem die Kosten für das Neuschreiben auf zahlreiche Tabellenmutationen verteilt werden. Bei jedem DML-Vorgang wird möglicherweise ein Teil der gelöschten Daten verarbeitet. Die restliche Datenverarbeitung der gelöschten Daten wird dann an einen Hintergrundprozess zur automatischen Speicherbereinigung übergeben. Weitere Informationen finden Sie unter Überlegungen zu gelöschten Daten.
  • Bei Tabellen mit häufigen mutierenden DML-Vorgängen kann es zu einer erhöhten Latenz für nachfolgende SELECT-Abfragen und DML-Jobs kommen. Wenn Sie die Auswirkungen der Aktivierung dieses Features bewerten möchten, führen Sie einen Benchmark für die Leistung einer realistischen Sequenz von DML-Vorgängen und nachfolgenden Lesevorgängen durch.
  • Durch die Aktivierung von detailliertem DML wird die Anzahl der gescannten Byte der mutierenden DML-Anweisung selbst nicht reduziert.

Detaillierte DML aktivieren

Wenn Sie detaillierte DML aktivieren möchten, setzen Sie die Tabellenoption enable_fine_grained_mutations auf TRUE, wenn Sie eine CREATE TABLE- oder ALTER TABLE-DDL-Anweisung ausführen.

Verwenden Sie die Anweisung CREATE TABLE, um eine neue Tabelle mit detaillierter DML zu erstellen:

CREATE TABLE mydataset.mytable (
  product STRING,
  inventory INT64)
OPTIONS(enable_fine_grained_mutations = TRUE);

Verwenden Sie die Anweisung ALTER TABLE, um eine vorhandene Tabelle mit detaillierter DML zu ändern:

ALTER TABLE mydataset.mytable
SET OPTIONS(enable_fine_grained_mutations = TRUE);

Verwenden Sie die Anweisung ALTER TABLE, um alle vorhandenen Tabellen in einem Dataset mit detaillierter DML zu ändern:

FOR record IN
 (SELECT CONCAT(table_schema, '.', table_name) AS table_path
 FROM mydataset.INFORMATION_SCHEMA.TABLES)
DO
 EXECUTE IMMEDIATE
   "ALTER TABLE " || record.table_path || " SET OPTIONS(enable_fine_grained_mutations = TRUE)";
END FOR;

Nachdem die Option enable_fine_grained_mutations auf TRUE gesetzt wurde, werden mutierende DML-Anweisungen mit aktivierten detaillierten DML-Funktionen ausgeführt und verwenden die vorhandene DML-Anweisungssyntax.

Fragen Sie die Ansicht INFORMATION_SCHEMA.TABLES ab, um festzustellen, ob für eine Tabelle detaillierte DML aktiviert wurde. Im folgenden Beispiel wird geprüft, für welche Tabellen in einem Dataset dieses Feature aktiviert wurde:

SELECT
  table_schema AS datasetId,
  table_name AS tableId,
  is_fine_grained_mutations_enabled
FROM
  DATASET_NAME.INFORMATION_SCHEMA.TABLES;

Ersetzen Sie DATASET_NAME durch den Namen des Datasets, in dem Sie prüfen möchten, ob für Tabellen die detaillierte DML aktiviert ist.

Detaillierte DML deaktivieren

Verwenden Sie die ALTER TABLE-Anweisung, um die detaillierte DML für eine vorhandene Tabelle zu deaktivieren.

ALTER TABLE mydataset.mytable
SET OPTIONS(enable_fine_grained_mutations = FALSE);

Wenn Sie die detaillierte DML deaktivieren, kann es einige Zeit dauern, bis alle gelöschten Daten vollständig verarbeitet sind. Weitere Informationen finden Sie unter Überlegungen zu gelöschten Daten. Daher können feingranulare DML-Einschränkungen bestehen bleiben, bis dies geschehen ist.

Preise

Das Aktivieren von detaillierter DML für eine Tabelle kann zusätzliche Kosten verursachen. Dazu gehören die folgenden Kosten:

  • BigQuery-Speicherkosten für das Speichern der zusätzlichen Mutationsmetadaten, die mit detaillierten DML-Vorgängen verknüpft sind. Die tatsächlichen Speicherkosten hängen von der Menge der geänderten Daten ab. In den meisten Fällen sind sie jedoch im Vergleich zur Größe der Tabelle selbst vernachlässigbar.
  • BigQuery-Computing-Kosten für die Verarbeitung gelöschter Daten mithilfe von ausgelagerten automatischen Speicherbereinigungsjobs und nachfolgenden SELECT-Abfragen, die zusätzliche Löschmetadaten verarbeiten, die noch nicht automatisch bereinigt wurden.

Sie können BigQuery-Reservierungen verwenden, um dedizierte BigQuery-Rechenressourcen für die Verarbeitung von ausgelagerten Jobs mit gelöschten Daten zuzuweisen. Mit Reservierungen können Sie die Kosten für die Ausführung dieser Vorgänge begrenzen. Dieser Ansatz ist besonders nützlich und wird häufig für sehr große Tabellen mit häufigen, detaillierten mutierenden DML-Vorgängen empfohlen, die andernfalls aufgrund der großen Anzahl von verarbeiteten Byte bei jedem ausgelagerten Datenverarbeitungsjob für gelöschte Daten hohe On-Demand-Kosten verursachen würden.

Die ausgelagerten Jobs zur Verarbeitung gelöschter Daten von detaillierten DML-Anweisungen werden als Hintergrundjobs betrachtet und erfordern die Verwendung des Reservierungszuweisungstyps BACKGROUND anstelle des Reservierungszuweisungstyps QUERY. Bei Projekten, in denen detaillierte DML-Vorgänge ohne BACKGROUND-Zuweisung ausgeführt werden, wird die On-Demand-Abrechnung verwendet, um die ausgelagerten Jobs zum Löschen von Daten zu verarbeiten.

Vorgang On-Demand-Preise Kapazitätsbasierte Preise
Mutierende DML-Anweisungen Verwenden Sie die standardmäßige DML-Größenbestimmung, um die On-Demand-Berechnungen für gescannte Byte zu ermitteln.

Durch das Aktivieren von detailliertem DML wird die Anzahl der gescannten Byte der DML-Anweisung selbst nicht reduziert.

Slots, die mit dem Typ QUERY zugewiesen sind, werden zur Laufzeit der Anweisung verbraucht.
Gelöschte Datenverarbeitungsjobs, die ausgelagert wurden Verwenden Sie die standardmäßige DML-Größenbestimmung, um die On-Demand-Berechnungen für gescannte Byte zu ermitteln, wenn Jobs zur Verarbeitung gelöschter Daten ausgeführt werden. Slots mit dem Typ BACKGROUND werden verbraucht, wenn Jobs zur Datenverarbeitung gelöschter Daten ausgeführt werden.

Überlegungen zu gelöschten Daten

Bei detaillierten DML-Vorgängen wird ein hybrider Ansatz zur Verwaltung gelöschter Daten verwendet. Dabei wird die Inline-Verarbeitung mit der ausgelagerten automatischen Speicherbereinigung kombiniert, um die Kosten für das Neuschreiben zu verteilen und die Leistung bei mehreren mutierenden DML-Anweisungen für eine Tabelle zu optimieren.

Während der Ausführung einer mutierenden DML-Anweisung versucht BigQuery, einen Teil der relevanten automatischen Speicherbereinigung aus vorherigen DML-Anweisungen inline auszuführen. Alle gelöschten Daten, die nicht inline verarbeitet werden, werden zur späteren Bereinigung in einen Hintergrundprozess ausgelagert.

Projekte, die detaillierte DML-Vorgänge mit einer BACKGROUND-Zuweisung ausführen, verarbeiten ausgelagerte Aufgaben zur automatischen Speicherbereinigung mithilfe von Slots. Die Verarbeitung gelöschter Daten unterliegt der Ressourcenverfügbarkeit der konfigurierten Reservierung. Wenn in der konfigurierten Reservierung nicht genügend Ressourcen verfügbar sind, kann die Verarbeitung ausgelagerter automatische Speicherbereinigungsvorgänge länger als erwartet dauern.

Projekte, die detaillierte DML-Vorgänge mit On-Demand-Preisen oder ohne BACKGROUND-Zuweisung ausführen, verarbeiten ausgelagerte Aufgaben zur Speicherbereinigung mit internen BigQuery-Ressourcen und werden zu On-Demand-Preisen abgerechnet. Weitere Informationen finden Sie unter Preise.

Der Zeitpunkt der ausgelagerten automatischen Speicherbereinigung wird durch die Häufigkeit der DML-Aktivität in der Tabelle und die Verfügbarkeit von Ressourcen bestimmt, wenn eine BACKGROUND-Zuweisung verwendet wird:

  • Bei Tabellen mit kontinuierlich mutierenden DML-Vorgängen verarbeitet jede DML einen Teil der Arbeitslast der automatischen Speicherbereinigung, um eine konsistente Lese- und Schreibleistung zu gewährleisten. Daher wird die automatische Speicherbereinigung regelmäßig verarbeitet, wenn die nachfolgenden DMLs ausgeführt werden.
  • Wenn für eine Tabelle keine nachfolgenden DML-Aktivitäten ausgeführt werden, wird die ausgelagerte automatische Speicherbereinigung automatisch ausgelöst, sobald die gelöschten Daten 5 Tage alt sind.
  • In seltenen Fällen kann es länger dauern, bis gelöschte Daten vollständig verarbeitet sind.

Fragen Sie die Ansicht INFORMATION_SCHEMA.JOBS ab, um ausgelagerte, detaillierte DML-Datenverarbeitungsjobs zu identifizieren:

SELECT
  *
FROM
  region-us.INFORMATION_SCHEMA.JOBS
WHERE
  job_id LIKE "%fine_grained_mutation_garbage_collection%"

Beschränkungen

Für Tabellen, für die detaillierte DML aktiviert ist, gelten die folgenden Einschränkungen:

  • Für große Tabellen mit häufig geänderten Partitionen, die 2 TB überschreiten, wird die Verwendung von detailliertem DML nicht empfohlen. Bei diesen Tabellen kann es bei nachfolgenden Abfragen zu einer erhöhten Speicherauslastung kommen, was zu zusätzlicher Leselatenz oder Abfragefehlern führen kann.
  • In einer Tabelle, für die die detaillierte DML aktiviert ist, kann jeweils nur eine mutierende DML-Anweisung ausgeführt werden. Nachfolgende Jobs werden als PENDING in die Warteschlange gestellt. Weitere Informationen zum Verhalten bei der Nebenläufigkeit von mutierenden DML-Anweisungen finden Sie unter Nebenläufigkeit von UPDATE-, DELETE- und MERGE-DML-Anweisungen.
  • In einer Tabelle mit aktiviertem detailliertem DML können Partitionen nicht einzeln gelöscht oder überschrieben werden. Wenn Sie Daten in einer Partition löschen oder ersetzen möchten, müssen Sie eine mutierende DML-Anweisung wie DELETE, UPDATE, MERGE oder TRUNCATE verwenden.
  • Sie können die Methode tabledata.list nicht verwenden, um Inhalte aus einer Tabelle mit aktiviertem detailliertem DML zu lesen. Fragen Sie stattdessen die Tabelle mit einer SELECT-Anweisung ab, um Tabelleneinträge zu lesen.
  • Eine Tabelle, für die die detaillierte DML aktiviert ist, kann nicht in der BigQuery-Konsole als Vorschau angezeigt werden.
  • Sie können eine Tabelle mit aktiviertem detailliertem DML nicht kopieren, nachdem Sie eine UPDATE-, DELETE- oder MERGE-Anweisung ausgeführt haben.
  • Sie können keinen Tabellen-Snapshot oder Tabellenklon einer Tabelle mit aktiviertem detailliertem DML erstellen, nachdem Sie eine UPDATE-, DELETE- oder MERGE-Anweisung ausgeführt haben.
  • Sie können eine Tabelle nicht umbenennen, wenn die detaillierte DML aktiviert ist, nachdem eine UPDATE-, DELETE- oder MERGE-Anweisung ausgeführt wurde.
  • Die regionenübergreifende Replikation wird für Tabellen mit aktivierter detaillierter DML nicht unterstützt. Das System blockiert zwar die Erstellung replizierter Datasets, die bereits solche Tabellen enthalten, aber es blockiert nicht die Aktivierung von detailliertem DML für Tabellen in vorhandenen replizierten Datasets. Dies kann jedoch zu falschen Abfrageergebnissen in der sekundären Tabelle für die Tabelle mit aktivierter detaillierter DML führen.
  • DML-Anweisungen, die in einer Transaktion mit mehreren Anweisungen ausgeführt werden, werden nicht mit detaillierter DML optimiert.
  • Sie können die detaillierte DML nicht für temporäre Tabellen aktivieren, die mit der CREATE TEMP TABLE-Anweisung erstellt wurden.
  • Metadaten, die in den INFORMATION_SCHEMA.TABLE_STORAGE-Ansichten und INFORMATION_SCHEMA.PARTITIONS-Ansichten widergespiegelt werden, können vorübergehend kürzlich gelöschte Daten enthalten, die mit detaillierten DML-Anweisungen gelöscht wurden, bis die Hintergrundjobs zur Speicherbereinigung abgeschlossen sind.

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.

  • Vermeiden Sie die Partitionierung von Tabellen, wenn die Datenmenge in jeder Partition gering ist und bei jeder Aktualisierung ein großer Teil der Partitionen geändert wird.

  • 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.

  • Folgen Sie der Anleitung für diesen Fehler auf der Seite zur BigQuery-Fehlerbehebung, um den Kontingentfehler Too many DML statements outstanding against table, zu beheben und zu vermeiden.

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

Nächste Schritte