Best Practices für die Datenbearbeitungssprache

Auf dieser Seite werden die Best Practices für die Verwendung der Datenbearbeitungssprache (Data Manipulation Language – DML) und der partitionierten DML beschrieben.

Mit einer WHERE-Klausel die Anzahl der gesperrten Zeilen reduzieren

Sie führen DML-Anweisungen in Lese- und Schreibtransaktionen aus. Wenn Cloud 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 Cloud 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 Cloud 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 Cloud 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 Cloud Spanner die komplette Tabelle prüft und gemeinsame Sperren übernimmt, die die komplette Tabelle betreffen. Cloud 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:

-- RECOMMENDED: INCLUDING THE PRIMARY KEY COLUMN IN THE WHERE CLAUSE

UPDATE Singers SET FirstName = "Marcel"
WHERE FirstName = "Marc" AND LastName = "Richards" AND SingerId = 1;

DML-Anweisungen und Mutationen nicht in derselben Transaktion verwenden

Cloud Spanner speichert Einfügungs-, Aktualisierungs- und Löschvorgänge, die mit DML-Anweisungen auf der Serverseite durchgeführt wurden, im Zwischenspeicher. Die Ergebnisse sind für nachfolgende SQL- und DML-Anweisungen in derselben Transaktion sichtbar. Dieses Verhalten unterscheidet sich von der Mutation API, bei der Cloud Spanner die Mutationen auf der Clientseite zwischenspeichert und sie serverseitig als Teil des Commit-Vorgangs sendet. Folglich sind Mutationen in der Commit-Anfrage für SQL- oder DML-Anweisungen in derselben Transaktion nicht sichtbar.

Eventuell möchten Sie DML-Anweisungen und Mutationen in derselben Transaktion kombinieren, da einige Vorgänge nur in der Mutation API unterstützt werden. Ein Beispiel dafür ist insert_or_update. Wenn eine Transaktion sowohl DML-Anweisungen als auch Mutationen in der Commit-Anfrage enthält, führt Cloud Spanner die DML-Anweisungen vor den Mutationen aus. Sie sollten entweder DML-Anweisungen oder die Mutationen in einer einzelnen Transaktion verwenden, nicht jedoch beide, damit Sie die Reihenfolge der Ausführung in Ihrem Client-Bibliothekscode nicht berücksichtigen müssen. Wenn Sie beide verwenden, sollten Sie Schreibvorgänge nur am Ende der Transaktion puffern.

Mit der Funktion PENDING_COMMIT_TIMESTAMP um Commit-Zeitstempel schreiben

Schreiben Sie mit der Funktion PENDING_COMMIT_TIMESTAMP den Commit-Zeitstempel in eine DML-Anweisung. Cloud Spanner wählt den Commit-Zeitstempel aus, wenn der Commit der Transaktion ausgeführt wird.

Partitionierte DML-, Datums- und Zeitstempelfunktionen

Partitionierte DML verwendet eine oder mehrere Transaktionen, die möglicherweise zu unterschiedlichen Zeitpunkten ausgeführt und bereitgestellt werden. Wenn Sie die Datums- oder Zeitstempelfunktion verwenden, können die geänderten Zeilen andere Werte enthalten.

Mit Batch-DML mehrere DML-Anfragen in einer einzelnen Anfrage senden

Verwenden Sie Batch-DML, um mehrere DML-Anfragen in einer einzelnen Anfrage zu senden. Auf diese Weise wird nur eine Umlaufzeit von Client-Server benötigt, um die Latenz zu reduzieren.

Einzelne DML-Anweisung mit einem Array von Daten verwenden, um mehrere Zeilen derselben Tabelle einzufügen oder zu löschen

Betrachten Sie folgende Szenarien: Sie möchten bis zu 1.500 Zeilen in derselben Tabelle in einer einzigen Transaktion INSERT speichern. Oder möchtest duDELETE Hunderte Zeilen einer Tabelle in einer einzigen Transaktion. In beiden Szenarien arbeiten Sie mit einer einzelnen Tabelle, einem einzelnen DML-Anweisungstyp und einer einzelnen Transaktion.

Machen Sie die Änderung in diesem Fall in einer einzigen DML-Anweisung mit Datenarray, um die Leistung zu verbessern.

-- Inserting rows
INSERT INTO Singers (SingerId, FirstName, LastName)
SELECT *
FROM UNNEST ([(4, 'Lea', 'Martin'),
      (5, 'David', 'Lomond'),
      (6, 'Elena', 'Campbell')]);

-- Deleting rows
DELETE FROM Albums
WHERE (SingerId, AlbumId)
IN UNNEST ([(6,8),(3,7)]);

Noch bessere Leistung erzielen Sie, wenn Sie einen Parameter für die Arraydaten definieren und verwenden.

-- Inserting rows using a parameter
-- @insertarray parameter = [(4, 'Lea', 'Martin'),(5, 'David', 'Lomond'),(6, 'Elena', 'Campbell')]
INSERT INTO Singers (SingerId, FirstName, LastName)
SELECT *
FROM UNNEST ( @insertarray );

-- Deleting rows using a parameter
-- @deletearray parameter = [(6,8),(3,7)]
DELETE FROM Albums
WHERE (SingerId, AlbumId)
IN UNNEST ( @deletearray );