Esta página descreve como executar leituras no Spanner fora do contexto de transações de leitura e leitura/escrita. Se alguma das seguintes situações se aplicar, deve ler a página Transações:
Se precisar de escrever, consoante o valor de uma ou mais leituras, deve executar a leitura como parte de uma transação de leitura/escrita. Para mais informações, consulte transações de leitura/escrita.
Se estiver a fazer várias chamadas de leitura que exijam uma vista consistente dos seus dados, deve executar as leituras como parte de uma transação de leitura exclusiva. Para mais informações, consulte o artigo sobre as transações só de leitura.
Tipos de leitura
O Spanner permite-lhe determinar a atualidade dos dados quando lê dados, oferecendo dois tipos de leituras:
- Uma leitura forte é uma leitura numa data/hora atual e tem a garantia de ver todos os dados que foram confirmados até ao início desta leitura. O Spanner usa por predefinição leituras fortes para publicar pedidos de leitura.
- Uma leitura desatualizada é lida numa data/hora no passado. Se a sua aplicação for sensível à latência, mas tolerante a dados desatualizados, as leituras desatualizadas podem oferecer vantagens de desempenho.
Para escolher o tipo de leitura que quer, defina um limite de data/hora no pedido de leitura. Use as seguintes práticas recomendadas quando escolher um limite de tempo:
Escolha leituras fortes sempre que possível. Esta é a data/hora predefinida para leituras do Spanner, incluindo transações só de leitura. As leituras fortes têm a garantia de observar os efeitos de todas as transações que foram confirmadas antes do início da operação, independentemente da réplica que recebe a leitura. Por este motivo, as leituras fortes simplificam o código da aplicação e tornam as aplicações mais fiáveis. Leia mais sobre as propriedades de consistência do Spanner em TrueTime e consistência externa.
Se a latência tornar as leituras fortes inviáveis em algumas situações, use leituras desatualizadas (desatualização limitada ou desatualização exata) para melhorar o desempenho em locais onde não precisa que as leituras sejam o mais recentes possível. Conforme descrito na página Replicação, 15 segundos é um valor de desatualização razoável para usar para um bom desempenho.
Ler dados com uma função de base de dados
Se for um utilizador do controlo de acesso detalhado, tem de selecionar uma função de base de dados para executar declarações e consultas SQL, e para realizar operações de linhas numa base de dados. A seleção da função persiste durante toda a sessão até alterar a função.
Para ver instruções sobre como executar uma leitura com uma função de base de dados, consulte o artigo Aceda a uma base de dados com controlo de acesso detalhado.
Métodos de leitura única
O Spanner suporta métodos de leitura única (ou seja, uma leitura fora do contexto de uma transação) numa base de dados para:
- Executar a leitura como uma declaração de consulta SQL ou usar a API read do Spanner.
- Executar uma leitura forte a partir de uma única linha ou de várias linhas numa tabela.
- Executar uma leitura desatualizada de uma única linha ou várias linhas numa tabela.
- Leitura de uma única linha ou várias linhas num índice secundário.
Se quiser encaminhar leituras únicas para uma réplica ou uma região específica numa configuração de instância multirregional ou numa configuração regional personalizada com regiões só de leitura opcionais, consulte Leituras direcionadas.
As secções seguintes descrevem como usar métodos de leitura com as bibliotecas cliente do Spanner.
Execute uma consulta
O exemplo seguinte mostra como executar uma declaração de consulta SQL numa base de dados.
GoogleSQL
C++
Use ExecuteQuery()
para executar uma declaração de consulta SQL numa base de dados.
C#
Use ExecuteReaderAsync()
para consultar a base de dados.
Go
Use Client.Single().Query
para consultar a base de dados.
Java
Use ReadContext.executeQuery
para consultar a base de dados.
Node.js
Use Database.run
para consultar a base de dados.
PHP
Use Database::execute
para consultar a base de dados.
Python
Use Database.execute_sql
para consultar a base de dados.
Ruby
Use Client#execute
para consultar a base de dados.
Consulte as referências de sintaxe de consulta SQL e funções e operadores quando criar uma declaração SQL.
Faça uma leitura forte
O exemplo seguinte mostra como fazer uma leitura forte de zero ou mais linhas de uma base de dados.
GoogleSQL
C++
O código para ler dados é o mesmo que o exemplo anterior para consultar o Spanner executando uma consulta SQL.
C#
O código para ler dados é o mesmo que o exemplo anterior para consultar o Spanner executando uma consulta SQL.
Go
Use Client.Single().Read
para ler linhas da base de dados.
O exemplo usa AllKeys
para definir uma coleção de chaves ou intervalos de chaves para leitura.
Java
Use ReadContext.read
para ler linhas da base de dados.
O exemplo usa KeySet
para definir uma coleção de chaves ou intervalos de chaves para leitura.
Node.js
Use Table.read
para ler linhas da base de dados.
O exemplo usa keySet
para definir uma coleção de chaves ou intervalos de chaves para leitura.
PHP
Use Database::read
para ler linhas da base de dados.
O exemplo usa keySet
para definir uma coleção de chaves ou intervalos de chaves para leitura.
Python
Use Database.read
para ler linhas da base de dados.
O exemplo usa KeySet
para definir uma coleção de chaves ou intervalos de chaves para leitura.
Ruby
Use Client#read
para ler linhas da base de dados.
Faça uma leitura desatualizada
O seguinte exemplo de código mostra como executar uma leitura desatualizada de zero ou mais linhas de uma base de dados usando um limite de tempo exact-staleness. Para ver instruções sobre como executar uma leitura desatualizada usando um limite de tempo bounded-staleness, consulte a nota após o código de exemplo. Consulte Limites de indicações de tempo para ver mais informações sobre os diferentes tipos de limites de indicações de tempo disponíveis.
GoogleSQL
C++
Use ExecuteQuery()
com MakeReadOnlyTransaction()
e
Transaction::ReadOnlyOptions()
para fazer uma leitura desatualizada.
C#
Use o método BeginReadOnlyTransactionAsync
num connection
com um valor TimestampBound.OfExactStaleness()
especificado para consultar a base de dados.
Go
Use Client.ReadOnlyTransaction().WithTimestampBound()
e especifique um valor ExactStaleness
para fazer uma leitura de linhas da base de dados usando um limite de tempo de desatualização exato.
O exemplo usa AllKeys
para definir uma coleção de chaves ou intervalos de chaves para leitura.
Java
Use o método read
de um ReadContext
que tenha um TimestampBound.ofExactStaleness()
especificado para fazer uma leitura de linhas da base de dados usando um limite de tempo de atualização exato.
O exemplo usa KeySet
para definir uma coleção de chaves ou intervalos de chaves para leitura.
Node.js
Use Table.read
com a opção exactStaleness
para executar uma leitura de linhas da base de dados usando um limite de data/hora de desatualização exato.
O exemplo usa keySet
para definir uma coleção de chaves ou intervalos de chaves para leitura.
PHP
Use Database::read
com um valor exactStaleness
especificado para fazer uma leitura de linhas da base de dados usando um limite de data/hora de desatualização exato.
O exemplo usa keySet
para definir uma coleção de chaves ou intervalos de chaves para leitura.
Python
Use o método read
de um Database
snapshot
que tenha um valor exact_staleness
especificado para executar uma leitura de linhas da base de dados usando um limite de tempo de desatualização exato.
O exemplo usa KeySet
para definir uma coleção de chaves ou intervalos de chaves para leitura.
Ruby
Use o método read
de uma captura instantânea Client
que tenha um valor staleness
especificado (em segundos) para executar uma leitura de linhas da base de dados usando um limite de data/hora de desatualização exato.
Execute uma leitura através de um índice
O exemplo seguinte mostra como ler zero ou mais linhas de uma base de dados usando um índice:
GoogleSQL
C++
Use a função Read()
para fazer uma leitura com um índice.
C#
Leia dados através do índice executando uma consulta que especifica explicitamente o índice:
Go
Use Client.Single().ReadUsingIndex
para ler linhas da base de dados usando um índice.
Java
Use ReadContext.readUsingIndex
para ler linhas da base de dados usando um índice.
Node.js
Use Table.read
e especifique o índice na consulta para ler linhas da base de dados usando um índice.
PHP
Use Database::read
e especifique o índice para ler linhas da base de dados
usando um índice.
Python
Use Database.read
e especifique o índice para ler linhas da base de dados
usando um índice.
Ruby
Use Client#read
e especifique o índice para ler linhas da base de dados através de um índice.
Ler dados em paralelo
Quando efetua operações de leitura ou consulta em massa que envolvem quantidades muito grandes de dados do Spanner, pode usar a API PartitionQuery
para obter resultados mais rápidos. A API divide a consulta em lotes ou partições, usando várias máquinas para obter as partições em paralelo. Tenha em atenção que a utilização da API PartitionQuery
causa uma latência mais elevada, uma vez que se destina apenas a operações em massa, como exportar ou analisar toda a base de dados.
Pode realizar qualquer operação de API de leitura em paralelo através das bibliotecas de cliente do Spanner. No entanto, só pode particionar consultas SQL quando as consultas são particionáveis na raiz. Para que uma consulta seja divisível por partições raiz, o plano de consulta tem de cumprir uma das seguintes condições:
O primeiro operador no plano de execução da consulta é uma união distribuída e o plano de execução da consulta contém apenas uma união distribuída (excluindo uniões de distribuição local). O seu plano de consulta não pode conter outros operadores distribuídos, como distributed cross apply.
Não existem operadores distribuídos no plano de consulta.
A API PartitionQuery
executa as consultas no modo de lote. O Spanner pode escolher um plano de execução de consultas que torne as consultas particionáveis na raiz quando executadas no modo de lote. Por conseguinte, a API PartitionQuery
e o
Spanner Studio podem usar planos de execução de consultas diferentes
para a mesma consulta. Pode não conseguir obter o plano de execução da consulta usado pela API PartitionQuery
no Spanner Studio.
Para consultas particionadas como esta, pode optar por ativar o Spanner Data Boost. O Data Boost permite-lhe executar grandes consultas analíticas com um impacto quase nulo nos fluxos de trabalho existentes na instância do Spanner aprovisionada. Os exemplos de código em C++, Go, Java, Node.js e Python nesta página mostram como ativar o Data Boost.
Para mais informações sobre o aumento de dados, consulte o artigo Vista geral do aumento de dados.
GoogleSQL
C++
Este exemplo obtém partições de uma consulta SQL da tabela Singers
e
executa a consulta em cada partição através dos seguintes passos:
- Criar uma transação em lote do Spanner.
- Gerar partições para a consulta, para que as partições possam ser distribuídas a vários trabalhadores.
- Obter os resultados da consulta para cada partição.
C#
Este exemplo obtém partições de uma consulta SQL da tabela Singers
e
executa a consulta em cada partição através dos seguintes passos:
- Criar uma transação em lote do Spanner.
- Gerar partições para a consulta, para que as partições possam ser distribuídas a vários trabalhadores.
- Obter os resultados da consulta para cada partição.
Go
Este exemplo obtém partições de uma consulta SQL da tabela Singers
e
executa a consulta em cada partição através dos seguintes passos:
- Criar um cliente do Spanner e uma transação.
- Gerar partições para a consulta, para que as partições possam ser distribuídas a vários trabalhadores.
- Obter os resultados da consulta para cada partição.
Java
Este exemplo obtém partições de uma consulta SQL da tabela Singers
e
executa a consulta em cada partição através dos seguintes passos:
- Criar um cliente de lote do Spanner e uma transação.
- Gerar partições para a consulta, para que as partições possam ser distribuídas a vários trabalhadores.
- Obter os resultados da consulta para cada partição.
Node.js
Este exemplo obtém partições de uma consulta SQL da tabela Singers
e
executa a consulta em cada partição através dos seguintes passos:
- Criar um cliente do Spanner e um lote.
- Gerar partições para a consulta, para que as partições possam ser distribuídas a vários trabalhadores.
- Obter os resultados da consulta para cada partição.
PHP
Este exemplo obtém partições de uma consulta SQL da tabela Singers
e
executa a consulta em cada partição através dos seguintes passos:
- Criar um cliente do Spanner e um lote.
- Gerar partições para a consulta, para que as partições possam ser distribuídas a vários trabalhadores.
- Obter os resultados da consulta para cada partição.
Python
Este exemplo obtém partições de uma consulta SQL da tabela Singers
e
executa a consulta em cada partição através dos seguintes passos:
- Criar um cliente do Spanner e uma transação em lote.
- Gerar partições para a consulta, para que as partições possam ser distribuídas a vários trabalhadores.
- Obter os resultados da consulta para cada partição.
Ruby
Este exemplo obtém partições de uma consulta SQL da tabela Singers
e
executa a consulta em cada partição através dos seguintes passos:
- Criar um cliente de lote do Spanner.
- Criar partições para a consulta, para que as partições possam ser distribuídas a vários trabalhadores.
- Obter os resultados da consulta para cada partição.