Usar filas de consulta

O BigQuery determina automaticamente o número de consultas que podem ser executadas simultaneamente, o que é chamado de simultaneidade dinâmica. Outras consultas são enfileiradas até que os recursos de processamento fiquem disponíveis. Neste documento, explicamos como controlar o objetivo máximo de simultaneidade e definir o tempo limite da fila para consultas interativas e em lote.

Visão geral

O BigQuery determina dinamicamente o número de consultas que podem ser executadas simultaneamente com base nos recursos de computação disponíveis. O número de consultas que podem ser executadas simultaneamente é calculado por projeto sob demanda ou reserva. Consultas adicionais são colocadas em uma fila até que haja capacidade suficiente disponível para iniciar a execução. O comprimento da fila é limitado a 1.000 consultas interativas e 20.000 consultas em lote por projeto por região, independentemente de o projeto estar sob demanda ou usar uma reserva. Confira no exemplo a seguir o comportamento de um projeto sob demanda quando a simultaneidade de consulta calculada é 202:

202 consultas simultâneas, seguidas por consultas na fila,
seguidas por consultas que retornam um erro.

Para reservas, você tem a opção de definir o objetivo máximo de simultaneidade, um limite superior no número de consultas que podem ser executadas simultaneamente em uma reserva, para garantir que cada consulta receba um número mínimo de slots. Não é possível especificar uma meta máxima de simultaneidade para um projeto sob demanda. Ela é sempre calculada dinamicamente.

Comportamento de enfileiramento

O BigQuery impõe uma programação justa para garantir que nenhum projeto possa consumir todos os slots em uma reserva.

As consultas de projetos que têm a menor parcela de simultaneidade são removidas primeiro. Durante a execução, os slots são distribuídos de forma justa entre projetos antes de serem distribuídos entre jobs em um projeto.

Por exemplo, suponha que você tenha uma reserva atribuída a dois projetos: A e B. O BigQuery calcula 5 para a simultaneidade da reserva. O projeto A tem quatro consultas em execução, o B tem uma consulta em execução e outras estão na fila. Uma consulta do projeto B seria retirada da fila primeiro, mesmo que tenha sido enviada após a consulta do projeto A. Depois que uma consulta começa a execução, ela recebe uma parcela justa de slots na reserva compartilhada.

Além do número total de consultas simultâneas, o BigQuery determina dinamicamente o número máximo de consultas em lote simultâneas a serem executadas por reserva ou projeto sob demanda. Se o número de consultas em lote em execução simultânea atingir esse máximo, as consultas interativas serão priorizadas mesmo que tenham sido enviadas depois.

Ao excluir uma reserva, todas as consultas na fila expiram. Quando um projeto atribuído a uma reserva é reatribuído a outra reserva, todas as solicitações que estão em fila ou em execução continuam a fazer isso na reserva antiga, enquanto todas as novas solicitações vão para a nova reserva. Quando um projeto atribuído a uma reserva é removido dela, as consultas em execução continuam na reserva enquanto solicitações novas e na fila são executadas usando o modelo sob demanda. Também é possível cancelar cada job de consulta em execução ou na fila.

Controlar o tempo limite da fila

Para controlar o tempo limite da fila para consultas interativas ou em lote, use a declaração ALTER PROJECT SET OPTIONS ou ALTER ORGANIZATION SET OPTIONS para definir os campos default_interactive_query_queue_timeout_ms ou default_batch_query_queue_timeout_ms na configuração padrão do projeto ou da organização.

Para ver o tempo limite da fila para consultas interativas ou em lote no seu projeto, consulte a visualização INFORMATION_SCHEMA.EFFECTIVE_PROJECT_OPTIONS.

Para desativar o recurso, defina o tempo limite como -1. Se você atingir a simultaneidade máxima de consulta, as consultas adicionais falharão com um erro ADMISSION_DENIED.

Definir a meta de simultaneidade máxima

É possível definir manualmente a meta máxima de simultaneidade ao criar uma reserva. Por padrão, a meta máxima de simultaneidade é zero, o que significa que o BigQuery determina dinamicamente a simultaneidade com base nos recursos disponíveis. Caso contrário, se você definir um objetivo diferente de zero, a meta máxima de simultaneidade especificará um limite superior para o número de consultas executadas simultaneamente em uma reserva, o que garante uma quantidade mínima de capacidade de slot disponível para cada consulta que é executada.

O aumento da meta máxima de simultaneidade não garante que mais consultas possam ser executadas simultaneamente. A simultaneidade real depende dos recursos de computação disponíveis, que podem ser aumentados com a adição de mais slots à sua reserva.

Funções exigidas

Para ter a permissão necessária para definir a simultaneidade em uma nova reserva, peça ao administrador para conceder a você o papel de Editor de recursos do BigQuery (roles/bigquery.resourceEditor) do IAM no projeto de administração que mantém a propriedade dos compromissos. Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

