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:

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:

  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. ,

A seguir