Auf dieser Seite wird beschrieben, wie Sie in Cloud Spanner Lesevorgänge außerhalb des Kontexts von schreibgeschützten Transaktionen und Lese-Schreib-Transaktionen ausführen. Wenn also eine der folgenden Situationen zutrifft, lesen Sie stattdessen die Seite "Transaktionen":
Wenn Sie einen Schreibvorgang ausführen müssen, der vom Wert von einem oder mehreren Lesevorgängen abhängt, sollten Sie den Lesevorgang als Bestandteil einer Lese-Schreib-Transaktion ausführen. Weitere Informationen zu Lese-Schreib-Transaktionen
Wenn Sie mehrere Leseaufrufe durchführen, für die eine konsistente Datensicht erforderlich ist, sollten Sie die Lesevorgänge als Bestandteil einer schreibgeschützten Transaktion ausführen. Weitere Informationen zu schreibgeschützten Transaktionen
Wenn Sie einen einzigen Leseaufruf ausführen oder gleichzeitig Daten schreiben müssen, lesen Sie weiter.
Lesetypen
Cloud Spanner bietet Ihnen zwei Typen von Lesevorgängen, um festzulegen, wie aktuell die Daten beim Lesen sein sollen:
- Ein starker Lesevorgang ist ein Lesevorgang zu einem aktuellen Zeitstempel, der garantiert alle Daten erfasst, die bis zum Beginn dieses Lesevorgangs mit einem Commit festgeschrieben wurden. Cloud Spanner verwendet standardmäßig starke Lesevorgänge, um Leseanfragen zu bedienen.
- Ein veralteter Lesevorgang erfasst Daten an einem Zeitpunkt (Zeitstempel) in der Vergangenheit. Wenn Ihre Anwendung latenzabhängig ist, aber veraltete Daten toleriert, können veraltete Lesevorgänge Leistungsvorteile bieten.
Zeitstempelgrenzen auswählen
Legen Sie eine Zeitstempelgrenze für die Leseanforderung fest, um die gewünschte Art von Lesevorgang auszuwählen. Gehen Sie bei der Auswahl einer Zeitstempelgrenze gemäß den folgenden Best Practices vor:
Wählen Sie nach Möglichkeit starke Lesevorgänge. Dies ist die standardmäßige Zeitstempelgrenze für Cloud Spanner-Lesevorgänge, einschließlich schreibgeschützter Transaktionen. Starke Lesevorgänge berücksichtigen garantiert die Auswirkungen aller Transaktionen, die vor dem Start des Lesevorgangs durchgeführt wurden, unabhängig davon, bei welchem Replikat der Lesevorgang eingeht. Aus diesem Grund machen starke Lesevorgänge Anwendungscode einfacher und Anwendungen vertrauenswürdiger. Weitere Informationen zu den Konsistenzeigenschaften von Cloud Spanner finden Sie unter TrueTime und externe Konsistenz.
Wenn die Latenz in manchen Situationen starke Lesevorgänge verhindert, verwenden Sie veraltete Lesevorgänge (begrenzte Veralterung oder exakte Veralterung), um die Leistung zu verbessern, sofern die Lesevorgänge nicht ganz aktuell sein müssen. Wie unter Cloud Spanner-Replikation beschrieben, sind 15 Sekunden ein angemessener Veralterungswert für eine gute Leistung.
Einzelne Leseaufrufe
Cloud Spanner unterstützt Methoden für einzelne Leseaufrufe (d. h. einen Leseaufruf außerhalb des Kontexts einer Transaktion) für eine Datenbank so:
- Lesevorgang als SQL-Abrufanweisung oder über die Lese-API von Cloud Spanner ausführen
- Starken Lesevorgang aus einer einzelnen Zeile oder mehreren Zeilen in einer Tabelle durchführen
- Veralteten Lesevorgang aus einer einzelnen Zeile oder mehreren Zeilen in einer Tabelle durchführen
- Aus einer einzelnen Zeile oder mehreren Zeilen in einem sekundären Index lesen
In den folgenden Abschnitten wird erläutert, wie Lesemethoden der Cloud-Clientbibliotheken für die Cloud Spanner API verwendet werden.
Abfrage ausführen
Im Folgenden wird gezeigt, wie eine SQL-Abrufanweisung für eine Datenbank ausgeführt wird.
C++
Führen Sie mit ExecuteQuery()
eine SQL-Abfrageanweisung für eine Datenbank aus.
C#
Verwenden Sie ExecuteReaderAsync()
, um die Datenbank abzufragen.
Go
Verwenden Sie Client.Single().Query
, um die Datenbank abzufragen.
Java
Verwenden Sie ReadContext.executeQuery
, um die Datenbank abzufragen.
Node.js
Verwenden Sie Database.run
, um die Datenbank abzufragen.
PHP
Verwenden Sie Database::execute
, um die Datenbank abzufragen.
Python
Verwenden Sie Database.execute_sql
, um die Datenbank abzufragen.
Ruby
Verwenden Sie Client#execute
, um die Datenbank abzufragen.
Achten Sie beim Erstellen einer SQL-Anweisung auf die SQL-Referenzinformationen zur SQL-Abfragesyntax sowie zu Funktionen und Operatoren.
Starken Lesevorgang durchführen
Im Folgenden wird gezeigt, wie ein starker Lesevorgang für null oder mehr Zeilen aus einer Datenbank durchgeführt wird.
C++
Der Code zum Lesen von Daten unterscheidet sich nicht von dem Code im vorherigen Beispiel zum Abfragen von Cloud Spanner durch die Ausführung einer SQL-Anweisung.
C#
Der Code zum Lesen von Daten unterscheidet sich nicht von dem Code im vorherigen Beispiel zum Abfragen von Cloud Spanner durch die Ausführung einer SQL-Anweisung.
Go
Verwenden Sie Client.Single().Read
, um Zeilen aus der Datenbank zu lesen.
In diesem Beispiel wird mit AllKeys
eine Sammlung von Schlüsseln oder Schlüsselbereichen definiert, die gelesen werden sollen.
Java
Verwenden Sie ReadContext.read
, um Zeilen aus der Datenbank zu lesen.
In diesem Beispiel wird mit KeySet
eine Sammlung von Schlüsseln oder Schlüsselbereichen definiert, die gelesen werden sollen.
Node.js
Verwenden Sie Table.read
, um Zeilen aus der Datenbank zu lesen.
In diesem Beispiel wird mit keySet
eine Sammlung von Schlüsseln oder Schlüsselbereichen definiert, die gelesen werden sollen.
PHP
Verwenden Sie Database::read
, um Zeilen aus der Datenbank zu lesen.
In diesem Beispiel wird mit keySet
eine Sammlung von Schlüsseln oder Schlüsselbereichen definiert, die gelesen werden sollen.
Python
Verwenden Sie Database.read
, um Zeilen aus der Datenbank zu lesen.
In diesem Beispiel wird mit KeySet
eine Sammlung von Schlüsseln oder Schlüsselbereichen definiert, die gelesen werden sollen.
Ruby
Verwenden Sie Client#read
, um Zeilen aus der Datenbank zu lesen.
Veralteten Lesevorgang durchführen
Der folgende Beispielcode zeigt, wie ein veralteter Lesevorgang von null oder mehr Zeilen aus einer Datenbank unter Verwendung einer Zeitstempelgrenze des Typs exakte Veralterung durchgeführt wird. Anweisungen zur Durchführung eines veralteten Lesevorgangs mit einer Zeitstempelgrenze vom Typ begrenzte Veralterung finden Sie im Hinweis nach dem Beispielcode. Weitere Informationen über die verschiedenen verfügbaren Arten von Zeitstempelgrenzen finden Sie unter Zeitstempelgrenzen.
C++
Verwenden Sie ExecuteQuery()
mit MakeReadOnlyTransaction()
und Transaction::ReadOnlyOptions()
, um einen veralteten Lesevorgang durchzuführen.
C#
Verwenden Sie die Methode BeginReadOnlyTransactionAsync
für eine connection
mit einem angegebenen Wert für TimestampBound.OfExactStaleness()
, um die Datenbank abzufragen.
Go
Verwenden Sie Client.ReadOnlyTransaction().WithTimestampBound()
und geben Sie einen Wert für ExactStaleness
an, um mithilfe einer Zeitstempelgrenze mit exakter Veralterung einen Lesevorgang für Zeilen aus der Datenbank durchzuführen.
In diesem Beispiel wird mit AllKeys
eine Sammlung von Schlüsseln oder Schlüsselbereichen definiert, die gelesen werden sollen.
Java
Verwenden Sie die Methode read
eines Elements ReadContext
, das einen festgelegten Parameter TimestampBound.ofExactStaleness()
enthält, um unter Verwendung einer Zeitstempelgrenze vom Typ "exakte Veralterung" einen Lesevorgang für Zeilen aus der Datenbank durchzuführen.
In diesem Beispiel wird mit KeySet
eine Sammlung von Schlüsseln oder Schlüsselbereichen definiert, die gelesen werden sollen.
Node.js
Verwenden Sie Table.read
mit der Option exactStaleness
, um Zeilen mit einer Zeitstempelgrenze vom Typ "exakte Veralterung" aus der Datenbank zu lesen.
In diesem Beispiel wird mit keySet
eine Sammlung von Schlüsseln oder Schlüsselbereichen definiert, die gelesen werden sollen.
PHP
Verwenden Sie Database::read
mit einem angegebenen Wert für exactStaleness
, um Zeilen mit einer Zeitstempelgrenze vom Typ "exakte Veralterung" aus der Datenbank zu lesen.
In diesem Beispiel wird mit keySet
eine Sammlung von Schlüsseln oder Schlüsselbereichen definiert, die gelesen werden sollen.
Python
Verwenden Sie die Methode read
eines Elements Database
snapshot
mit einem angegebenen Wert für exact_staleness
, um Zeilen mit einer Zeitstempelgrenze vom Typ "exakte Veralterung" aus der Datenbank zu lesen.
In diesem Beispiel wird mit KeySet
eine Sammlung von Schlüsseln oder Schlüsselbereichen definiert, die gelesen werden sollen.
Ruby
Verwenden Sie die Methode read
eines Snapshots Client
mit einem in Sekunden angegebenen Wert für staleness
, um Zeilen mit einer Zeitstempelgrenze vom Typ "exakte Veralterung" aus der Datenbank zu lesen.
Lesevorgang mit einem Index ausführen
Im Folgenden wird gezeigt, wie Sie mit einem Index null oder mehr Zeilen aus einer Datenbank auslesen.
C++
Verwenden Sie die Funktion Read()
, um einen Lesevorgang mit einem Index durchzuführen.
C#
Lesen Sie Daten mit dem Index aus, indem Sie eine Abfrage ausführen, in der der Index explizit angegeben wird:
Go
Verwenden Sie Client.Single().ReadUsingIndex
, um Zeilen mit einem Index aus der Datenbank zu lesen.
Java
Verwenden Sie ReadContext.readUsingIndex
, um Zeilen mit einem Index aus der Datenbank zu lesen.
Node.js
Verwenden Sie Table.read
und geben Sie den Index in der Abfrage an, um Zeilen mit einem Index aus der Datenbank zu lesen.
PHP
Verwenden Sie Database::read
und geben Sie den Index an, um Zeilen mit einem Index aus der Datenbank zu lesen.
Python
Verwenden Sie Database.read
und geben Sie den Index an, um Zeilen mit einem Index aus der Datenbank zu lesen.
Ruby
Verwenden Sie Client#read
und geben Sie den Index an, um Zeilen mit einem Index aus der Datenbank zu lesen.
Daten gleichzeitig lesen
Wenn große Datenmengen aus Cloud Spanner gelesen oder abgefragt werden, kann es hilfreich sein, die Abfrage in kleinere Teile oder Partitionen aufzuteilen und mehrere Rechner zu verwenden, um die Partitionen abzurufen.
Mithilfe der Cloud Spanner-Clientbibliotheken können Sie API-Vorgänge gleichzeitig ausführen. SQL-Abfragen lassen sich jedoch nur partitionieren, wenn der erste Operator im Abfrageausführungsplan Distributed Union ist. Folgen Sie der Anleitung unter Best Practices für SQL, um sich den Abfrageausführungsplan für eine bestimmte SQL-Abfrage anzeigen zu lassen.
Sobald Sie den Abfrageausführungsplan haben, überprüfen Sie, ob der erste darin enthaltene Operator Distributed Union ist.
C++
In diesem Beispiel werden Partitionen einer SQL-Abfrage der Tabelle Singers
abgerufen und die Abfrage wird anhand folgender Schritte über jede Partition ausgeführt:
- Erstellen einer Cloud Spanner-Batchtransaktion
- Erstellen von Partitionen für die Abfrage, damit die Partitionen auf mehrere Worker verteilt werden können.
- Abrufen der Abfrageergebnisse für jede Partition.
C#
In diesem Beispiel werden Partitionen einer SQL-Abfrage der Tabelle Singers
abgerufen und die Abfrage wird anhand folgender Schritte über jede Partition ausgeführt:
- Erstellen einer Cloud Spanner-Batchtransaktion
- Erstellen von Partitionen für die Abfrage, damit die Partitionen auf mehrere Worker verteilt werden können.
- Abrufen der Abfrageergebnisse für jede Partition.
Go
In diesem Beispiel werden Partitionen einer SQL-Abfrage der Tabelle Singers
abgerufen und die Abfrage wird anhand folgender Schritte über jede Partition ausgeführt:
- Erstellen eines Cloud Spanner-Clients und einer Transaktion.
- Erstellen von Partitionen für die Abfrage, damit die Partitionen auf mehrere Worker verteilt werden können.
- Abrufen der Abfrageergebnisse für jede Partition.
Java
In diesem Beispiel werden Partitionen einer SQL-Abfrage der Tabelle Singers
abgerufen und die Abfrage wird anhand folgender Schritte über jede Partition ausgeführt:
- Erstellen eines Cloud Spanner-Batch-Clients und einer Transaktion.
- Erstellen von Partitionen für die Abfrage, damit die Partitionen auf mehrere Worker verteilt werden können.
- Abrufen der Abfrageergebnisse für jede Partition.
Node.js
In diesem Beispiel werden Partitionen einer SQL-Abfrage der Tabelle Singers
abgerufen und die Abfrage wird anhand folgender Schritte über jede Partition ausgeführt:
- Erstellen eines Cloud Spanner-Clients und eines Batches.
- Erstellen von Partitionen für die Abfrage, damit die Partitionen auf mehrere Worker verteilt werden können.
- Abrufen der Abfrageergebnisse für jede Partition.
PHP
In diesem Beispiel werden Partitionen einer SQL-Abfrage der Tabelle Singers
abgerufen und die Abfrage wird anhand folgender Schritte über jede Partition ausgeführt:
- Erstellen eines Cloud Spanner-Clients und eines Batches.
- Erstellen von Partitionen für die Abfrage, damit die Partitionen auf mehrere Worker verteilt werden können.
- Abrufen der Abfrageergebnisse für jede Partition.
Python
In diesem Beispiel werden Partitionen einer SQL-Abfrage der Tabelle Singers
abgerufen und die Abfrage wird anhand folgender Schritte über jede Partition ausgeführt:
- Erstellen eines Cloud Spanner-Clients und einer Batch-Transaktion.
- Erstellen von Partitionen für die Abfrage, damit die Partitionen auf mehrere Worker verteilt werden können.
- Abrufen der Abfrageergebnisse für jede Partition.
Ruby
In diesem Beispiel werden Partitionen einer SQL-Abfrage der Tabelle Singers
abgerufen und die Abfrage wird anhand folgender Schritte über jede Partition ausgeführt:
- Erstellen eines Cloud Spanner-Batch-Clients.
- Erstellen von Partitionen für die Abfrage, damit die Partitionen auf mehrere Worker verteilt werden können.
- Abrufen der Abfrageergebnisse für jede Partition.