Use filas de consultas

O BigQuery determina automaticamente o número de consultas que podem ser executadas em simultâneo, a que se chama concorrência dinâmica. As consultas adicionais são colocadas em fila de espera até que os recursos de processamento fiquem disponíveis. Este documento explica como controlar o objetivo de concorrência máxima e definir o limite de tempo da fila para consultas interativas e em lote.

Vista geral

O BigQuery determina dinamicamente o número de consultas que podem ser executadas em simultâneo com base nos recursos de computação disponíveis. O número de consultas que podem ser executadas em simultâneo é calculado por projeto a pedido ou por reserva. As consultas adicionais são colocadas numa fila até haver capacidade suficiente disponível para iniciar a execução. O comprimento da fila está limitado a 1000 consultas interativas e 20 000 consultas em lote por projeto por região, independentemente de o projeto ser a pedido ou usar uma reserva. O exemplo seguinte mostra o comportamento de um projeto a pedido quando a simultaneidade de consultas calculada é 202:

202 consultas simultâneas, seguidas de consultas em fila,
seguidas de consultas que devolvem um erro.

Para as reservas, tem a opção de definir o objetivo de concorrência máxima, um limite superior para o número de consultas que podem ser executadas em simultâneo numa reserva, para garantir que a cada consulta é atribuído um número mínimo de espaços. Não pode especificar um destino de simultaneidade máxima para um projeto a pedido. Este é sempre calculado dinamicamente.

Comportamento de colocação em fila

O BigQuery aplica uma programação equitativa para garantir que nenhum projeto individual pode consumir todas as posições numa reserva.

As consultas de projetos com a menor quota de concorrência são retiradas da fila primeiro. Durante a execução, os slots são distribuídos de forma justa entre os projetos antes de serem distribuídos entre as tarefas num projeto.

Por exemplo, suponhamos que tem 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 em simultâneo , o projeto B tem uma consulta em execução e outras consultas estão em fila de espera. Uma consulta do projeto B é retirada da fila primeiro, mesmo que tenha sido enviada após a consulta do projeto A. Depois de uma consulta começar a execução, recebe uma quota justa de espaços na reserva partilhada.

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 executar por projeto a pedido ou reserva. Se o número de consultas em lote em execução em simultâneo atingir este máximo, as consultas interativas têm prioridade, mesmo que tenham sido enviadas mais tarde.

Quando elimina uma reserva, todas as consultas em fila de espera expiram. Quando um projeto atribuído a uma reserva é reatribuído a outra reserva, todos os pedidos em fila ou em execução continuam a ser processados na reserva antiga, enquanto todos os novos pedidos são encaminhados para a nova reserva. Quando um projeto atribuído a uma reserva é removido da reserva, as consultas em execução continuam na reserva, enquanto os pedidos novos e em fila de espera são executados através do modelo a pedido. Opcionalmente, pode cancelar tarefas de consulta individuais em execução ou em fila.

Controlar o limite de tempo da fila

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

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

Para desativar a colocação em fila, defina o limite de tempo da fila como -1. Se atingir a concorrência máxima de consultas, as consultas adicionais falham com um erro ADMISSION_DENIED.

Defina o alvo de simultaneidade máximo

Pode definir manualmente o objetivo de concorrência máxima quando cria uma reserva. Por predefinição, o objetivo de simultaneidade máximo é zero, o que significa que o BigQuery determina dinamicamente a simultaneidade com base nos recursos disponíveis. Caso contrário, se definir um objetivo diferente de zero, o objetivo de concorrência máximo especifica um limite superior para o número de consultas executadas em simultâneo numa reserva, o que garante uma quantidade mínima de capacidade de espaço disponível para cada consulta executada.

O aumento do objetivo de concorrência máxima não garante que mais consultas sejam executadas em simultâneo. A concorrência real depende dos recursos de computação disponíveis, que podem ser aumentados adicionando mais espaços à sua reserva.

Funções necessárias

Para receber a autorização de que precisa para definir a simultaneidade numa nova reserva, peça ao seu administrador para lhe conceder a função do IAM de Editor de recursos do BigQuery (roles/bigquery.resourceEditor) no projeto de administração que mantém a propriedade dos compromissos. Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

Esta função predefinida contém a autorização bigquery.reservations.create , que é necessária para definir a simultaneidade numa nova reserva.

Também pode obter esta autorização com funções personalizadas ou outras funções predefinidas.

Para mais informações sobre as funções de IAM no BigQuery, consulte o artigo Funções e autorizações predefinidas.

Defina o objetivo de simultaneidade máxima para uma reserva

Selecione uma das seguintes opções:

Consola

  1. Na Trusted Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No menu de navegação, clique em Gestão da capacidade.

  3. Clique em Criar reserva.

  4. Selecione as definições de reserva.

  5. Para expandir a secção Definições avançadas, clique na seta de expansão .

  6. Para definir a simultaneidade de tarefas de destino, clique no botão ativar/desativar Substituir a simultaneidade de tarefas de destino automática para o ativar e introduza a Simultaneidade de tarefas de destino.

  7. Clique em Guardar.

SQL

Para definir o alvo de concorrência máximo para uma nova reserva, use a declaração DDL CREATE RESERVATION e defina o campo target_job_concurrency.

  1. Na Trusted Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, introduza a seguinte declaração:

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

    Substitua o seguinte:

    • ADMIN_PROJECT_ID: o projeto que detém a reserva
    • LOCATION: a localização da reserva, como region-us
    • RESERVATION_NAME: o nome da reserva
    • CONCURRENCY: o alvo de concorrência máximo

  3. Clique em Executar.

