Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Comment identifier les requêtes utilisant des vues matérialisées dans ClickHouse


Question

Comment afficher toutes les requêtes impliquant des vues matérialisées sur les 60 dernières minutes ?

Réponse

Cette requête affichera toutes les requêtes dirigées vers les vues matérialisées, étant donné que :

  • nous pouvons exploiter le champ create_table_query de la table system.tables pour identifier quelles tables sont les destinataires explicites (TO) des vues matérialisées ;
  • nous pouvons remonter (à l’aide de uuid et de la convention de nommage .inner_id.<uuid>) quelles tables sont les destinataires implicites des vues matérialisées ;

Nous pouvons également configurer jusqu’à combien de temps en arrière nous voulons remonter, en modifiant la valeur (60 m par défaut) dans la CTE de la requête initiale

WITH(60) -- default 60m
AS timeRange,
(
    --prepare names of possible implicit MV hidden target tables for *any* table with NON NULL uuid
    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,
(
    --captures MV name and target tables (if TO is specified)
    --TODO it seems that extract will return just the first capturing group :( replace with regexpExtract once available
    SELECT arrayFilter(
            x->x != '',
            --remove empty captures
            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 (
        -- only SELECT within 60m
        event_time > now() - toIntervalMinute(timeRange)
        AND startsWith(query, 'SELECT')
    ) -- check either that query involves implicit MV target table names
    AND (
        hasAny(
            tables,
            MV_implicit_possible_hidden_target_tables_names_array
        )
        OR -- check that query involves explicit MV target table
        hasAny(tables, MV_explicit_target_tables_names_array)
    )
ORDER BY event_time DESC;

résultat attendu :

| 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"]                |

Dans cet exemple, les résultats ci-dessus, default.big_changes_mv et default.sum_of_volumes_mv, sont tous deux des vues matérialisées.

Navigation