Resolver erros de consulta
Este documento tem como objetivo ajudar você a solucionar os erros mais comuns retornados por consultas com falha.
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.
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 resolver esse erro, atualize as credenciais da consulta programada.
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).
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. 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 Instruções DML que atualizam ou inserem 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 princípio, 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. ,
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.