Consultas globais

As consultas globais permitem executar consultas SQL que referenciam dados armazenados em mais de uma região. Por exemplo, é possível executar uma consulta global que mescla uma tabela localizada em us-central1 com uma tabela localizada em europe-central2. Este documento explica como ativar e executar consultas globais no seu projeto.

Antes de começar

Verifique se as consultas globais estão ativadas para seu projeto e se você tem as permissões necessárias para executá-las.

Ativar consultas globais

Para ativar consultas globais no seu projeto ou organização, use a ALTER PROJECT SET OPTIONS instrução ou ALTER ORGANIZATION SET OPTIONS instrução para mudar a configuração padrão.

  • Para executar consultas globais em uma região, defina o argumento enable_global_queries_execution como true nessa região para o projeto que executa a consulta.
  • Para permitir que consultas globais copiem dados de uma região, defina o argumento enable_global_queries_data_access como true nessa região para o projeto que contém os dados.
  • Sempre que a consulta acessar tabelas remotas, essas opções serão verificadas.
  • As consultas globais podem ser executadas em um projeto e extrair dados de outras regiões de outro projeto.

Exemplo: configuração entre projetos

O exemplo a seguir mostra como executar uma consulta em um projeto que acessa uma tabela em outro projeto.

Suponha que você tenha um projeto query_project executando jobs na região us-central1 e queira executar uma consulta que acesse uma tabela data_project.dataset.my_table localizada na região europe-west1:

SET @@location='us-central1';
SELECT
  *
FROM
  `query_project.dataset.my_table`
  JOIN `data_project.dataset.my_other_table` USING id;

Para que essa consulta global seja executada com sucesso, a seguinte configuração é necessária:

  1. É necessário ativar a execução de consultas globais no projeto (query_project) na região que executa uma consulta global (us-central1):

    ALTER PROJECT `query_project`
    SET OPTIONS (
    `region-us-central1.enable_global_queries_execution` = TRUE
    );
  2. É necessário ativar a cópia de dados por consultas globais do projeto que contém os dados (data_project) para a região (europe-west1):

    ALTER PROJECT `data_project`
    SET OPTIONS (
    `region-europe-west1.enable_global_queries_data_access` = TRUE
    );

Para criar e usar visualizações que contêm tabelas remotas, os mesmos princípios se aplicam: o projeto que executa as consultas precisa ter enable_global_queries_execution ativado.

Essas operações ALTER PROJECT precisam ser executadas separadamente, porque se referem a projetos e regiões diferentes. Pode levar vários minutos para que a mudança entre em vigor.

Permissão necessária

Para executar uma consulta global, você precisa ter a permissão bigquery.jobs.createGlobalQuery. O papel de administrador do BigQuery é o único papel predefinido que contém essa permissão. Para conceder permissão para executar consultas globais sem conceder o papel de administrador do BigQuery, siga estas etapas:

  1. Crie uma função personalizada, por exemplo, "Executor de consultas globais do BigQuery".
  2. Adicione bigquery.jobs.createGlobalQuery a esse papel.
  3. Atribua esse papel a usuários ou contas de serviço selecionados.

Consultar dados

Para executar uma consulta global, escreva uma consulta SQL como se os dados estivessem em um único local. Se os dados referenciados pela consulta estiverem armazenados em mais de um local, o BigQuery tentará executar uma consulta global. Em alguns casos, o BigQuery seleciona automaticamente o local da consulta. Caso contrário, é necessário especificar o local em que a consulta será executada. Os dados referenciados pela consulta que não estão no local selecionado são copiados para esse local.

O exemplo a seguir é executado como uma consulta global que une tabelas de dois conjuntos de dados diferentes armazenados em dois locais diferentes:

SELECT id, tr_date, product_id, price FROM us_dataset.transactions
UNION ALL
SELECT id, tr_date, product_id, price FROM europe_dataset.transactions

Seleção automática de local

Nos casos a seguir, o local em que uma consulta precisa ser executada é determinado automaticamente e não pode ser alterado:

  • As consultas de linguagem de modificação de dados (instruções INSERT, UPDATE, DELETE) são sempre executadas em um local da tabela de destino.
  • As consultas de linguagem de definição de dados, como a instrução CREATE TABLE AS SELECT, são sempre executadas no local em que um recurso é criado ou modificado.
  • As consultas com uma tabela de destino especificada são sempre executadas no local em que a tabela de destino está.

Escolha um local

Em geral, você decide onde as consultas globais são executadas. Para tomar essa decisão, considere o seguinte:

  • As consultas globais copiam temporariamente dados de um local para outro. Se a organização tiver requisitos de residência de dados e você não quiser que os dados do local A saiam do local A, defina o local da consulta como A.

  • Para minimizar a quantidade de dados transferidos entre locais e reduzir o custo da consulta, execute a consulta na região em que a maioria dos dados consultados está armazenada.

Imagine que você tem uma loja on-line e mantém uma lista de produtos no local us-central1, mas as transações na us-south1 região. Se houver mais transações do que produtos no catálogo, execute a consulta na região us-south1.

Entender consultas globais

Para executar consultas globais de maneira eficiente e econômica, é importante entender o mecanismo por trás da execução delas.

