Consultas no ClickHouse CloudOs dados nesta tabela de sistema são mantidos localmente em cada nó do ClickHouse Cloud. Portanto, para obter uma visão completa de todos os dados, é necessário usar a função
clusterAllReplicas. Consulte aqui para mais detalhes.Descrição
Armazena metadados e estatísticas sobre consultas executadas, como hora de início, duração, mensagens de erro, uso de recursos e outros detalhes da execução. Não armazena os resultados das consultas. Você pode alterar as configurações de registro de consultas na seção query_log da configuração do servidor. Você pode desativar o registro de consultas definindo log_queries = 0. Não recomendamos desativar o registro, porque as informações nesta tabela são importantes para solucionar problemas. O intervalo de flush dos dados é definido no parâmetroflush_interval_milliseconds da seção query_log das configurações do servidor. Para forçar o flush, use a consulta SYSTEM FLUSH LOGS.
O ClickHouse não exclui dados da tabela automaticamente. Consulte a Introdução para mais detalhes.
A tabela system.query_log registra dois tipos de consultas:
- Consultas iniciais (de nível superior).
- Consultas secundárias iniciadas por outras consultas, incluindo consultas para execução distribuída e subconsultas internas, como a avaliação de views. Para essas consultas, as informações sobre a consulta inicial original são exibidas nas colunas
initial_*.
is_initial_query = 1 sempre que consultar system.query_log. Isso exclui consultas secundárias para que etapas individuais de processamento não sejam contabilizadas separadamente da consulta inicial. Esse filtro não implica que uma consulta foi enviada por um cliente, porque o trabalho interno do servidor também pode ser uma consulta inicial.
Use initial_query_id em vez disso quando precisar rastrear uma consulta inicial junto com consultas secundárias que preservam seu ID. A consulta inicial tem o mesmo valor para initial_query_id e query_id, enquanto as consultas secundárias na mesma cadeia mantêm o initial_query_id da consulta inicial e têm seu próprio query_id. Nem todo trabalho iniciado por uma consulta inicial é correlacionado dessa forma: o trabalho encaminhado pelo servidor pode iniciar uma nova cadeia de consultas iniciais com um novo initial_query_id, como nos encaminhamentos remotos do QueryRunner.
system.query_log em cada nó, por exemplo, com clusterAllReplicas.
Cada consulta cria uma ou duas linhas na tabela query_log, dependendo do status (consulte a coluna type) da consulta:
- Se a execução da consulta for bem-sucedida, serão criadas duas linhas com os tipos
QueryStarteQueryFinish. - Se ocorrer um erro durante o processamento da consulta, serão criados dois eventos com os tipos
QueryStarteExceptionWhileProcessing. - Se ocorrer um erro antes do início da consulta, será criado um único evento com o tipo
ExceptionBeforeStart.
query_log.
Você pode usar a configuração log_formatted_queries para registrar consultas formatadas na coluna formatted_query.
É seguro truncar ou remover esta tabela a qualquer momento.
Colunas
hostname(LowCardinality(String)) — Hostname do servidor que executa a consulta.clickhouse_version(LowCardinality(String)) — Versão do servidor ClickHouse que produziu a linha.system_processor(LowCardinality(String)) — Arquitetura de CPU do servidor ClickHouse que produziu a linha.type(Enum8(‘QueryStart’ = 1, ‘QueryFinish’ = 2, ‘ExceptionBeforeStart’ = 3, ‘ExceptionWhileProcessing’ = 4)) — Tipo de evento ocorrido durante a execução da consulta. Valores:QueryStart— início bem-sucedido da execução da consulta,QueryFinish— término bem-sucedido da execução da consulta,ExceptionBeforeStart— exceção antes do início da execução da consulta,ExceptionWhileProcessing— exceção durante a execução da consulta.event_date(Date) — Data de início da consulta.event_time(DateTime) — Hora de início da consulta.event_time_microseconds(DateTime64(6)) — Momento de início da consulta, com precisão de microssegundos.query_start_time(DateTime) — Início da execução da consulta.query_start_time_microseconds(DateTime64(6)) — Horário de início da execução da consulta com precisão de microssegundos.query_duration_ms(UInt64) — Duração da consulta em milissegundos.read_rows(UInt64) — Número total de linhas lidas de todas as tabelas e funções de tabela que participaram da consulta. Isso inclui as subconsultas usuais, subconsultas para IN e JOIN. Para consultas distribuídas, read_rows inclui o número total de linhas lidas em todas as réplicas. Cada réplica envia seu valor de read_rows, e o servidor iniciador da consulta consolida todos os valores recebidos e locais. Os volumes de cache não afetam esse valor.read_bytes(UInt64) — Número total de bytes lidos de todas as tabelas e funções de tabela que participaram da consulta. Inclui as subconsultas usuais, subconsultas para IN e JOIN. Para consultas distribuídas, read_bytes inclui o número total de linhas lidas em todas as réplicas. Cada réplica envia seu valor de read_bytes, e o servidor iniciador da consulta soma todos os valores recebidos e locais. Os volumes de cache não afetam esse valor.written_rows(UInt64) — O número de linhas gravadas pela consulta, incluindo todas as linhas gravadas por inserts downstream acionados pelo pipeline, como visões materializadas anexadas. Para um insert síncrono, essas linhas downstream são registradas na entradaquery_kind=Insert; para um asynchronous insert, elas são registradas na entradaquery_kind=AsyncInsertFlush, enquanto a entradaInsertvisível para o cliente registra apenas as linhas aceitas do cliente. Para consultas que não gravam linhas, é 0.written_bytes(UInt64) — O número de bytes gravados pela consulta (sem compactação), incluindo todos os bytes gravados por inserts downstream acionados pelo pipeline, como visões materializadas anexadas. Para um insert síncrono, esses bytes downstream são registrados na entradaquery_kind=Insert; para um asynchronous insert, eles são registrados na entradaquery_kind=AsyncInsertFlush, enquanto a entradaInsertvisível para o cliente registra apenas os bytes aceitos do cliente. Para consultas que não gravam dados, é 0.result_rows(UInt64) — Número de linhas no resultado de uma consulta SELECT, ou o número de linhas gravadas por um insert. Para um insert síncrono, isso inclui as linhas gravadas por inserts downstream acionados pelo pipeline (como visões materializadas anexadas) na entradaquery_kind=Insert; para um asynchronous insert, essas linhas downstream são registradas na entradaquery_kind=AsyncInsertFlush, enquanto a entradaInsertvisível para o cliente registra apenas as linhas aceitas do cliente.result_bytes(UInt64) — quantidade de RAM, em bytes, usada para armazenar o resultado de uma consulta.memory_usage(UInt64) — Consumo de memória da consulta.current_database(LowCardinality(String)) — Nome do banco de dados atual.query(String) — Texto da consulta.formatted_query(String) — String com a consulta formatada.normalized_query_hash(UInt64) — Um valor de hash numérico, idêntico para consultas que diferem apenas nos valores dos literais.query_kind(LowCardinality(String)) — Tipo de consulta.databases(Array(LowCardinality(String))) — Nomes dos bancos de dados presentes na consulta.tables(Array(LowCardinality(String))) — Nomes das tabelas presentes na consulta.columns(Array(LowCardinality(String))) — Nomes das colunas presentes na consulta.partitions(Array(LowCardinality(String))) — Nomes das partições presentes na consulta.projections(Array(LowCardinality(String))) — Nomes das projeções usadas durante a execução da consulta.views(Array(LowCardinality(String))) — Nomes das views (materializadas ou live) incluídas na consulta.exception_code(Int32) — Código da exceção.exception(String) — Mensagem da exceção.stack_trace(String) — Stack trace. Uma string vazia, se a consulta tiver sido concluída com sucesso.is_initial_query(UInt8) — Indica se a consulta é inicial. Valores possíveis: 1 — uma consulta inicial (de nível superior), 0 — uma consulta filha iniciada por outra consulta, incluindo consultas para execução distribuída e subconsultas internas.connection_address(IPv6) — O endereço IP do cliente a partir do qual a conexão foi feita. Quando a conexão é feita por meio de um proxy, este será o endereço do proxy.connection_port(UInt16) — A porta do cliente a partir da qual a conexão foi estabelecida. Quando a conexão é feita por meio de um proxy, esta será a porta do proxy.user(LowCardinality(String)) — Nome do usuário que iniciou a consulta em execução.query_id(String) — identificador da consulta.address(IPv6) — Endereço IP usado para fazer a consulta. Quando a conexão é feita por meio de um proxy eauth_use_forwarded_addressestá definido, este será o endereço do cliente em vez do endereço do proxy.port(UInt16) — A porta do cliente usada para fazer a consulta. Quando a conexão é feita por meio de um proxy eauth_use_forwarded_addressestá definido, esta será a porta do cliente em vez da porta do proxy.initial_user(LowCardinality(String)) — Nome do usuário que executou a consulta inicial na mesma cadeia de consultas.initial_query_id(String) — ID da consulta inicial na mesma cadeia de consultas.initial_address(IPv6) — Endereço IP a partir do qual a consulta inicial na mesma cadeia de consultas foi iniciada.initial_port(UInt16) — Porta do cliente a partir da qual a consulta inicial na mesma cadeia de consultas foi iniciada.initial_query_start_time(DateTime) — Hora de início da consulta inicial na mesma cadeia de consultas.initial_query_start_time_microseconds(DateTime64(6)) — Hora de início da consulta inicial na mesma cadeia de consultas, com precisão de microssegundos.authenticated_user(LowCardinality(String)) — Nome do usuário autenticado na sessão.interface(Enum8(‘Unknown’ = 0, ‘TCP’ = 1, ‘HTTP’ = 2, ‘gRPC’ = 3, ‘MySQL’ = 4, ‘PostgreSQL’ = 5, ‘Local’ = 6, ‘TCP_Interserver’ = 7, ‘Prometheus’ = 8, ‘Background’ = 9, ‘ArrowFlight’ = 10)) — Interface pela qual a consulta foi iniciada, conforme informado pelo cliente.Unknownse a interface informada não for reconhecida por este servidor.is_secure(UInt8) — O indicador de se uma consulta foi executada por meio de uma interface seguraos_user(LowCardinality(String)) — Nome de usuário do sistema operacional sob o qual o clickhouse-client é executado.client_hostname(LowCardinality(String)) — Hostname da máquina cliente em que o clickhouse-client ou outro cliente TCP é executado.client_name(LowCardinality(String)) — O nome do clickhouse-client ou de outro cliente TCP.client_agent(LowCardinality(String)) — O agente de codificação com IA que invocou o cliente (por exemplo,claude-code,cursor), detectado a partir de variáveis de ambiente. Vazio se nenhum agente for detectado.client_revision(UInt32) — Revisão do clickhouse-client ou de outro cliente TCP.client_version_major(UInt32) — Versão principal do clickhouse-client ou de outro cliente TCP.client_version_minor(UInt32) — Versão menor do clickhouse-client ou de outro cliente TCP.client_version_patch(UInt32) — Número de patch da versão do clickhouse-client ou de outro cliente TCP.script_query_number(UInt32) — O número da consulta em um script com várias consultas no clickhouse-client.script_line_number(UInt32) — O número da linha em que a consulta começa em um script com várias consultas para o clickhouse-client.http_method(Enum8(‘UNKNOWN’ = 0, ‘GET’ = 1, ‘POST’ = 2, ‘OPTIONS’ = 3, ‘PUT’ = 4, ‘DELETE’ = 5, ‘HEAD’ = 6)) — Método HTTP que iniciou a consulta.UNKNOWNse a consulta não chegou por HTTP ou se o método informado não for reconhecido por este servidor.http_user_agent(LowCardinality(String)) — cabeçalho HTTP UserAgent enviado na consulta HTTP.http_referer(String) — cabeçalho HTTP Referer enviado na consulta HTTP (contém um endereço absoluto ou parcial da página que originou a consulta).forwarded_for(String) — cabeçalho HTTP X-Forwarded-For enviado na consulta HTTP.quota_key(String) — A chave da quota especificada na configuração de quotas (consulte keyed).distributed_depth(UInt64) — Quantas vezes uma consulta foi repassada entre servidores.revision(UInt32) — número de revisão do ClickHouse.http_handler_name(String) — Nome do handler HTTP definido em SQL (CREATE HANDLER) que invocou a consulta. Vazio se a consulta não tiver sido invocada por esse tipo de handler.http_request_url(String) — O caminho da requisição HTTP (sem a string de consulta) que invocou a consulta. A string de consulta é omitida para que parâmetros sensíveis da requisição não sejam persistidos. Vazio para consultas que não são HTTP.log_comment(String) — Comentário do log. Pode ser definido como uma string arbitrária com tamanho de até max_query_size. Será uma string vazia se não estiver definido.thread_ids(Array(UInt64)) — IDs das threads que participam da execução da consulta. Essas threads podem não ter sido executadas simultaneamente.peak_threads_usage(UInt64) — Número máximo de threads simultâneas que executam a consulta.ProfileEvents(Map(LowCardinality(String), UInt64)) —ProfileEventsque medem diferentes métricas. A descrição deles pode ser encontrada na tabela system.eventsSettings(Map(LowCardinality(String), LowCardinality(String))) — Configurações alteradas quando o cliente executou a consulta. Para registrar em log as alterações nas configurações, defina o parâmetro log_query_settings como 1.used_aggregate_functions(Array(LowCardinality(String))) — Nomes canônicos das funções de agregação usadas na execução da consulta.used_aggregate_function_combinators(Array(LowCardinality(String))) — Nomes canônicos dos combinadores de funções de agregação usados durante a execução da consulta.used_database_engines(Array(LowCardinality(String))) — Nomes canônicos dos motores de banco de dados usados durante a execução da consulta.used_data_type_families(Array(LowCardinality(String))) — Nomes canônicos das famílias de tipos de dados usados durante a execução da consulta.used_dictionaries(Array(LowCardinality(String))) — Nomes canônicos dos dicionários usados durante a execução da consulta.used_formats(Array(LowCardinality(String))) — Nomes canônicos dos formatos usados durante a execução da consulta.used_functions(Array(LowCardinality(String))) — Nomes canônicos das funções usadas durante a execução da consulta.used_storages(Array(LowCardinality(String))) — Nomes canônicos dos armazenamentos usados durante a execução da consulta.used_table_functions(Array(LowCardinality(String))) — Nomes canônicos das funções de tabela usadas durante a execução da consulta.used_executable_user_defined_functions(Array(LowCardinality(String))) — Nomes canônicos de funções executáveis definidas pelo usuário, que foram usadas durante a execução da consulta.used_sql_user_defined_functions(Array(LowCardinality(String))) — Nomes canônicos das funções definidas pelo usuário em SQL usadas durante a execução da consulta.used_row_policies(Array(LowCardinality(String))) — A lista com os nomes das políticas de linha usadas durante a execução da consulta.used_privileges(Array(LowCardinality(String))) — Privilégios cuja verificação foi bem-sucedida durante a execução da consulta.missing_privileges(Array(LowCardinality(String))) — Privilégios ausentes durante a execução da consulta.used_number_of_joins(UInt64) — O número de junções físicas executadas para esta consulta. Ele é coletado dos pipelines à medida que são construídos, portanto reflete as junções que restam após todas as otimizações, e não o número de cláusulas JOIN no texto da consulta. Uma junção é contabilizada independentemente do nível de aninhamento: subconsultas, expressões de tabela comuns, views, views de views e o SELECT de uma visão materializada acionada por um INSERT são todos registrados na linha da consulta que foi enviada, de modo que esse valor pode ser diferente de zero para uma consulta cujo próprio texto não contém nenhum JOIN. Uma consulta que constrói um pipeline sem executá-lo, como EXPLAIN PIPELINE, registra as junções da consulta que ela explica. Alguns pipelines são montados mais de uma vez durante a execução de uma única consulta: o SELECT de uma visão materializada é montado para cada bloco do INSERT que o aciona e por cada fluxo de insert, o membro recursivo de uma CTE recursiva é montado a cada iteração, e a relação de um loop é montada novamente toda vez que é reiniciada. Ainda assim, as junções de um pipeline desse tipo são contabilizadas uma única vez, de modo que esse número descreve a consulta, e não quantas vezes seus pipelines foram montados.used_join_algorithms(Array(LowCardinality(String))) — Algoritmos das junções contabilizadas em used_number_of_joins: ‘HASH’, ‘PARALLEL_HASH’, ‘GRACE_HASH’, ‘PARTIAL_MERGE’, ‘FULL_SORTING_MERGE’, ‘PARALLEL_FULL_SORTING_MERGE’, ‘IE_JOIN’, ‘DIRECT’, ‘PASTE’ e ‘CONSTANT’, ordenados e sem duplicatas, de modo que um algoritmo compartilhado por várias junções aparece uma única vez. Este é o algoritmo escolhido para executar cada junção, e não os algoritmos permitidos pela configuração join_algorithm. Um algoritmo pode ser substituído por outro no meio da execução; nesse caso, ambos são registrados.used_join_kinds(Array(LowCardinality(String))) — Tipos das junções contabilizadas em used_number_of_joins, um elemento por junção, de modo que um tipo compartilhado por várias junções aparece várias vezes. Os elementos são ordenados, e não apresentados na ordem de execução. Cada tipo é aquele que foi de fato executado, o que pode diferir do texto da consulta, pois o otimizador pode executar uma junção com os lados invertidos, transformando assim LEFT em RIGHT.used_join_strictness(Array(LowCardinality(String))) — Rigor (strictness) das junções contabilizadas em used_number_of_joins, um elemento por junção, na mesma ordem de used_join_kinds: o elemento em um determinado índice descreve a mesma junção em ambos os arrays.spilled_to_disk(Array(LowCardinality(String))) — Operadores que gravaram dados em arquivos temporários no disco (processamento em memória externa) durante a execução da consulta, ordenados e sem duplicatas. Um array vazio significa que a consulta foi executada inteiramente em memória.transaction_id(Tuple(UInt64, UInt64, UUID, Int64)) — O identificador da transação no contexto da qual esta consulta foi executada.query_cache_usage(Enum8(‘Unknown’ = 0, ‘None’ = 1, ‘Write’ = 2, ‘Read’ = 3)) — Uso do cache de consultas durante a execução da consulta. Valores: ‘Unknown’ = Status desconhecido, ‘None’ = O resultado da consulta não foi nem armazenado no cache de resultados da consulta nem lido dele, ‘Write’ = O resultado da consulta foi armazenado no cache de resultados da consulta, ‘Read’ = O resultado da consulta foi lido do cache de resultados da consulta.asynchronous_read_counters(Map(LowCardinality(String), UInt64)) — Métricas de leitura assíncrona.is_internal(UInt8) — Indica se é uma consulta auxiliar executada internamente.
ProfileEvents.Names— Alias paramapKeys(ProfileEvents).ProfileEvents.Values— Alias paramapValues(ProfileEvents).Settings.Names— Alias paramapKeys(Settings).Settings.Values— Alias paramapValues(Settings).
Exemplos
Exemplo básicosystem.query_log é local a cada nó; para ver todas as entradas, você precisa fazer a consulta por meio de clusterAllReplicas.
Por exemplo, para agregar linhas de query_log de todas as réplicas no cluster “default”, você pode escrever:
Veja também
- system.query_thread_log — Esta tabela contém informações sobre cada thread usada na execução de uma consulta.
- system.session_query_ids — Esta tabela contém os ids das consultas executadas na sessão atual, permitindo encontrar suas próprias consultas no log.