Questa pagina descrive come eseguire letture in Spanner al di fuori del contesto delle transazioni di sola lettura e lettura/scrittura. Se si verifica una delle seguenti condizioni, devi leggere la pagina Transazioni:
Se è necessario scrivere, a seconda del valore di una o più letture, dovresti eseguire la lettura come parte di una transazione di lettura/scrittura. Per ulteriori informazioni le informazioni, vedi transazioni di lettura/scrittura.
Se effettui più chiamate di lettura che richiedono una visione coerente delle i tuoi dati, dovresti eseguire le letture come parte di un transazione. Per ulteriori informazioni, vedi transazioni di sola lettura.
Tipi di lettura
Spanner ti consente di determinare il livello di attualità dei dati quando legge i dati offrendo due tipi di letture:
- Una lettura forte è una lettura in un timestamp corrente e garantisce che tutte le letture siano di cui è stato eseguito il commit fino all'inizio di questa lettura. Spanner per impostazione predefinita utilizza letture efficaci per gestire le richieste di lettura.
- Una lettura inattiva viene letta in un timestamp nel passato. Se la tua applicazione è sensibili alla latenza, ma in grado di tollerare dati inattivi, le letture inattive possono fornire in termini di prestazioni.
Per scegliere il tipo di lettura desiderato, imposta un limite di timestamp sulla richiesta di lettura. Per la scelta di un timestamp, segui le best practice riportate di seguito limite:
Scegli letture efficaci quando possibile. Questi sono i timestamp predefiniti per le letture di Spanner, incluse le transazioni di sola lettura. Elevata le letture siano garantiti per osservare gli effetti di tutte le transazioni che si sono impegnate prima dell'inizio dell'operazione, indipendentemente da quale replica riceve lette. Per questo motivo, letture efficaci rendono più semplice il codice dell'applicazione le applicazioni più affidabili. Scopri di più sulla coerenza di Spanner in TrueTime and External Consistency.
Se la latenza rende inattuabili letture efficaci in alcune situazioni, utilizza dati inattivi (inattività limitata o esatta) per migliorare le prestazioni nel luoghi in cui non è necessario che le letture siano il più recenti possibile. Come descritto nella pagina Replica, 15 secondi sono una di inattività ragionevole da utilizzare per ottenere buone prestazioni.
Leggere i dati con un ruolo di database
Se sei un utente con controllo dell'accesso granulare, devi selezionare un'opzione ruolo di database per eseguire istruzioni e query SQL, nonché per eseguire righe su un database. La selezione del ruolo persiste per tutta la sessione finché non cambi il ruolo.
Per istruzioni su come eseguire una lettura con un ruolo di database, consulta Accedere a un database con un controllo dell'accesso granulare.
Metodi di lettura singoli
Spanner supporta metodi di lettura singoli, ovvero una lettura all'esterno contesto di una transazione) su un database per:
- Esecuzione della lettura come istruzione di query SQL o utilizzo l'API Read.
- Esecuzione di una lettura efficace da una singola riga o più righe di una tabella.
- Esecuzione di una lettura inattiva da una singola riga o da più righe di una tabella.
- Lettura da una singola riga o da più righe in un indice secondario.
Se vuoi instradare singole letture a una replica o una regione specifica all'interno di una configurazione di istanze multiregionali o di una configurazione regionale personalizzata con regioni di sola lettura facoltative, consulta Letture dirette.
Le seguenti sezioni descrivono come utilizzare i metodi di lettura utilizzando librerie client di Spanner.
Esegui una query
Di seguito viene illustrato come eseguire un'istruzione di query SQL su un database.
GoogleSQL
C++
Usa ExecuteQuery()
per eseguire un'istruzione di query SQL su un database.
C#
Usa ExecuteReaderAsync()
per eseguire query sul database.
Vai
Usa Client.Single().Query
per eseguire query sul database.
Java
Usa ReadContext.executeQuery
per eseguire query sul database.
Node.js
Usa Database.run
per eseguire query sul database.
PHP
Usa Database::execute
per eseguire query sul database.
Python
Usa Database.execute_sql
per eseguire query sul database.
Ruby
Usa Client#execute
per eseguire query sul database.
Consulta i riferimenti di sintassi delle query e funzioni e operatori di SQL quando per creare un'istruzione SQL.
Esegui una lettura efficace
Di seguito viene illustrato come eseguire una lettura sicura di zero o più righe da un per configurare un database.
GoogleSQL
C++
Il codice per leggere i dati è uguale all'esempio precedente per l'esecuzione di query Spanner eseguendo una query SQL.
C#
Il codice per leggere i dati è uguale all'esempio precedente per l'esecuzione di query Spanner eseguendo una query SQL.
Vai
Utilizza Client.Single().Read
per leggere le righe del database.
L'esempio utilizza AllKeys
per definire una raccolta di chiavi o intervalli di chiavi per
lette.
Java
Utilizza ReadContext.read
per leggere le righe del database.
L'esempio utilizza KeySet
per definire una raccolta di chiavi o intervalli di chiavi per
lette.
Node.js
Utilizza Table.read
per leggere le righe del database.
L'esempio utilizza keySet
per definire una raccolta di chiavi o intervalli di chiavi per
lette.
PHP
Utilizza Database::read
per leggere le righe del database.
L'esempio utilizza keySet
per definire una raccolta di chiavi o intervalli di chiavi per
lette.
Python
Utilizza Database.read
per leggere le righe del database.
L'esempio utilizza KeySet
per definire una raccolta di chiavi o intervalli di chiavi per
lette.
Ruby
Utilizza Client#read
per leggere le righe del database.
Esegui una lettura inattiva
Il codice campione seguente mostra come eseguire una lettura inattiva di zero o più righe da un database utilizzando un timestamp di inattività esatta. Per istruzioni su come eseguire una lettura inattiva utilizzando un timestamp di inattività limitata, vedi la nota dopo il codice campione. Vedi i limiti di timestamp per e ulteriori informazioni sui diversi tipi di limiti disponibili.
GoogleSQL
C++
Utilizza ExecuteQuery()
con MakeReadOnlyTransaction()
e
Transaction::ReadOnlyOptions()
per eseguire una lettura inattiva.
C#
Usa il metodo BeginReadOnlyTransactionAsync
su connection
con un
il valore TimestampBound.OfExactStaleness()
specificato per eseguire query sul database.
Vai
Usa Client.ReadOnlyTransaction().WithTimestampBound()
e specifica
ExactStaleness
per eseguire una lettura di righe dal database utilizzando un
limite al timestamp di inattività esatta.
L'esempio utilizza AllKeys
per definire una raccolta di chiavi o intervalli di chiavi per
lette.
Java
Usa il metodo read
di un ReadContext
che ha un valore specifico
TimestampBound.ofExactStaleness()
per eseguire una lettura di righe
con un timestamp di inattività esatta.
L'esempio utilizza KeySet
per definire una raccolta di chiavi o intervalli di chiavi per
lette.
Node.js
Utilizza Table.read
con l'opzione exactStaleness
per eseguire una lettura di righe
dal database utilizzando un vincolo di timestamp di inattività esatta.
L'esempio utilizza keySet
per definire una raccolta di chiavi o intervalli di chiavi per
lette.
PHP
Usa Database::read
con un valore exactStaleness
specificato per eseguire un
lettura di righe dal database utilizzando un timestamp di inattività esatta.
L'esempio utilizza keySet
per definire una raccolta di chiavi o intervalli di chiavi per
lette.
Python
Utilizza il metodo read
di un Database
snapshot
che ha un valore specifico
exact_staleness
per eseguire una lettura di righe dal database utilizzando un
limite al timestamp di inattività esatta.
L'esempio utilizza KeySet
per definire una raccolta di chiavi o intervalli di chiavi per
lette.
Ruby
Utilizza il metodo read
di uno snapshot Client
che ha un valore specifico
staleness
(in secondi) per eseguire una lettura di righe dal database
utilizzando un vincolo di timestamp di inattività esatta.
Esegui una lettura utilizzando un indice
Di seguito viene illustrato come leggere zero o più righe da un database utilizzando un indice:
GoogleSQL
C++
Utilizza la funzione Read()
per eseguire una lettura utilizzando un indice.
C#
Leggi i dati utilizzando l'indice eseguendo una query che specifica in modo esplicito indice:
Vai
Utilizza Client.Single().ReadUsingIndex
per leggere le righe del database utilizzando un
indice.
Java
Utilizza ReadContext.readUsingIndex
per leggere le righe del database utilizzando un
indice.
Node.js
Utilizza Table.read
e specifica l'indice nella query per leggere le righe
un database utilizzando un indice.
PHP
Utilizza Database::read
e specifica l'indice per leggere le righe dal database
utilizzando un indice.
Python
Utilizza Database.read
e specifica l'indice per leggere le righe dal database
utilizzando un indice.
Ruby
Utilizza Client#read
e specifica l'indice per leggere le righe dal database utilizzando
un indice.
Lettura di dati in parallelo
Quando si eseguono operazioni di lettura o query in blocco che coinvolgono quantità molto
di Spanner, puoi utilizzare la classe PartitionQuery
API per risultati più rapidi. L'API divide la query in batch, oppure
partizioni, utilizzando più macchine per recuperare le partizioni in parallelo. Essere
tieni presente che l'utilizzo dell'API PartitionQuery
causa una latenza più elevata,
è destinato esclusivamente a operazioni collettive, come l'esportazione o la scansione dell'intero
per configurare un database.
Puoi eseguire qualsiasi operazione di lettura dell'API in parallelo utilizzando Spanner librerie client. Tuttavia, puoi eseguire il partizionamento delle query SQL solo quando le query partizionabile in base alla radice. Affinché una query sia partizionabile dalla radice, il piano di query deve soddisfare una delle seguenti condizioni:
Il primo operatore nel piano di esecuzione delle query è un unione distribuita e il piano di esecuzione della query contiene solo un unione distribuita (escluse le unioni di distribuzione locali). Il piano di query non può contenere altri di operatori distribuiti, come applicazione incrociata distribuita.
Non esistono operatori distribuiti nel piano di query.
L'API PartitionQuery
esegue le query in modalità batch. Spanner
potresti scegliere un piano di esecuzione delle query che renda le query partizionabili alla radice
in modalità batch. Di conseguenza, l'API PartitionQuery
e
Spanner Studio potrebbe utilizzare piani di esecuzione delle query diversi
per la stessa query. Potresti non riuscire a ottenere il piano di esecuzione della query
utilizzata dall'API PartitionQuery
su Spanner Studio.
Per query partizionate come questa, puoi scegliere di abilitare Spanner Data Boost. Data Boost consente di eseguire query analitiche di grandi dimensioni con un impatto quasi zero sui carichi di lavoro esistenti Spanner. C++, Go, Java, Node.js e Python esempi di codice in questa pagina mostrano come abilitare Data Boost.
Per ulteriori informazioni su Data Boost, vedi Panoramica di Data Boost.
GoogleSQL
C++
Questo esempio recupera le partizioni di una query SQL della tabella Singers
e
esegue la query su ogni partizione seguendo questa procedura:
- Creazione di una transazione batch di Spanner.
- Generare partizioni per la query, in modo che possano essere distribuiti a più worker.
- Recupero dei risultati della query per ogni partizione.
C#
Questo esempio recupera le partizioni di una query SQL della tabella Singers
e
esegue la query su ogni partizione seguendo questa procedura:
- Creazione di una transazione batch di Spanner.
- Generare partizioni per la query, in modo che possano essere distribuiti a più worker.
- Recupero dei risultati della query per ogni partizione.
Vai
Questo esempio recupera le partizioni di una query SQL della tabella Singers
e
esegue la query su ogni partizione seguendo questa procedura:
- Creazione di un client Spanner e di una transazione.
- Generare partizioni per la query, in modo che possano essere distribuiti a più worker.
- Recupero dei risultati della query per ogni partizione.
Java
Questo esempio recupera le partizioni di una query SQL della tabella Singers
e
esegue la query su ogni partizione seguendo questa procedura:
- Creazione di un client batch di Spanner e di una transazione.
- Generare partizioni per la query, in modo che possano essere distribuiti a più worker.
- Recupero dei risultati della query per ogni partizione.
Node.js
Questo esempio recupera le partizioni di una query SQL della tabella Singers
e
esegue la query su ogni partizione seguendo questa procedura:
- Creazione di un client Spanner e di un batch.
- Generare partizioni per la query, in modo che possano essere distribuiti a più worker.
- Recupero dei risultati della query per ogni partizione.
PHP
Questo esempio recupera le partizioni di una query SQL della tabella Singers
e
esegue la query su ogni partizione seguendo questa procedura:
- Creazione di un client Spanner e di un batch.
- Generare partizioni per la query, in modo che possano essere distribuiti a più worker.
- Recupero dei risultati della query per ogni partizione.
Python
Questo esempio recupera le partizioni di una query SQL della tabella Singers
e
esegue la query su ogni partizione seguendo questa procedura:
- Creazione di un client Spanner e di una transazione batch.
- Generare partizioni per la query, in modo che possano essere distribuiti a più worker.
- Recupero dei risultati della query per ogni partizione.
Ruby
Questo esempio recupera le partizioni di una query SQL della tabella Singers
e
esegue la query su ogni partizione seguendo questa procedura:
- Creazione di un client batch di Spanner.
- Creare partizioni per la query, in modo che possano distribuiti a più worker.
- Recupero dei risultati della query per ogni partizione.