Para usar dados que residem em locais diferentes, eles precisam ser replicados para um local. A seguir, apresentamos uma abstração do fluxo de trabalho de consulta global realizado pelo BigQuery:

  1. Determine onde a consulta precisa ser executada, seja pela declaração do usuário ou automaticamente. Esse local é chamado de primário e todos os outros locais referenciados pela consulta são remotos.
  2. Execute uma subconsulta em cada região remota para coletar os dados necessários para concluir a consulta na região primária.
  3. Copie esses dados de locais remotos para o local principal.
  4. Salve os dados em tabelas temporárias no local principal por 8 horas.
  5. Execute uma consulta final com todos os dados coletados no local principal.
  6. Retorne os resultados da consulta.

O BigQuery tenta minimizar a quantidade de dados transferidos entre regiões. Veja o exemplo a seguir.

SET @@location = 'EU';
SELECT
  t1.col1, t2.col2
FROM
  eu_dataset.table1 t1
  JOIN us_dataset.table2 t2 using col3
WHERE
  t2.col4 = 'ABC'

O BigQuery não precisa replicar toda a tabela t2 dos EUA para a UE. É suficiente transferir apenas as colunas solicitadas (col2 e col3) e apenas as linhas que correspondem à condição WHERE (t2.col4 = 'ABC'). No entanto, esses mecanismos, conhecidos como pushdowns, dependem da estrutura da consulta e, às vezes, a quantidade de dados transferidos pode ser grande. Recomendamos que você teste consultas globais em um pequeno subconjunto de dados e confirme se os dados só são transferidos quando necessário.

Observabilidade

Para conferir o texto da consulta enviado à região remota, consulte o histórico de jobs. O job remoto tem o mesmo ID de job da consulta original com um sufixo _xregion adicional.

Desativar consultas globais

Para desativar consultas globais no seu projeto ou organização, use a ALTER PROJECT SET OPTIONS statement ou ALTER ORGANIZATION SET OPTIONS statement para mudar a configuração padrão.

  • Para desativar consultas globais em uma região, defina o argumento enable_global_queries_execution como false ou NULL nessa região.
  • Para impedir que consultas globais copiem dados de uma região, defina o argumento enable_global_queries_data_access como false ou NULL nessa região.

O exemplo a seguir mostra como desativar consultas globais no nível do projeto:

ALTER PROJECT PROJECT_ID
SET OPTIONS (
  `region-REGION.enable_global_queries_execution` = false,
  `region-REGION.enable_global_queries_data_access` = false
);

Substitua:

  • PROJECT_ID: o nome do projeto a ser alterado
  • REGION: o nome da região em que as consultas globais serão desativadas

Pode levar vários minutos para que a mudança entre em vigor.

Preços

O custo de uma consulta global consiste nos seguintes componentes:

Cotas

Para informações sobre cotas relacionadas a consultas globais, consulte Jobs de consulta.

Limitações

  • Os detalhes de execução e o gráfico de execução de uma consulta não mostram o número de bytes processados e transferidos de locais remotos. Essas informações aparecem em jobs de cópia que podem ser encontrados no histórico de jobs. O ID do job de um job de cópia criado por uma consulta global tem o ID do job de consulta como prefixo.
  • As consultas globais não são compatíveis com o modo sandbox.
  • As consultas globais têm uma latência maior do que as consultas de região única devido ao tempo necessário para transferir dados entre regiões.
  • As consultas globais não usam nenhum cache para evitar a transferência de dados entre regiões.
  • Não é possível consultar pseudocolunas, como _PARTITIONTIME, com consultas globais.
  • Não é possível consultar colunas do tipo RANGE com consultas globais.
  • Não é possível consultar colunas usando nomes de colunas flexíveis com consultas globais.
  • Não é possível consultar INFORMATION_SCHEMA visualizações de uma região remota em uma consulta global.
  • As visualizações autorizadas globais e as rotinas autorizadas não são compatíveis (quando uma visualização ou rotina em um local está autorizada a acessar o conjunto de dados em outro local).
  • As visualizações materializadas em consultas globais estão indisponíveis.
  • Se a consulta global fizer referência a colunas STRUCT, nenhum pushdown será aplicado a subconsultas remotas. Para otimizar o desempenho, considere criar uma visualização na região remota que filtre colunas STRUCT e retorne apenas os campos necessários como colunas individuais.
  • As consultas globais não são executadas de forma atômica. Nos casos em que a replicação de dados é bem-sucedida, mas a consulta geral falha, você ainda recebe cobranças pela replicação de dados.
  • As tabelas temporárias criadas em regiões remotas como parte da execução de consultas globais só são criptografadas usando chaves de criptografia gerenciadas pelo cliente (CMEK) se uma chave CMEK configurada para criptografar os resultados da consulta global (em uma tabela, conjunto de dados ou nível de projeto) for global. Para garantir que as tabelas temporárias remotas estejam sempre protegidas usando CMEK, defina uma chave KMS padrão para o projeto que executa consultas globais na região remota.
  • As consultas globais não são compatíveis com o Assured Workloads.
  • Uma única consulta global pode acessar até 10 tabelas remotas por região.