Resolver problemas de consulta

Este documento tem como objetivo ajudar você a resolver problemas comuns relacionados a execução de consultas, como identificar os motivos das consultas lentas ou fornecer etapas de resolução para erros comuns retornados por consultas com falha.

Resolver problemas de consultas lentas

Ao resolver problemas de desempenho lento da consulta, considere as seguintes causas comuns:

  1. Confira a página Saúde do serviço do Google Cloud para ver interrupções conhecidas do serviço do BigQuery que podem afetar o desempenho da consulta.

  2. Revise a linha do tempo do job da sua consulta na página de detalhes do job para saber quanto tempo cada etapa da consulta levou para ser executada.

    • Se a maior parte do tempo decorrido foi devido a tempos de criação longos, entre em contato com o Cloud Customer Care para receber ajuda.

    • Se a maior parte do tempo decorrido foi devido a tempos de execução longos, analise os insights de desempenho da consulta. Os insights de performance da consulta podem informar se a consulta demorou mais do que o tempo de execução médio e sugerir possíveis causas. As possíveis causas podem incluir contenção de slot de consulta ou uma cota de embaralhamento insuficiente. Para mais informações sobre cada problema de desempenho da consulta e possíveis resoluções, consulte Interpretar insights de desempenho de consultas.

  3. Revise os bytes processados na página de detalhes do job de consulta para saber se eles são maiores do que o esperado. Para fazer isso, compare o número de bytes processados pela consulta atual com outro job de consulta concluído em um período aceitável. Se houver uma grande discrepância de bytes processados entre as duas consultas, talvez a consulta tenha sido lenta devido a um grande volume de dados. Para informações sobre como otimizar suas consultas para processar grandes volumes de dados, consulte Otimizar a computação de consultas.

    Também é possível identificar consultas no seu projeto que processam uma grande quantidade de dados pesquisando as consultas mais caras usando a visualização INFORMATION_SCHEMA.JOBS.

Se você ainda não conseguir explicar o motivo do desempenho de consulta mais lento do que o esperado, entre em contato com o Cloud Customer Care para receber ajuda.

Resolução de esquema Avro

String de erro: Cannot skip stream

Esse erro pode ocorrer ao carregar vários arquivos Avro com esquemas diferentes, resultando em um problema de resolução de esquema e fazendo com que o job de importação falhe em um arquivo aleatório.

Para resolver esse erro, verifique se o último arquivo alfabético do job de carregamento contém o superconjunto (união) dos esquemas diferentes. Esse é um requisito baseado em como o Avro processa a resolução de esquemas.

Consultas simultâneas em conflito

String de erro: Concurrent jobs in the same session are not allowed

Esse erro pode ocorrer quando várias consultas são executadas simultaneamente em uma sessão, o que não é permitido. Veja as limitações da sessão.

Instruções DML conflitantes

String de erro: Could not serialize access to table due to concurrent update

Esse erro pode ocorrer ao modificar instruções de linguagem de manipulação de dados (DML) em execução simultânea na mesma tabela em conflito, ou quando a tabela é truncada durante uma instrução DML mutável. Para mais informações, consulte Conflitos de instruções DML.

Para resolver esse erro, execute operações DML que afetam uma única tabela, de maneira que não se sobreponham.

Subconsultas correlacionadas

String de erro: Correlated subqueries that reference other tables are not supported unless they can be de-correlated

Esse erro pode ocorrer quando a consulta contém uma subconsulta que faz referência a uma coluna fora dessa subconsulta, chamada de coluna de correlação. A subconsulta correlacionada é avaliada usando uma estratégia de execução aninhada ineficiente, em que a subconsulta é avaliada para cada linha da consulta externa que produz as colunas de correlação. Às vezes, o BigQuery pode reescrever internamente consultas com subconsultas correlacionadas para que elas sejam executadas com mais eficiência. O erro de subconsultas correlacionadas ocorre quando o BigQuery não consegue otimizar suficientemente a consulta.

