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 Spanner Daten liest, erhält gemeinsam genutzte Lesesperren für begrenzte Teile der von Ihnen gelesenen Zeilenbereiche. Insbesondere werden diese Sperren nur für die Spalten übernommen, auf die Sie zugreifen. Die Sperren können Daten enthalten, die Filterbedingung der WHERE-Klausel erfüllen.

Wenn Spanner Daten mit DML-Anweisungen ändert, werden exklusive Sperren für die 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 ganze Tabelle umfasst, Sperren können verhindern, dass andere Transaktionen parallel verarbeitet werden.

Um Daten so effizient wie möglich zu ändern, verwenden Sie die Klausel WHERE, die Spanner so, dass nur die erforderlichen Zeilen gelesen werden. Sie können dafür einen Filter für den Primärschlüssel oder für den Schlüssel eines Sekundärindex nutzen. Die WHERE-Klausel schränkt den und ermöglicht 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önnten die folgende DML-Datei ausführen: erzwingt, aber sie zwingt Spanner, die gesamte Tabelle zu scannen, und ruft freigegebene Sperren ab, die die gesamte Tabelle abdecken. Daher muss Spanner mehr Daten als nötig lesen und gleichzeitige Transaktionen können die Daten nicht gleichzeitig ä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 für FirstName oder LastName kein Index vorhanden ist, müssen Sie die gesamte Tabelle nach den Sängern suchen. Wenn Sie keine sekundäre Index erstellen, um die Aktualisierung effizienter zu machen, dann fügen Sie die Spalte SingerId ein in der WHERE-Klausel.

Die Spalte SingerId ist die einzige Primärschlüsselspalte für die Tabelle Singers. Führen Sie SELECT in einem separaten schreibgeschützte Transaktion vor der Aktualisierungstransaktion:


  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;

Vermeiden Sie die Verwendung von DML-Anweisungen und -Mutationen in derselben Transaktion

Spanner puffert Einfügungen, Aktualisierungen und Löschungen, die mit DML ausgeführt wurden Anweisungen auf der Serverseite und die Ergebnisse sind für nachfolgende SQL- und DML-Anweisungen in derselben Transaktion. Dieses Verhalten unterscheidet sich vom Mutation API, bei der Spanner die Daten zwischenspeichert die Mutationen auf der Clientseite und sendet sie serverseitig als Teil der Commit-Vorgang. Folglich sind Mutationen in der Commit-Anfrage für SQL- oder DML-Anweisungen in derselben Transaktion nicht sichtbar.

Vermeiden Sie die Verwendung von DML-Anweisungen und Mutationen in derselben Transaktion. Wenn Sie beide in derselben Transaktion verwenden, müssen Sie die Reihenfolge in Ihrem Client-Bibliothekscode ausführen. Wenn eine Transaktion sowohl DML enthält Anweisungen und Mutationen in derselben Anfrage ausführen, führt Spanner DML-Anweisungen vor den Mutationen.

Bei Vorgängen, die nur mit Mutationen unterstützt werden, DML-Anweisungen und Mutationen in derselben Transaktion kombinieren, zum Beispiel insert_or_update.

Wenn Sie beide verwenden, schreibt der Zwischenspeicher nur ganz am Ende der Transaktion.

Mit der Funktion PENDING_COMMIT_TIMESTAMP um Commit-Zeitstempel schreiben

GoogleSQL

Schreiben Sie mit der Funktion PENDING_COMMIT_TIMESTAMP den Commit-Zeitstempel in eine DML-Anweisung. Spanner wählt den Commit-Zeitstempel aus, wenn die Transaktion Commits übergeben.

PostgreSQL

Schreiben Sie mit der Funktion SPANNER.PENDING_COMMIT_TIMESTAMP() den Commit-Zeitstempel in eine DML-Anweisung. Spanner wählt den Commit-Zeitstempel aus, wenn die Transaktion Commits übergeben.

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.

Latenz mit Batch-DML verbessern

Verwenden Sie Batch-DML zum Senden von Nachrichten, um die Latenz zu verringern. mehrere DML-Anweisungen an Spanner innerhalb einer einzelnen Client-Server-Runde senden Fahrt.

Batch-DML kann Optimierungen auf Gruppen von Anweisungen innerhalb um Daten schneller und effizienter aktualisieren zu können.

  • Schreibvorgänge mit einer einzigen Anfrage ausführen

    Spanner optimiert automatisch zusammenhängende Gruppen ähnlicher INSERT-, UPDATE- oder DELETE-Batch-Anweisungen, die unterschiedliche Parameterwerte haben, wenn sie nicht gegen Datenabhängigkeiten verstoßen.

    Stellen Sie sich beispielsweise ein Szenario vor, in dem Sie eine große Anzahl neuer Zeilen in eine Tabelle namens Albums ein. Damit Spanner alle INSERT-Anweisungen in einer einzigen, effizienten serverseitigen Aktion kombiniert. beginnen Sie mit dem Schreiben einer entsprechenden DML-Anweisung, die SQL-Abfrage Parameter:

    INSERT INTO Albums (SingerId, AlbumId, AlbumTitle) VALUES (@Singer, @Album, @Title);
    

    Senden Sie dann einen DML-Batch an Spanner, der diese Anweisung aufruft. wiederholt und zusammenhängend, wobei sich die Wiederholungen nur in der -Werte, die Sie an die drei Abfrageparameter der Anweisung binden. Spanner diese strukturell identischen DML- in einen einzelnen serverseitigen Vorgang umwandeln, bevor sie ausgeführt werden.

  • Schreibvorgänge parallel ausführen

    Spanner optimiert automatisch zusammenhängende Gruppen von DML-Anweisungen durch parallele Ausführungen, die dabei keine Datenabhängigkeiten verursachen. Durch diese Optimierung profitieren mehr DML-Batches von der Leistung. -Anweisungen, da sie auf eine Mischung von DML-Anweisungstypen (INSERT, UPDATE und DELETE) und in parametrisierte oder nicht parametrisierte DML Aussagen.

    Unser Beispielschema enthält beispielsweise die Tabellen Singers, Albums und Accounts Albums ist mit Singers verschränkt und speichert Informationen zu Alben für Singers. Die folgende zusammenhängende Gruppe von Anweisungen schreibt neue Zeilen in mehrere Tabellen und enthält keine komplexen Daten Abhängigkeiten.

    INSERT INTO Singers (SingerId, Name) VALUES(1, "John Doe");
    INSERT INTO Singers (SingerId, Name) VALUES(2, "Marcel Richards");
    INSERT INTO Albums(SingerId, AlbumId, AlbumTitle) VALUES (1, 10001, "Album 1");
    INSERT INTO Albums(SingerId, AlbumId, AlbumTitle) VALUES (1, 10002, "Album 2");
    INSERT INTO Albums(SingerId, AlbumId, AlbumTitle) VALUES (2, 10001, "Album 1");
    UPDATE Accounts SET Balance = 100 WHERE AccountId = @AccountId;
    

    Spanner optimiert diese Gruppe von DML-Anweisungen durch Ausführen der Anweisungen parallel. Die Schreibvorgänge werden in der Reihenfolge der Anweisungen in Die Batch-Verarbeitung und verwaltet die Batch-DML-Semantik, wenn eine Anweisung während Ausführung.