Esse papel predefinido contém a permissão bigquery.reservations.create, que é necessária para definir a simultaneidade em uma nova reserva.

Também é possível conseguir essa permissão com papéis personalizados ou outros papéis predefinidos.

Para mais informações sobre os papéis do IAM no BigQuery, consulte Papéis e permissões predefinidos.

Definir a meta máxima de simultaneidade para uma reserva

Selecione uma das seguintes opções:

Console

  1. No Console do Google Cloud, acesse a página do BigQuery.

    Acessar o BigQuery

  2. No menu de navegação, acesse a seção Gerenciamento de capacidade.

  3. Clique em Criar reserva.

  4. Selecione suas configurações de reserva.

  5. Para expandir a seção Configurações avançadas, clique na seta .

  6. Para definir a simultaneidade do job de destino, clique no botão Substituir simultaneidade automática do job de destino e ative a opção Simultaneidade do job de destino.

  7. Clique em Salvar.

SQL

Para definir o destino máximo de simultaneidade de uma nova reserva, use a instrução DDL CREATE RESERVATION e defina o campo target_job_concurrency.

  1. No Console do Google Cloud, acesse a página BigQuery.

    Ir para o BigQuery

  2. No editor de consultas, digite a seguinte instrução:

    CREATE RESERVATION `ADMIN_PROJECT_ID.LOCATION.RESERVATION_NAME`
      OPTIONS (
        target_job_concurrency = CONCURRENCY);

    Substitua:

    • ADMIN_PROJECT_ID: o projeto que é proprietário da reserva.
    • LOCATION: o local da reserva, como region-us.
    • RESERVATION_NAME: o nome da reserva
    • CONCURRENCY: a meta máxima de simultaneidade.

  3. Clique em Executar.

Para mais informações sobre como executar consultas, acesse Executar uma consulta interativa.

bq

Para definir a meta máxima de simultaneidade de uma nova reserva, execute o comando bq mk:

bq mk \
    --project_id=ADMIN_PROJECT_ID \
    --location=LOCATION \
    --target_job_concurrency=CONCURRENCY \
    --reservation \
    RESERVATION_NAME

Substitua:

  • ADMIN_PROJECT_ID: o projeto que é proprietário da reserva.
  • LOCATION: o local da reserva
  • CONCURRENCY: a meta máxima de simultaneidade.
  • RESERVATION_NAME: o nome da reserva

API

Para definir a meta máxima de simultaneidade na API BigQuery Reservation, defina o campo concurrency no recurso de reserva e chame o método CreateReservationRequest.

Atualizar a meta de simultaneidade máxima

É possível atualizar a meta máxima de simultaneidade de uma reserva a qualquer momento. No entanto, aumentar o valor desejado não garante que mais consultas sejam executadas simultaneamente. A simultaneidade real depende dos recursos de computação disponíveis. Se você reduzir a meta máxima de simultaneidade, as consultas em execução não serão afetadas e as consultas na fila não serão executadas até que o número de consultas simultâneas fique abaixo da nova meta.

Se você definir a meta máxima de simultaneidade como 0, o BigQuery determinará dinamicamente a simultaneidade com base nos recursos disponíveis (o comportamento padrão).

Funções exigidas

Para ter a permissão necessária para atualizar o destino máximo de simultaneidade de uma reserva, peça ao administrador para conceder a você o papel de Editor de recursos do BigQuery (roles/bigquery.resourceEditor) do IAM no projeto de administração, que mantém a propriedade dos compromissos. Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

Esse papel predefinido contém a permissão bigquery.reservations.update, que é necessária para atualizar o destino de simultaneidade máximo de uma reserva.

Também é possível conseguir essa permissão com papéis personalizados ou outros papéis predefinidos.

Para mais informações sobre os papéis do IAM no BigQuery, consulte Papéis e permissões predefinidos.

Atualizar a meta máxima de simultaneidade de uma reserva

Selecione uma das seguintes opções:

Console

  1. No Console do Google Cloud, acesse a página do BigQuery.

    Acessar o BigQuery

  2. No menu de navegação, acesse a seção Gerenciamento de capacidade.

  3. Clique na guia Reservas de slots.

  4. Encontre a reserva que você quer atualizar.

  5. Expanda a opção Ações.

  6. Clique em Editar.

  7. Para expandir a seção Configurações avançadas, clique na seta .

  8. Para definir a simultaneidade do job de destino, clique no botão Substituir simultaneidade automática do job de destino e ative a opção Simultaneidade do job de destino.

  9. Clique em Salvar.

SQL