Para resolver esse erro, tente o seguinte:

  • Remova todas as cláusulas ORDER BY, LIMIT, EXISTS, NOT EXISTS ou IN da subconsulta.
  • Use uma consulta de várias instruções para criar uma tabela temporária para referenciar na subconsulta.
  • Reescreva a consulta para usar um CROSS JOIN.

Permissões de controle de acesso insuficientes no nível da coluna

String de erro: Requires raw access permissions on the read columns to execute the DML statements

Esse erro ocorre quando você tenta uma instrução DML DELETE, UPDATE ou MERGE sem ter a permissão de leitor de controle refinado nas colunas verificadas que usam o controle de acesso no nível da coluna para restringir esse tipo de acesso. Para mais informações, consulte Impacto nas gravações com controle de acesso no nível da coluna.

Credenciais inválidas para consultas programadas

Strings de erro:

  • Error code: INVALID_USERID
  • Error code 5: Authentication failure: User Id not found
  • PERMISSION_DENIED: BigQuery: Permission denied while getting Drive credentials

Esse erro pode ocorrer quando uma consulta programada falha devido a credenciais desatualizadas, principalmente ao consultar dados do Google Drive.

Para corrigir esse erro, siga estas etapas:

Credenciais de conta de serviço inválidas

String de erro: HttpError 403 when requesting returned: The caller does not have permission

Esse erro pode aparecer quando você tenta configurar uma consulta programada com uma conta de serviço. Para resolver esse erro, consulte as etapas de solução de problemas em Problemas de autorização e permissão.

Hora inválida do snapshot

String de erro: Invalid snapshot time

Esse erro pode ocorrer ao tentar consultar dados históricos que estão fora da janela de viagem no tempo para o conjunto de dados. Para solucionar esse erro, mude a consulta para acessar dados históricos na janela de viagem no tempo do conjunto de dados.

Esse erro também pode aparecer se uma das tabelas usadas na consulta for descartada e recriada depois que a consulta for iniciada. Verifique se há uma consulta programada ou um aplicativo que execute essa operação que foi executada ao mesmo tempo que a consulta com falha. Se houver, tente mover o processo que executa a operação de soltar e recriar para ser executado em um horário que não entre em conflito com as consultas que leem essa tabela.

O job já existe

String de erro: Already Exists: Job <job name>

Esse erro pode ocorrer em jobs de consulta que precisam avaliar matrizes grandes. Assim, a criação de um job de consulta leva mais tempo que a média. Por exemplo, uma consulta com uma cláusula WHERE como WHERE column IN (<2000+ elements array>).

Para corrigir esse erro, siga estas etapas:

Job não localizado

String de erro: Job not found

Esse erro pode ocorrer em resposta a uma chamada getQueryResults, em que nenhum valor é especificado para o campo location. Se esse for o caso, tente ligar novamente e forneça um valor location.

Para mais informações, consulte Evitar várias avaliações das mesmas expressões de tabela comum (CTEs).

Local não encontrado

String de erro: Dataset [project_id]:[dataset_id] was not found in location [region]

Esse erro é retornado quando você menciona um recurso de conjunto de dados que não existe ou quando o local na solicitação não corresponde ao local do conjunto de dados.

Para resolver esse problema, especifique o local do conjunto de dados na consulta ou confirme se ele está disponível no mesmo local.

A consulta excede o limite de tempo de execução

String de erro: Query fails due to reaching the execution time limit

Se a consulta estiver atingindo o limite de tempo de execução da consulta, verifique a duração das execuções anteriores consultando a visualização INFORMATION_SCHEMA.JOBS com uma consulta semelhante ao seguinte exemplo:

SELECT TIMESTAMP_DIFF(end_time, start_time, SECOND) AS runtime_in_seconds
FROM `region-us`.INFORMATION_SCHEMA.JOBS
WHERE statement_type = 'QUERY'
AND query = "my query string";

