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:
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.
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.
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
ouIN
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:
- Verifique se você ativou o serviço de transferência de dados do BigQuery, que é um pré-requisito para usar consultas programadas.
- Atualize as credenciais de consultas programadas.
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:
- Permita que o BigQuery gere um
valor
jobId
aleatório em vez de especificar um. - Use uma consulta parametrizada para carregar a matriz.
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:
Acessar a página do BigQuery.
No Explorer, navegue até a tabela que você precisa acessar, selecione
Ver ações, selecione Compartilhar, e clique em Gerenciar permissões.Em Adicionar principais, insira o nome dos usuários, grupos, domínios ou contas de serviço que você quer adicionar.
Em Atribuir papéis, selecione a permissão
bigquery.jobs.create
. Como alternativa, conceder o papelroles/bigquery.jobUser
no projeto em que a consulta é feita fornece as permissões necessárias.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 usarCOUNT(DISTINCT)
. - Se a consulta usa
COUNT(DISTINCT <value>, <n>)
com um grande valor<n>
, useGROUP BY
em vez disso. Veja mais informações emCOUNT(DISTINCT)
. - Se a consulta usa
UNIQUE
, utilizeGROUP 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áusulaLIMIT
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:
- Otimizar a computação em consultas.
- Confira mais detalhes sobre o aviso de recurso
- Monitorar a integridade, a utilização de recursos e os jobs
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
- Receber insights de desempenho da consulta.
- Saiba mais sobre como otimizar consultas para melhorar o desempenho.
- Consulte Cotas e limites para consultas.
- Saiba mais sobre outras mensagens de erro do BigQuery.