Auf dieser Seite wird beschrieben, wie Sie Spanner-Daten mit Anweisungen in der Datenbearbeitungssprache DML (Data Manipulation Language) einfügen, aktualisieren und löschen. Sie können DML-Anweisungen mithilfe der Clientbibliotheken, der Google Cloud Console und des gcloud
-Befehlszeilentools ausführen. Partitionierte DML-Anweisungen lassen sich mit den Clientbibliotheken und mit dem gcloud
-Befehlszeilentool ausführen.
Die vollständige DML-Syntaxreferenz finden Sie unter Syntax der Datenbearbeitungssprache für Datenbanken mit GoogleSQL-Dialekt oder PostgreSQL-Datenmanipulationssprache für Datenbanken mit PostgreSQL-Dialekt.
DML verwenden
DML unterstützt INSERT
-, UPDATE
- und DELETE
-Anweisungen in der Google Cloud Console, in der Google Cloud CLI und in Clientbibliotheken.
Sperren
Sie führen DML-Anweisungen in Lese- und Schreibtransaktionen aus. Wenn Spanner Daten liest, werden gemeinsame Lesesperren für begrenzte Teile der gelesenen Zeilenbereiche übernommen. Insbesondere werden diese Sperren nur für die Spalten übernommen, auf die Sie zugreifen. Die Sperren können auch Daten beinhalten, die nicht mit der Filterbedingung der WHERE
-Klausel übereinstimmen.
Beim Ändern von Daten durch Spanner mithilfe von DML-Anweisungen werden exklusive Sperren speziell für die Daten übernommen, die Sie ändern. Darüber hinaus werden gemeinsame Sperren auf die gleiche Weise wie beim Lesen von Daten angewendet. Wenn Ihre Anfrage große Zeilenbereiche oder eine komplette Tabelle beinhaltet, verhindern die gemeinsamen Sperren möglicherweise, dass andere Transaktionen parallel ausgeführt werden.
Um Daten so effizient wie möglich zu ändern, verwenden Sie eine WHERE
-Klausel, mit der Spanner nur die erforderlichen Zeilen liest. Sie können dafür einen Filter für den Primärschlüssel oder für den Schlüssel eines Sekundärindex nutzen. Die Klausel WHERE
beschränkt den Umfang der gemeinsamen Sperren und ermöglicht es Spanner, die Aktualisierung effizienter zu verarbeiten.
Angenommen, einer der Musiker in der Tabelle Singers
ändert seinen Vornamen und Sie müssen den Namen in Ihrer Datenbank aktualisieren. Sie können dafür die im Folgenden dargestellte DML-Anweisung ausführen. Diese führt aber dazu, dass Spanner die komplette Tabelle prüft und gemeinsame Sperren übernimmt, die die komplette Tabelle betreffen. Spanner muss dann mehr Daten als erforderlich lesen und gleichzeitige Transaktionen können die Daten nicht parallel ändern:
-- ANTI-PATTERN: SENDING AN UPDATE WITHOUT THE PRIMARY KEY COLUMN
-- IN THE WHERE CLAUSE
UPDATE Singers SET FirstName = "Marcel"
WHERE FirstName = "Marc" AND LastName = "Richards";
Für eine effizientere Aktualisierung nehmen Sie die Spalte SingerId
in die WHERE
-Klausel auf. Die Spalte SingerId
ist die einzige primäre Schlüsselspalte für die Tabelle Singers
:
-- ANTI-PATTERN: SENDING AN UPDATE THAT MUST SCAN THE ENTIRE TABLE
UPDATE Singers SET FirstName = "Marcel"
WHERE FirstName = "Marc" AND LastName = "Richards"
Wenn es keinen Index für FirstName
oder LastName
gibt, müssen Sie die gesamte Tabelle scannen, um die gewünschten Sänger zu finden. Wenn Sie keinen sekundären Index hinzufügen möchten, um die Aktualisierung effizienter zu gestalten, nehmen Sie die Spalte SingerId
in die WHERE
-Klausel auf.
Die Spalte SingerId
ist die einzige Primärschlüsselspalte für die Tabelle Singers
. Führen Sie dazu SELECT
in einer separaten schreibgeschützten Transaktion vor der Aktualisierungstransaktion aus:
SELECT SingerId
FROM Singers
WHERE FirstName = "Marc" AND LastName = "Richards"
-- Recommended: Including a seekable filter in the where clause
UPDATE Singers SET FirstName = "Marcel"
WHERE SingerId = 1;
Gleichzeitigkeit
Spanner führt alle SQL-Anweisungen (SELECT
, INSERT
, UPDATE
und DELETE
) innerhalb einer Transaktion nacheinander aus. Sie werden nicht gleichzeitig ausgeführt. Einzige Ausnahme sind mehrere SELECT
-Anweisungen, die Spanner als reine Lesevorgänge möglicherweise gleichzeitig ausführt.
Transaktionslimits
Für eine Transaktion, die DML-Anweisungen enthält, gelten dieselben Limits wie für jede andere Transaktion. Bei umfangreichen Änderungen kann es sinnvoll sein, die partitionierte DML zu verwenden.
Wenn die DML-Anweisungen in einer Transaktion zu mehr als 80.000 Mutationen führen, gibt die DML-Anweisung, die die Transaktion über das Limit hinaus ausführt, einen
BadUsage
-Fehler mit einer Meldung über zu viele Mutationen zurück.Wenn die DML-Anweisungen in einer Transaktion dazu führen, dass ihre Größe 100 MB überschreitet, gibt die DML-Anweisung, die die Transaktion über das Limit hinaus ausführt, einen
BadUsage
-Fehler mit einer Nachricht über das Überschreiten des Limits durch die Transaktion zurück.
Mit DML ausgeführte Mutationen werden nicht an den Client zurückgegeben. Wenn die Commit-Anfrage ausgeführt wird, werden sie in diese Anfrage eingebunden, und sie unterliegen somit der Größenbegrenzung. Auch wenn die von Ihnen gesendete Commit-Anfrage nicht so groß ist, kann die Transaktion dadurch immer noch die Größenbegrenzung überschreiten.
Anweisungen in der Google Cloud Console ausführen
Mit den im Folgenden aufgeführten Schritten führen Sie eine DML-Anweisung in der Google Cloud Console aus.
Rufen Sie die Seite Spanner-Instanzen auf.
Wählen Sie Ihr Projekt aus der Drop-down-Liste in der Symbolleiste aus.
Klicken Sie auf den Namen der Instanz, die Ihre Datenbank enthält, um die Seite Instanzdetails aufzurufen.
Klicken Sie auf dem Tab Übersicht auf den Namen Ihrer Datenbank. Die Seite mit den Datenbankdetails wird angezeigt.
Klicken Sie auf Spanner Studio.
Geben Sie eine DML-Anweisung ein. Durch die im Folgenden aufgeführte Anweisung wird beispielsweise eine neue Zeile in die Tabelle
Singers
geschrieben.INSERT Singers (SingerId, FirstName, LastName) VALUES (1, 'Marc', 'Richards')
Klicken Sie auf Abfrage ausführen. Das Ergebnis wird in der Google Cloud Console angezeigt.
Anweisungen mit der Google Cloud CLI ausführen
Zum Ausführen von DML-Anweisungen können Sie den Befehl gcloud spanner databases execute-sql
verwenden. Im folgenden Beispiel wird eine neue Zeile zur Tabelle Singers
hinzugefügt.
gcloud spanner databases execute-sql example-db --instance=test-instance \ --sql="INSERT Singers (SingerId, FirstName, LastName) VALUES (1, 'Marc', 'Richards')"
Daten mit der Clientbibliothek ändern
Wenn Sie DML-Anweisungen mithilfe der Clientbibliothek ausführen möchten, gehen Sie so vor:
- Erstellen Sie eine Lese-Schreib-Transaktion.
- Rufen Sie die Methode der Clientbibliothek auf, mit der DML ausgeführt wird, und übergeben Sie dabei die DML-Anweisung.
- Dem Rückgabewert der Methode für die DML-Ausführung können Sie die Anzahl der eingefügten, aktualisierten oder gelöschten Zeilen entnehmen.
Im folgenden Codebeispiel wird eine neue Zeile in die Tabelle Singers
eingefügt.
Für das Ausführen einer DML-Anweisung verwenden Sie die Funktion ExecuteDml()
.
Für das Ausführen einer DML-Anweisung verwenden Sie die Methode ExecuteNonQueryAsync()
.
Für das Ausführen einer DML-Anweisung verwenden Sie die Methode Update()
.
Für das Ausführen einer DML-Anweisung verwenden Sie die Methode executeUpdate()
.
Für das Ausführen einer DML-Anweisung verwenden Sie die Methode runUpdate()
.
Für das Ausführen einer DML-Anweisung verwenden Sie die Methode executeUpdate()
.
Für das Ausführen einer DML-Anweisung verwenden Sie die Methode execute_update()
.
Für das Ausführen einer DML-Anweisung verwenden Sie die Methode execute_update()
.
Mit dem im Folgenden aufgeführten Codebeispiel wird die Spalte MarketingBudget
der Tabelle Albums
anhand einer WHERE
-Klausel aktualisiert.
Im folgenden Codebeispiel werden alle Zeilen in der Tabelle Singers
gelöscht, wobei für die Spalte FirstName
der Wert Alice
gilt.
Im folgenden Beispiel, das nur für Datenbanken mit GoogleSQL-Dialekt gilt, wird ein STRUCT
mit gebundenen Parametern zum Aktualisieren von LastName
in Zeilen verwendet, die nach FirstName
und LastName
gefiltert sind.
Daten mit DML-Anweisungen ändern, die Ergebnisse zurückgeben
Die THEN RETURN
-Klausel (Datenbanken mit GoogleSQL-Dialekt) oder die RETURNING
-Klausel (Datenbanken mit PostgreSQL-Dialekt) ist für Szenarien gedacht, in denen Sie Daten aus geänderten Zeilen abrufen möchten. Das ist besonders nützlich, wenn Sie nicht angegebene Werte in den DML-Anweisungen, Standardwerte oder generierte Spalten sehen möchten.
So führen Sie DML-Anweisungen mit Rückgabewerten mithilfe der Clientbibliothek aus:
- Erstellen Sie eine Lese-Schreib-Transaktion.
- Rufen Sie die Methode der Clientbibliothek auf, mit der Abfragen ausgeführt werden, und übergeben Sie dabei die zurückgegebene DML-Anweisung, um Ergebnisse zu erhalten.
Im folgenden Codebeispiel wird eine neue Zeile in die Tabelle Singers
eingefügt und die generierte Spalte „Vollständiger Name“ der eingefügten Datensätze zurückgegeben.
Im folgenden Codebeispiel wird die Spalte MarketingBudget
der Tabelle Albums
anhand einer WHERE
-Klausel aktualisiert und die geänderte Spalte MarketingBudget
der aktualisierten Datensätze zurückgegeben.
Im folgenden Codebeispiel werden alle Zeilen in der Tabelle Singers
gelöscht, wobei für die Spalte FirstName
der Wert Alice
gilt. Die Spalten SingerId
und FullName
der gelöschten Einträge werden zurückgegeben.
Daten lesen, die in derselben Transaktion geschrieben wurden
Änderungen, die Sie innerhalb von DML-Anweisungen vornehmen, sind für nachfolgende Anweisungen in derselben Transaktion sichtbar. Dies unterscheidet sich von Mutationen, bei deren Verwendung Änderungen erst sichtbar werden, wenn der Commit der Transaktion durchgeführt wird.
Spanner prüft nach jeder DML-Anweisung die Einschränkungen. Dies unterscheidet sich von der Verwendung von Mutationen, bei denen Spanner die Mutationen im Client bis zum Commit puffert und Einschränkungen erst zum Zeitpunkt des Commits geprüft werden. Durch Auswertung der Einschränkungen nach jeder Anweisung ist bei Spanner garantiert, dass die Daten, die eine DML-Anweisung zurückgibt, mit dem Schema konsistent sind.
Im folgenden Beispiel wird eine Zeile in der Tabelle Singers
aktualisiert und dann eine SELECT
-Anweisung zur Ausgabe der neuen Werte ausgeführt.
Abfrageplan abrufen
Sie können mithilfe der Google Cloud Console, der Clientbibliotheken und des gcloud
-Befehlszeilentools einen Abfrageplan abrufen.
Partitionierte DML verwenden
Die partitionierte DML wurde für Sammelaktualisierungen und -löschungen konzipiert, insbesondere für regelmäßiges Bereinigen und Backfilling.
Anweisungen mit der Google Cloud CLI ausführen
Zum Ausführen einer partitionierten DML-Anweisung verwenden Sie den Befehl gcloud spanner databases execute-sql
mit der Option --enable-partitioned-dml
. Im folgenden Beispiel werden Zeilen in der Tabelle Albums
aktualisiert.
gcloud spanner databases execute-sql example-db \ --instance=test-instance --enable-partitioned-dml \ --sql='UPDATE Albums SET MarketingBudget = 0 WHERE MarketingBudget IS NULL'
Daten mit der Clientbibliothek ändern
Mit den folgenden Codebeispielen wird die Spalte MarketingBudget
der Tabelle Albums
aktualisiert.
Zum Ausführen einer partitionierten DML-Anweisung verwenden Sie die Funktion ExecutePartitionedDml()
.
Zum Ausführen einer partitionierten DML-Anweisung verwenden Sie die Methode ExecutePartitionedUpdateAsync()
.
Zum Ausführen einer partitionierten DML-Anweisung verwenden Sie die Methode PartitionedUpdate()
.
Zum Ausführen einer partitionierten DML-Anweisung verwenden Sie die Methode executePartitionedUpdate()
.
Zum Ausführen einer partitionierten DML-Anweisung verwenden Sie die Methode runPartitionedUpdate()
.
Zum Ausführen einer partitionierten DML-Anweisung verwenden Sie die Methode executePartitionedUpdate()
.
Zum Ausführen einer partitionierten DML-Anweisung verwenden Sie die Methode execute_partitioned_dml()
.
Zum Ausführen einer partitionierten DML-Anweisung verwenden Sie die Methode execute_partitioned_update()
.
Im folgenden Codebeispiel werden Zeilen aus der Tabelle Singers
anhand der Spalte SingerId
gelöscht.
Batch-DML verwenden
Zum Vermeiden der zusätzlichen Latenz, die durch mehrere serielle Anfragen entsteht, verwenden Sie Batch-DML. Sie können dann mehrere INSERT
-, UPDATE
- oder DELETE
-Anweisungen in einer einzigen Transaktion senden:
Verwenden Sie die Funktion ExecuteBatchDml()
, um eine Liste von DML-Anweisungen auszuführen.
Verwenden Sie die Methode connection.CreateBatchDmlCommand()
, um Ihren Batch-Befehl zu erstellen, verwenden Sie die Methode Add
, um DML-Anweisungen hinzuzufügen, und führen Sie die Anweisungen mit der Methode ExecuteNonQueryAsync()
aus.
Zum Ausführen eines Arrays von DML-Statement
-Objekten verwenden Sie die Methode BatchUpdate()
.
Zum Ausführen von ArrayList
für mehrere DML-Statement
-Objekte verwenden Sie die Methode transaction.batchUpdate()
.
Zum Ausführen einer Liste von DML-Anweisungen verwenden Sie transaction.batchUpdate()
.
Verwenden Sie executeUpdateBatch()
, um eine Liste von DML-Anweisungen zu erstellen, und dann commit()
, um die Anweisungen auszuführen.
Zum Ausführen von mehreren DML-Anweisungsstrings verwenden Sie transaction.batch_update()
.
Zum Ausführen von mehreren DML-Anweisungsstrings verwenden Sie transaction.batch_update
.