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:
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 como conceder papéis, consulte Gerenciar acesso.
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
No Console do Google Cloud, acesse a página do BigQuery.
No menu de navegação, acesse a seção Gerenciamento de capacidade.
Clique em Criar reserva.
Selecione suas configurações de reserva.
Para expandir a seção Configurações avançadas, clique na seta
.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.
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
.
No Console do Google Cloud, acesse a página BigQuery.
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, comoregion-us
. -
RESERVATION_NAME
: o nome da reserva -
CONCURRENCY
: a meta máxima de simultaneidade.
-
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 reservaCONCURRENCY
: 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 como conceder papéis, consulte Gerenciar acesso.
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
No Console do Google Cloud, acesse a página do BigQuery.
No menu de navegação, acesse a seção Gerenciamento de capacidade.
Clique na guia Reservas de slots.
Encontre a reserva que você quer atualizar.
Expanda a opção
Ações.Clique em Editar.
Para expandir a seção Configurações avançadas, clique na seta
.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.
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
.
No Console do Google Cloud, acesse a página BigQuery.
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, comoregion-us
. -
RESERVATION_NAME
: o nome da reserva -
CONCURRENCY
: a meta máxima de simultaneidade.
-
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 reservaCONCURRENCY
: 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.](https://cloud.google.com/static/bigquery/images/admin-resource-chart-queue-length.png?hl=pt)
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.](https://cloud.google.com/static/bigquery/images/metrics-explorer-queue-length.png?hl=pt)
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
- Saiba mais sobre como diagnosticar e resolver erros de limite de fila de consulta.