Se as execuções anteriores da consulta tiverem demorado muito menos tempo, use os insights de desempenho da consulta para determinar e resolver o problema.

A resposta da consulta é muito grande

String de erro: responseTooLarge

Este erro ocorre quando os resultados da consulta são maiores do que o tamanho máximo da resposta.

Para resolver esse erro, siga as orientações fornecidas para a mensagem de erro responseTooLarge.

Muitas instruções DML

String de erro: Too many DML statements outstanding against <table-name>, limit is 20

Esse erro ocorre quando você excede o limite de 20 instruções DML no status PENDING em uma fila para uma única tabela. Esse erro geralmente ocorre quando você envia jobs DML em uma única tabela mais rapidamente do que o BigQuery pode processar.

Uma solução possível é agrupar várias operações DML menores em jobs maiores, mas com menos jobs. Por exemplo, agrupando atualizações e inserções. Quando você agrupa jobs menores em jobs maiores, o custo para executá-los é amortizado e a execução é mais rápida. A consolidação de instruções DML que afetam os mesmos dados geralmente melhora a eficiência dos jobs DML e tem menor probabilidade de exceder o limite de cota de tamanho de fila. Para mais informações sobre como otimizar suas operações DML, consulte Evitar instruções DML que atualizem ou insiram linhas únicas.

Outras soluções para melhorar a eficiência da DML podem ser particionar ou agrupar as tabelas. Para saber mais, consulte Práticas recomendadas.

O usuário não tem permissão

Strings de erro:

  • Access Denied: Project [project_id]: User does not have bigquery.jobs.create permission in project [project_id].
  • User does not have permission to query table project-id:dataset.table.

Esse erro ocorre quando você executa uma consulta sem a permissão bigquery.jobs.create no projeto em que está executando a consulta, independentemente das suas permissões no projeto que contém os dados. Também é necessário ter a permissão bigquery.tables.getData em todas as tabelas e visualizações às quais sua consulta faz referência.

Esse erro também poderá ocorrer se a tabela não existir na região consultada, como asia-south1. Para consultar visualizações, você também precisa dessa permissão em todas as tabelas e visualizações subjacentes. Para mais informações sobre as permissões necessárias, consulte Executar uma consulta.

Ao corrigir esse erro, considere o seguinte:

  • Contas de serviço: as contas de serviço precisam ter a permissão bigquery.jobs.create no projeto em que são executadas.

  • Papéis personalizados: os papéis personalizados do IAM precisam ter a permissão bigquery.jobs.create explicitamente incluída no papel relevante.

  • Conjuntos de dados compartilhados: ao trabalhar com conjuntos de dados compartilhados em um projeto separado, talvez você ainda precise da permissão bigquery.jobs.create no projeto para executar consultas ou jobs nesse conjunto de dados.

Para conceder permissão de acesso à tabela

Para conceder permissão de acesso a uma tabela a um titular, siga estas etapas:

  1. Acessar a página do BigQuery.

    Acessar o BigQuery

  2. No Explorer, navegue até a tabela que você precisa acessar, selecione Ver ações, selecione Compartilhar, e clique em Gerenciar permissões.

  3. Em Adicionar principais, insira o nome dos usuários, grupos, domínios ou contas de serviço que você quer adicionar.

  4. Em Atribuir papéis, selecione a permissão bigquery.jobs.create. Como alternativa, conceder o papel roles/bigquery.jobUser no projeto em que a consulta é feita fornece as permissões necessárias.

  5. Clique em Salvar.

Problemas com recursos excedidos

Os seguintes problemas ocorrem quando o BigQuery não tem recursos suficientes para concluir sua consulta.

A consulta excede os recursos da CPU

String de erro: Query exceeded resource limits

Ele ocorre quando as consultas on demand usam muita CPU em relação à quantidade de dados verificados. Para informações sobre como resolver esses problemas, consulte Resolver problemas de recursos excedidos.

