Consultas federadas do Spanner

Como analista de dados, é possível consultar dados no Spanner pelo BigQuery usando consultas federadas.

A federação BigQuery Spanner permite que o BigQuery consulte dados que residem no Spanner em tempo real, sem copiar ou mover dados.

Antes de começar

  • Verifique se o administrador do BigQuery criou uma conexão do Spanner e a compartilhou com você. Consulte Escolher a conexão certa.
  • Para receber as permissões necessárias para consultar uma instância do Spanner, peça ao administrador para conceder a você o papel de Identity and Access Management (IAM) do usuário de conexão do BigQuery (roles/bigquery.connectionUser). Também é necessário pedir ao administrador que conceda uma das seguintes opções:
    • Se você for um usuário de controle de acesso minucioso, precisará de acesso a um papel de banco de dados que tenha o privilégio SELECT em todos os objetos de esquema do Spanner nas suas consultas.
    • Se você não for um usuário detalhado de controle de acesso, precisará do papel de Leitor de banco de dados do Cloud Spanner (roles/spanner.databaseReader).

    Para saber mais sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações. Consulte informações em Sobre controle de acesso detalhado.

Escolher a conexão certa

Se você é um usuário de controle de acesso minucioso do Spanner, ao executar uma consulta federada, é necessário usar uma conexão do Spanner que especifique um papel de banco de dados. Todas as consultas executadas com essa conexão usam esse papel de banco de dados.

Se você usar uma conexão que não especifica um papel de banco de dados, os papéis do IAM precisam estar indicados em Antes de começar.

Data Boost do Spanner

O Data Boost é um recurso sem servidor totalmente gerenciado que fornece recursos de computação independentes para as cargas de trabalho do Spanner compatíveis. O Data Boost permite executar consultas de análise e exportações de dados com impacto quase zero nas cargas de trabalho atuais na instância provisionada do Spanner. O Data Boost permite que você execute consultas federadas com capacidade de computação independente, separada das instâncias provisionadas para evitar afetar as cargas de trabalho atuais no Spanner. O Data Boost tem mais impacto quando você executa consultas ad-hoc complexas ou quando quer processar grandes quantidades de dados sem afetar a carga de trabalho do Spanner. A execução de consultas federadas com o Data Boost pode levar a um consumo de CPU significativamente menor e, em alguns casos, menor latência da consulta.

Antes de começar

Para receber a permissão necessária para ativar o acesso ao Data Boost, peça ao administrador para conceder a você o papel do IAM de Administrador do banco de dados do Cloud Spanner (roles/spanner.databaseAdmin) no banco de dados do Spanner. Para mais informações sobre como conceder papéis, consulte Gerenciar acesso.

Esse papel predefinido contém a permissão spanner.databases.useDataBoost, que é necessária para ativar o acesso ao Data Boost.

Também é possível conseguir essa permissão com papéis personalizados ou outros papéis predefinidos.

Ativar o Data Boost

Para ativar o Data Boost nas suas consultas federadas com o Spanner, primeiro faça uma conexão com o Spanner. Depois de ativar o Data Boost na conexão, consulte os dados para enviar uma consulta federada para o Spanner.

Consultar dados

Para enviar uma consulta federada ao Spanner por uma consulta do GoogleSQL, use a função EXTERNAL_QUERY.

Formule a consulta do Spanner no GoogleSQL ou no PostgreSQL, dependendo do dialeto especificado do banco de dados.

O exemplo a seguir faz uma consulta federada a um banco de dados do Spanner chamado orders e mescla os resultados com uma tabela do BigQuery denominada mydataset.customers

SELECT c.customer_id, c.name, rq.first_order_date
FROM mydataset.customers AS c
LEFT OUTER JOIN EXTERNAL_QUERY(
  'my-project.us.example-db',
  '''SELECT customer_id, MIN(order_date) AS first_order_date
  FROM orders
  GROUP BY customer_id''') AS rq
  ON rq.customer_id = c.customer_id
GROUP BY c.customer_id, c.name, rq.first_order_date;

Ler dados em paralelo

O Spanner pode dividir algumas consultas em partes menores, ou partições, e buscar as partições em paralelo. Para mais informações, consulte Ler dados em paralelo na documentação do Spanner.

Para ativar leituras paralelas em consultas federadas, defina essa configuração ao criar o recurso de conexão. Essa opção divide a consulta SQL em partições menores e busca cada partição em paralelo. No entanto, essa opção está restrita a consultas que atendem a uma das seguintes condições:

Outras consultas retornam um erro. Para ver o plano de execução de uma consulta do Spanner, consulte Noções básicas sobre como o Cloud Spanner executa consultas.

Gerenciar a prioridade de execução da consulta

Para atribuir prioridade (high, medium ou low) a consultas individuais, especifique a opção query_execution_priority, conforme mostrado abaixo:

SELECT *
FROM EXTERNAL_QUERY(
  'my-project.us.example-db',
  '''SELECT customer_id, MIN(order_date) AS first_order_date
  FROM orders
  GROUP BY customer_id''',
  '{"query_execution_priority":"high"}');

A prioridade padrão é medium.

As consultas com prioridade high competirão com o tráfego transacional. As consultas com prioridade low são mais eficientes e podem ser interrompidas por carga em segundo plano, como backups programados.

Ver um esquema de tabela do Spanner

É possível usar a função EXTERNAL_QUERY para consultar visualizações information_schema para acessar metadados de banco de dados, como listar todas as tabelas no banco de dados ou mostrar um esquema de tabela. O exemplo a seguir retorna informações sobre as colunas na tabela MyTable:

Banco de dados do Google SQL

SELECT *
FROM EXTERNAL_QUERY(
  'my-project.us.example-db',
  '''SELECT t.column_name, t.spanner_type, t.is_nullable
    FROM information_schema.columns AS t
    WHERE
      t.table_catalog = ''
      AND t.table_schema = ''
     AND t.table_name = 'MyTable'
    ORDER BY t.ordinal_position
  ''');

Banco de dados PostgreSQL

SELECT * from EXTERNAL_QUERY(
 'my-project.us.postgresql.example-db',
  '''SELECT t.column_name, t.data_type, t.is_nullable
    FROM information_schema.columns AS t
    WHERE
      t.table_schema = 'public' and t.table_name='MyTable'
    ORDER BY t.ordinal_position
  ''');

Para mais informações, consulte as seguintes referências de esquema na documentação do Spanner:

Solução de problemas

Esta seção resolve problemas que podem ocorrer durante o envio de uma consulta federada ao Spanner.

Problema: a consulta não é particionável pela raiz.
Resolução: se você configurar a conexão para ler dados em paralelo, o primeiro operador no plano de execução da consulta precisará ser uma união distribuída ou seu plano de execução precisará não têm uniões distribuídas. Para resolver esse erro, veja o plano de execução da consulta e reescreva a consulta. Para mais informações, consulte Noções básicas sobre como o Cloud Spanner executa consultas.
Problema: prazo excedido.
Solução: selecione a opção para ler dados em paralelo e reescrever a consulta para ser particionada por raiz. Para mais informações, consulte Noções básicas sobre como o Cloud Spanner executa consultas.

A seguir