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 maggiori 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, consulta la sezione sulle transazioni di sola lettura.
Tipi di lettura
Spanner ti consente di determinare quanto aggiornati devono essere i dati quando li leggi offrendo due tipi di letture:
- Una lettura affidabile è una lettura con un timestamp corrente e garantisce di vedere tutti i dati di cui è stato eseguito il commit fino all'inizio di questa lettura. Per impostazione predefinita, Spanner utilizza letture sicure per soddisfare le richieste di lettura.
- Una lettura inattiva viene letta in un timestamp nel passato. Se la tua applicazione è sensibile alla latenza, ma tollera i dati non aggiornati, le letture non aggiornate possono offrire vantaggi 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 sicure, se possibile. Si tratta del limite di timestamp predefinito per le letture di Spanner, incluse le transazioni di sola lettura. Le letture sicure garantiscono di osservare gli effetti di tutte le transazioni committate prima dell'inizio dell'operazione, indipendentemente dalla replica che riceve la lettura. Per questo motivo, letture efficaci rendono più semplice il codice dell'applicazione le applicazioni più affidabili. Scopri di più sulle proprietà di coerenza di Spanner in TrueTime e coerenza esterna.
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.
- Eseguire una lettura sicura da una singola riga o da più righe in una tabella.
- Esecuzione di una lettura non aggiornata da una singola riga o da più righe in 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 la sezione 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#
Utilizza 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
Utilizza Database.run
per eseguire query sul database.
PHP
Usa Database::execute
per eseguire query sul database.
Python
Utilizza Database.execute_sql
per eseguire query sul database.
Ruby
Utilizza 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.
Eseguire 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 è lo stesso dell'esempio precedente per eseguire query su 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 dal database.
L'esempio utilizza keySet
per definire una raccolta di chiavi o intervalli di chiavi da leggere.
PHP
Utilizza Database::read
per leggere le righe del database.
L'esempio utilizza keySet
per definire una raccolta di chiavi o intervalli di chiavi da leggere.
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.
Eseguire una lettura obsoleta
Il seguente codice di esempio mostra come eseguire una lettura obsoleta di zero o più righe da un database utilizzando un limite di timestamp esatto. Per istruzioni su come eseguire una lettura non aggiornata utilizzando un limite di timestamp con tempo di aggiornamento limitato, consulta la nota dopo il codice di esempio. 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 non aggiornata.
C#
Utilizza il metodo BeginReadOnlyTransactionAsync
su un connection
con un 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 da leggere.
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 delle righe
dal database utilizzando un limite di timestamp di inattualità esatto.
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 da leggere.
Python
Utilizza il metodo read
di un Database
snapshot
con un valore exact_staleness
specificato per eseguire una lettura delle righe dal database utilizzando un vincolo di timestamp di accuratezza dell'obsolescenza.
L'esempio utilizza KeySet
per definire una raccolta di chiavi o intervalli di chiavi da leggere.
Ruby
Utilizza il metodo read
di uno snapshot Client
con un valore staleness
specificato (in secondi) per eseguire una lettura delle righe dal database utilizzando un limite di timestamp di accuratezza della data.
Eseguire una lettura utilizzando un indice
Di seguito viene mostrato 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 esplicitamente l'indice:
Vai
Utilizza Client.Single().ReadUsingIndex
per leggere le righe dal database utilizzando un indice.
Java
Utilizza ReadContext.readUsingIndex
per leggere le righe dal database utilizzando un indice.
Node.js
Utilizza Table.read
e specifica l'indice nella query per leggere le righe dal 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 suddivide la query in batch o
partizioni utilizzando più macchine per recuperare le partizioni in parallelo. Tieni conto che l'utilizzo dell'API PartitionQuery
comporta una maggiore latenza perché è pensata solo per operazioni collettive come l'esportazione o la scansione dell'intero 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 della query è un'unione distribuita e il piano di esecuzione della query contiene una sola unione distribuita (esclusi gli operatori Local Distribution Union). 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 potrebbe scegliere un piano di esecuzione delle query che renda le query partizionabili in base alla radice quando vengono eseguite in modalità batch. Di conseguenza, l'API PartitionQuery
e
Spanner Studio potrebbero 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 attivare Spanner Data Boost. Data Boost ti consente di eseguire query analitiche di grandi dimensioni con un impatto quasi nullo sui carichi di lavoro esistenti nell'istanza Spanner di cui è stato eseguito il provisioning. C++, Go, Java, Node.js e Python esempi di codice in questa pagina mostrano come abilitare Data Boost.
Per ulteriori informazioni su Data Boost, consulta 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
ed
esegue la query su ogni partizione tramite i seguenti passaggi:
- Creazione di un client Spanner e di una transazione.
- Generazione di partizioni per la query, in modo che possano essere distribuite su più worker.
- Recupero dei risultati della query per ogni partizione.
Java
Questo esempio recupera le partizioni di una query SQL della tabella Singers
ed
esegue la query su ogni partizione tramite i seguenti passaggi:
- Creazione di un client batch 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
ed
esegue la query su ogni partizione tramite i seguenti passaggi:
- 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
ed
esegue la query su ogni partizione tramite i seguenti passaggi:
- Creazione di un client batch di Spanner.
- Creazione di partizioni per la query, in modo che possano essere distribuite su più worker.
- Recupero dei risultati della query per ogni partizione.