A consulta excede os recursos de memória

String de erro: Resources exceeded during query execution: The query could not be executed in the allotted memory

Para instruções SELECT, esse erro ocorre quando a consulta usa muitos recursos. Para corrigir esse erro, consulte Resolver problemas de recursos excedidos.

A consulta excede os recursos de embaralhamento

String de erro: Resources exceeded during query execution: Your project or organization exceeded the maximum disk and memory limit available for shuffle operations

Esse erro ocorre quando uma consulta não pode acessar recursos suficientes do embaralhamento.

Para solucionar esse erro, provisione mais slots ou reduza a quantidade de dados processados pela consulta. Para mais informações sobre como fazer isso, consulte Cota de embaralhamento insuficiente.

Para mais informações sobre como resolver esses problemas, consulte Resolver problemas de recursos excedidos.

A consulta é muito complexa

String de erro: Resources exceeded during query execution: Not enough resources for query planning - too many subqueries or query is too complex

Esse erro ocorre quando uma consulta é muito complexa. As principais causas de complexidade são:

  • Cláusulas WITH que estão muito aninhadas ou são usadas de forma repetida.
  • Visualizações muito aninhadas ou usadas de forma repetida.
  • Uso repetido do operador UNION ALL.

Para resolver esse erro, tente as seguintes opções:

  • Divida a consulta em várias consultas e use a linguagem processual para executar essas consultas em uma sequência, com estado compartilhado.
  • Use tabelas temporárias em vez de cláusulas WITH.
  • Reescreva sua consulta para reduzir o número de objetos referenciados e comparações.

É possível monitorar de maneira proativa as consultas que estão se aproximando do limite de complexidade usando o campo query_info.resource_warning na visualização INFORMATION_SCHEMA.JOBS. O exemplo a seguir retorna consultas com alto uso de recursos nos últimos três dias:

SELECT
  ANY_VALUE(query) AS query,
  MAX(query_info.resource_warning) AS resource_warning
FROM
  <your_project_id>.`region-us`.INFORMATION_SCHEMA.JOBS
WHERE
  creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 3 DAY)
  AND query_info.resource_warning IS NOT NULL
GROUP BY
  query_info.query_hashes.normalized_literals
LIMIT
  1000

Para mais informações sobre como resolver esses problemas, consulte Resolver problemas de recursos excedidos.

Resolver problemas de recursos excedidos

Para jobs de consulta:

Para otimizar suas consultas, siga estas etapas:

  • Tente remover uma cláusula ORDER BY.
  • Se a consulta usa JOIN, verifique se a tabela maior está à esquerda da cláusula.
  • Se a consulta usa FLATTEN, determine se ele é necessário no caso de uso específico. Para mais informações, consulte dados aninhados e repetidos.
  • Se a consulta usa EXACT_COUNT_DISTINCT, considere usar COUNT(DISTINCT).
  • Se a consulta usa COUNT(DISTINCT <value>, <n>) com um grande valor <n>, use GROUP BY em vez disso. Veja mais informações em COUNT(DISTINCT).
  • Se a consulta usa UNIQUE, utilize GROUP BY em vez disso, ou use a função de janela dentro de uma subseleção.
  • Se a consulta materializar muitas linhas usando uma cláusula LIMIT, considere filtrar em outra coluna, por exemplo, ROW_NUMBER(), ou remover a cláusula LIMIT completamente para permitir o carregamento em paralelo de gravação.
  • Se a consulta usou visualizações profundamente aninhadas e uma cláusula WITH, isso pode causar um crescimento exponencial na complexidade, o que causará o atingimento dos limites.
  • Não substitua tabelas temporárias por cláusulas WITH. A cláusula pode precisar ser recalculada várias vezes, o que pode tornar a consulta complexa e, portanto, lenta. Manter os resultados intermediários em tabelas temporárias ajuda na complexidade
  • Evite usar consultas UNION ALL.