Para mais informações sobre como executar consultas, consulte o artigo Execute uma consulta interativa.

bq

Para definir o objetivo de concorrência máxima para 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 o seguinte:

  • ADMIN_PROJECT_ID: o projeto que detém a reserva
  • LOCATION: a localização da reserva
  • CONCURRENCY: o alvo de concorrência máximo
  • RESERVATION_NAME: o nome da reserva

API

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

Atualize o alvo de concorrência máxima

Pode atualizar o objetivo de concorrência máxima de uma reserva em qualquer altura. No entanto, o aumento do destino não garante que sejam executadas mais consultas em simultâneo. A concorrência real depende dos recursos de computação disponíveis. Se reduzir o alvo de concorrência máximo, as consultas em execução ativa não são afetadas, e as consultas em fila não são executadas até o número de consultas concorrentes ficar abaixo do novo alvo.

Se definir o destino de simultaneidade máxima como 0, o BigQuery determina dinamicamente a simultaneidade com base nos recursos disponíveis (o comportamento predefinido).

Funções necessárias

Para receber a autorização de que precisa para atualizar o objetivo de concorrência máxima de uma reserva, peça ao seu administrador que lhe conceda a função do IAM Editor de recursos do BigQuery (roles/bigquery.resourceEditor) no projeto de administração que mantém a propriedade dos compromissos. Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

Esta função predefinida contém a autorização bigquery.reservations.update , que é necessária para atualizar o objetivo de concorrência máxima de uma reserva.

Também pode obter esta autorização com funções personalizadas ou outras funções predefinidas.

Para mais informações sobre as funções de IAM no BigQuery, consulte o artigo Funções e autorizações predefinidas.

Atualize o alvo de concorrência máxima para uma reserva

Selecione uma das seguintes opções:

Consola

  1. Na Trusted Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No menu de navegação, clique em Gestão da capacidade.

  3. Clique no separador Reservas de horários.

  4. Encontre a reserva que quer atualizar.

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

  6. Clique em Edit.

  7. Para expandir a secção Definições avançadas, clique na seta de expansão .

  8. Para definir a simultaneidade de tarefas de destino, clique no botão ativar/desativar Substituir a simultaneidade de tarefas de destino automática para o ativar e introduza a Simultaneidade de tarefas de destino.

  9. Clique em Guardar.

SQL

Para atualizar o objetivo de concorrência máxima de uma reserva existente, use a ALTER RESERVATION declaração DDL e defina o target_job_concurrency campo.

  1. Na Trusted Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No editor de consultas, introduza a seguinte declaração:

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

    Substitua o seguinte:

    • ADMIN_PROJECT_ID: o projeto que detém a reserva
    • LOCATION: a localização da reserva, como region-us
    • RESERVATION_NAME: o nome da reserva
    • CONCURRENCY: o alvo de concorrência máximo

  3. Clique em Executar.

Para mais informações sobre como executar consultas, consulte o artigo Execute uma consulta interativa.

bq

Para atualizar o objetivo de concorrência máxima 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 o seguinte:

  • ADMIN_PROJECT_ID: o projeto que detém a reserva
  • LOCATION: a localização da reserva
  • CONCURRENCY: o alvo de concorrência máximo
  • RESERVATION_NAME: o nome da reserva

API

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

Monitorização

Para saber que consultas estão a ser executadas e quais estão na fila, consulte as vistas INFORMATION_SCHEMA.JOBS_BY_* e INFORMATION_SCHEMA.JOBS_TIMELINE_BY_*. O campo state está definido como RUNNING para consultas em execução ativa e como PENDING para consultas em fila.

Para ver quantas consultas simultâneas foram executadas quando o limite de simultaneidade dinâmico foi atingido a cada segundo durante o último dia, execute a seguinte 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 o seguinte:

  • PROJECT_ID: o nome do projeto no qual executou as consultas
  • REGION_ID: a localização onde as consultas foram processadas
  • RESERVATION_ID: o nome da reserva na qual as consultas estão a ser executadas

Pode monitorizar o comprimento da fila de consultas para a sua reserva através dos gráficos de recursos administrativos do BigQuery e selecionar o gráfico Execução simultânea de tarefas com a métrica Pendente.

Também pode monitorizar o comprimento da fila no Cloud Monitoring vendo a métrica job count e filtrando pelo número de trabalhos num estado pendente.

Limitações

  • Cada projeto a pedido pode colocar em fila até 1000 consultas interativas e 20 000 consultas em lote em simultâneo. As consultas que excedem este limite devolvem um erro de quota. Não pode pedir um aumento destes limites.
  • Numa reserva, cada projeto atribuído a essa reserva pode colocar em fila de espera até 1000 consultas interativas e 20 000 consultas em lote em simultâneo. As consultas que excedem este limite devolvem um erro de quota. Não pode pedir um aumento destes limites.
  • Por predefinição, as tarefas de consulta que não tenham iniciado a execução expiram após 6 horas para consultas interativas e 24 horas para consultas em lote.
  • Não pode definir o objetivo de simultaneidade máxima para consultas executadas num projeto a pedido.
  • Não pode definir o objetivo de concorrência máxima para consultas executadas com uma reserva da edição Standard. Para mais informações sobre as edições, consulte o artigo Introdução às edições do BigQuery.

O que se segue?