Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Como identificar consultas que usam visões materializadas no ClickHouse


Pergunta

Como mostro todas as consultas envolvendo visões materializadas nos últimos 60 min?

Resposta

Esta consulta exibirá todas as consultas direcionadas a visões materializadas, considerando que:

  • podemos usar o campo create_table_query da tabela system.tables para identificar quais tabelas são destinatárias explícitas (TO) de MVs;
  • podemos rastrear, com base no uuid e na convenção de nomenclatura .inner_id.<uuid>, quais tabelas são destinatárias implícitas de MVs;

Também podemos configurar até quanto tempo atrás queremos consultar, alterando o valor (60 m por padrão) na CTE inicial

WITH(60) -- padrão 60m
AS timeRange,
(
    --prepara nomes de possíveis tabelas de destino ocultas implícitas de MV para *qualquer* tabela com uuid NÃO NULO
    SELECT groupArray(
            concat('default.`.inner_id.', toString(uuid), '`')
        )
    FROM clusterAllReplicas(default, system.tables)
    WHERE notEmpty(uuid)
) AS MV_implicit_possible_hidden_target_tables_names_array,
(
    --captura o nome da MV e as tabelas de destino (se TO for especificado)
    --TODO parece que extract retorna apenas o primeiro grupo de captura :( substituir por regexpExtract quando disponível
    SELECT arrayFilter(
            x->x != '',
            --remove capturas vazias
            groupArray(
                extract(
                    create_table_query,
                    '^CREATE MATERIALIZED VIEW\s(\w+\.\w+)\s(?:TO\s(\S+))?'
                )
            )
        )
    FROM clusterAllReplicas(default, system.tables)
    WHERE engine = 'MaterializedView'
) AS MV_explicit_target_tables_names_array
SELECT event_time,
    query,
    tables as "MVs tables"
FROM clusterAllReplicas(default, system.query_log)
WHERE (
        -- apenas SELECT nos últimos 60m
        event_time > now() - toIntervalMinute(timeRange)
        AND startsWith(query, 'SELECT')
    ) -- verifica se a consulta envolve nomes de tabelas de destino implícitas de MV
    AND (
        hasAny(
            tables,
            MV_implicit_possible_hidden_target_tables_names_array
        )
        OR -- verifica se a consulta envolve tabela de destino explícita de MV
        hasAny(tables, MV_explicit_target_tables_names_array)
    )
ORDER BY event_time DESC;

saída esperada:

| event_time          | query                                                                                          | MVs tables                                                            |
| ------------------- | ---------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
| 2023-02-23 08:14:14 | SELECT     rand(),* FROM     default.sum_of_volumes,     default.big_changes,     system.users | ["default.big_changes_mv","default.sum_of_volumes_mv","system.users"] |
| 2023-02-23 08:04:47 | SELECT     price,* FROM     default.sum_of_volumes,     default.big_changes                    | ["default.big_changes_mv","default.sum_of_volumes_mv"]                |

Neste exemplo, pelos resultados acima, default.big_changes_mv e default.sum_of_volumes_mv são ambas visões materializadas.

Navigation