Para saber mais, acesse os recursos a seguir:

Para jobs de carregamento:

Se você estiver carregando arquivos Avro ou Parquet, reduza o tamanho da linha. Verifique se há restrições de tamanho específicas para o formato do arquivo que você está carregando:

Se você receber esse erro ao carregar arquivos ORC, entre em contato com o suporte.

Para a API Storage:

String de erro: Stream memory usage exceeded

Durante uma chamada ReadRows da API Storage Read, alguns streams com alto uso de memória podem receber um erro RESOURCE_EXHAUSTED com essa mensagem. Isso pode acontecer na leitura de tabelas largas ou com um esquema complexo. Como resolução, reduza o tamanho da linha de resultado selecionando menos colunas para ler (usando o parâmetro selected_fields) ou simplificando o esquema da tabela. ,

Resolver problemas de conectividade

As seções a seguir descrevem como resolver problemas de conectividade ao tentar interagir com o BigQuery:

Adicionar o DNS do Google à lista de permissões

Use a ferramenta IP Dig do Google para resolver o endpoint DNS bigquery.googleapis.com do BigQuery em um único IP de registro "A". Verifique se esse IP não está bloqueado nas configurações do firewall.

Em geral, recomendamos adicionar os nomes de DNS do Google à lista de permissões. Os intervalos de IP compartilhados nos arquivos https://www.gstatic.com/ipranges/goog.json e https://www.gstatic.com/ipranges/cloud.json mudam com frequência. Por isso, recomendamos adicionar os nomes de DNS do Google à lista de permissões. Confira uma lista de nomes DNS comuns que recomendamos adicionar à lista de permissões:

  • *.1e100.net
  • *.google.com
  • *.gstatic.com
  • *.googleapis.com
  • *.googleusercontent.com
  • *.appspot.com
  • *.gvt1.com

Identifique o proxy ou firewall que está descartando pacotes

Para identificar todos os saltos de pacote entre o cliente e o Google Front End (GFE), execute um comando traceroute na máquina cliente que possa destacar o servidor que está descartando pacotes direcionados ao GFE. Confira um exemplo de comando traceroute:

traceroute -T -p 443 bigquery.googleapis.com

Também é possível identificar saltos de pacotes para endereços IP específicos do GFE se o problema estiver relacionado a um endereço IP específico:

traceroute -T -p 443 142.250.178.138

Se houver um problema de tempo limite do lado do Google, a solicitação vai chegar até o GFE.

Se os pacotes nunca chegarem ao GFE, entre em contato com o administrador da rede para resolver o problema.

Gerar um arquivo PCAP e analisar seu firewall ou proxy

Gere um arquivo de captura de pacotes (PCAP) e analise-o para garantir que o firewall ou proxy não esteja filtrando pacotes para IPs do Google e permitindo que eles cheguem ao GFE.

Confira um exemplo de comando que pode ser executado com a ferramenta tcpdump:

tcpdump -s 0 -w debug.pcap -K -n host bigquery.googleapis.com

Configurar novas tentativas para problemas de conectividade intermitente

Há situações em que os balanceadores de carga do GFE podem abandonar conexões de um IP de cliente, por exemplo, se ele detectar padrões de tráfego DDOS ou se a instância do balanceador de carga estiver sendo reduzida, o que pode resultar no descarte do IP do endpoint. Se os balanceadores de carga do GFE perderem a conexão, o cliente precisará capturar a solicitação com tempo limite e tentar novamente no endpoint do DNS. Não use o mesmo endereço IP até que a solicitação seja concluída, porque ele pode ter mudado.

Se você identificou um problema com o tempo limite consistente do Google, em que as novas tentativas não ajudam, entre em contato com o Cloud Customer Care e inclua um arquivo PCAP novo gerado executando uma ferramenta de captura de pacotes, como tcpdump.

A seguir