Para atualizar o destino máximo de simultaneidade de uma reserva, use a instrução DDL ALTER RESERVATION e defina o campo target_job_concurrency.

  1. No Console do Google Cloud, acesse a página BigQuery.

    Ir para o BigQuery

  2. No editor de consultas, digite a seguinte instrução:

    ALTER RESERVATION `ADMIN_PROJECT_ID.LOCATION.RESERVATION_NAME`
    SET OPTIONS (
      target_job_concurrency = CONCURRENCY);

    Substitua:

    • ADMIN_PROJECT_ID: o projeto que é proprietário da reserva.
    • LOCATION: o local da reserva, como region-us.
    • RESERVATION_NAME: o nome da reserva
    • CONCURRENCY: a meta máxima de simultaneidade.

  3. Clique em Executar.

Para mais informações sobre como executar consultas, acesse Executar uma consulta interativa.

bq

Para atualizar a meta máxima de simultaneidade de uma reserva existente, execute o comando bq update:

bq update \
    --project_id=ADMIN_PROJECT_ID \
    --location=LOCATION \
    --target_job_concurrency=CONCURRENCY \
    --reservation \
    RESERVATION_NAME

Substitua:

  • ADMIN_PROJECT_ID: o projeto que é proprietário da reserva.
  • LOCATION: o local da reserva
  • CONCURRENCY: a meta máxima de simultaneidade.
  • RESERVATION_NAME: o nome da reserva

API

Para atualizar a meta máxima de simultaneidade na API BigQuery Reservation, defina o campo concurrency no recurso de reserva e chame o método UpdateReservationRequest.

Monitoramento

Para descobrir quais consultas estão em execução e quais estão na fila, consulte as visualizações INFORMATION_SCHEMA.JOBS_BY_* e INFORMATION_SCHEMA.JOBS_TIMELINE_BY_*. O campo state é definido como RUNNING para consultas em execução ativas e como PENDING para consultas na fila.

Para ver quantas consultas simultâneas foram executadas quando o limite de simultaneidade dinâmica foi alcançado por cada segundo no último dia, execute esta consulta:

SELECT
  t1.period_start,
  t1.job_count AS dynamic_concurrency_threshold
FROM (
  SELECT
    period_start,
    state,
    COUNT(DISTINCT job_id) AS job_count
  FROM
    `PROJECT_ID.REGION_ID`.INFORMATION_SCHEMA.JOBS_TIMELINE
  WHERE
    period_start BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
    AND CURRENT_TIMESTAMP()
    AND reservation_id = "RESERVATION_ID"
  GROUP BY
    period_start,
    state) AS t1
JOIN (
  SELECT
    period_start,
    state,
    COUNT(DISTINCT job_id) AS job_count
  FROM
    `PROJECT_ID.REGION_ID`.INFORMATION_SCHEMA.JOBS_TIMELINE
  WHERE
    state = "PENDING"
    AND period_start BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
    AND CURRENT_TIMESTAMP()
    AND reservation_id = "RESERVATION_ID"
  GROUP BY
    period_start,
    state
  HAVING
    COUNT(DISTINCT job_id) > 0 ) AS t2
ON
  t1.period_start = t2.period_start
WHERE
  t1.state = "RUNNING";

Substitua:

  • PROJECT_ID: o nome do projeto em que você executou as consultas.
  • REGION_ID: o local onde as consultas foram processadas.
  • RESERVATION_ID: o nome da reserva em que as consultas estão sendo executadas

É possível monitorar o comprimento da fila de consultas da sua reserva usando: Gráficos de recursos administrativos do BigQuery e selecionando o gráfico Simultaneidade do job com a métrica Pendente.

Comprimento da fila em gráficos de recursos administrativos.

Também é possível monitorar o tamanho da fila no Cloud Monitoring visualizando a métrica de contagem de jobs e filtrando-a pelo número de jobs em um estado pendente.

Comprimento da fila no Cloud Monitoring.

Limitações

  • Cada projeto sob demanda pode enfileirar até 1.000 consultas interativas e 20.000 consultas em lote de uma só vez. As consultas que excedem esse limite retornam um erro de cota. Não é possível solicitar um aumento desses limites.
  • Em uma reserva, cada projeto atribuído a ela pode enfileirar até 1.000 consultas interativas e 20.000 consultas em lote de uma só vez. As consultas que excedem esse limite retornam um erro de cota. Não é possível solicitar um aumento desses limites.
  • Por padrão, os jobs de consulta que não iniciaram expiram após 6 horas para consultas interativas e 24 horas para consultas em lote.
  • Não é possível definir a meta máxima de simultaneidade para consultas em execução em um projeto sob demanda.
  • Não é possível definir o objetivo máximo de simultaneidade para consultas em execução com uma reserva da edição Standard. Para mais informações sobre edições, consulte Introdução às edições do BigQuery.

A seguir