Visão geral
As consultas em segundo plano permitem que os clientes enviem consultas que são executadas independentemente da sessão do cliente, bastando definirrun_query_in_background=1. Após o envio, o servidor ClickHouse responde imediatamente ao cliente, enquanto a consulta segue sendo executada até a conclusão (com sucesso ou falha) no lado do servidor
Ao desacoplar a execução da consulta da conexão de rede do cliente, as tarefas em segundo plano tornam-se totalmente resilientes a desconexões do lado do cliente ou a falhas de rede transitórias.
As consultas em segundo plano destinam-se principalmente a operações de longa duração, como INSERT ... SELECT,
CREATE TABLE ... AS SELECT, CREATE MATERIALIZED VIEW ... POPULATE ou OPTIMIZE TABLE ... FINAL,
que não devem ser interrompidas caso a conexão do cliente caia.
Nem toda consulta pode ser desanexada de sua conexão. Consulte Formas de consulta sem suporte
para saber quais requisições são rejeitadas.
Uma consulta em segundo plano não sobrevive à reinicialização do servidor. O comportamento no desligamento do servidor é controlado por
shutdown_wait_unfinished_queries e shutdown_wait_unfinished.
Formas de consulta sem suporte
Uma consulta em segundo plano continua ativa após o encerramento da conexão que a enviou, portanto o servidor já deve ter tudo o que precisa para executá-la no momento em que a aceita. As requisições que não atendem a essa condição são rejeitadas de forma síncrona, na conexão que as enviou, e a consulta nunca é iniciada.Dados que trafegam pela conexão
UmINSERT é rejeitado quando o servidor ainda precisaria ler dados da conexão que o enviou após o encaminhamento
da consulta.
Isso pode afetar tanto INSERT ... FORMAT ... quanto consultas que leem por meio de input. Uma requisição desse tipo é rejeitada
com A query whose data streams over the connection cannot be run in the background:
clickhouse-client envia os dados de um INSERT ... FORMAT ... em pacotes separados, portanto essa forma nunca pode ser executada em segundo plano pelo protocolo nativo.
Por HTTP, qualquer uma das formas pode ser aceita quando a consulta completa e seus dados cabem no buffer inicial de parsing, limitado por max_query_size.
Isso inclui uma consulta HTTP que lê um payload inline por meio de input. Um corpo maior continua sendo transmitido além do texto da consulta armazenado em buffer e é rejeitado.
Não dependa desse limite de tamanho: use INSERT ... SELECT ou uma table function como url ou s3 para dados que precisam ser carregados em segundo plano.
Outras requisições rejeitadas
A configuração nunca é propagada para as consultas secundárias de uma consulta distribuída: um
INSERT distribuído em segundo plano
executa suas consultas por shard em primeiro plano, dentro da consulta inicial em segundo plano.
Enviar uma consulta em segundo plano
Protocolo TCP nativo
Com oclickhouse-client, passe run_query_in_background como uma configuração de linha de comando:
SETTINGS inline:
clickhouse-client analisa a maioria das configurações de consulta inline e as envia nessa seção de configurações.
Já os drivers de protocolo nativo podem passar run_query_in_background no seu map de configurações por consulta, mantendo o texto SQL inalterado.
O protocolo nativo não retorna um query_id gerado pelo servidor. Os clientes nativos devem gerar um ID único e enviá-lo junto com a consulta.
O clickhouse-client --echo-query-id faz isso e imprime o ID antes de enviar a consulta:
Protocolo HTTP
Para requisições HTTP, passerun_query_in_background como parâmetro de URL:
X-ClickHouse-Query-Id:
query_id como URL parameter.
Assim, o cliente já conhece o ID antes de fazer a requisição e pode monitorar a consulta ou executar KILL nela no nó que a aceitou, mesmo que nunca veja a resposta:
SETTINGS inline:
BAD_ARGUMENTS. O HTTP handler precisa decidir se cria um contexto de consulta desanexado antes que o corpo da requisição seja convertido.
Passe o SETTING na URL ou configure-o no nível de USER ou de profile.
Monitorar a execução
Use oquery_id para verificar se uma consulta está em execução no momento:
system.query_log para verificar seu status final:
system.query_log em vez de ser retornada pela conexão original.
system.processes, system.query_log e KILL QUERY são locais ao nó: cada um enxerga apenas as consultas do servidor que os atende.Uma consulta em segundo plano pertence ao servidor que a aceitou, que não é necessariamente aquele que sua próxima requisição alcançará por meio de um balanceador de carga. Em vez disso, consulte o cluster inteiro:system.query_log, e o cancelamento requer a forma em todo o cluster:Atraso no flush do query log
As entradas ficam em buffer antes de aparecerem emsystem.query_log.
No ClickHouse autogerenciado, o exemplo de configuração do servidor define query_log.flush_interval_milliseconds como 7500.
No ClickHouse Cloud, as entradas podem levar até 30 segundos para aparecer. Leve esse atraso em conta ao monitorar consultas em segundo plano de curta duração.
Em um servidor autogerenciado, usuários com privilégios suficientes podem forçar o flush do query log. Informe o nome do log explicitamente para que os demais system logs não sejam afetados:
system.query_log de outro servidor visível localmente, portanto continue lendo o log por meio de clusterAllReplicas, conforme descrito em Monitorar a execução.