Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

ClickHouseでmaterialized viewを使用するクエリを特定する方法


Question

過去60分間にmaterialized viewが関係するすべてのクエリを表示するにはどうすればよいですか?

回答

このクエリは、次の点を踏まえて、materialized view に送られるすべてのクエリを表示します。

  • system.tables テーブルの create_table_query フィールドを利用して、どのテーブルが MV の明示的な (TO) 書き込み先であるかを特定できます。
  • uuid.inner_id.<uuid> という命名規則を使って、どのテーブルが MV の暗黙的な書き込み先であるかをたどれます。

また、先頭のクエリ CTE 内の値 (デフォルトでは 60 m) を変更することで、どこまで過去にさかのぼって確認するかを設定できます。

WITH(60) -- デフォルト 60m
AS timeRange,
(
    --NON NULL uuidを持つ*任意の*テーブルに対して、暗黙的なMVの隠しターゲットテーブル名を準備する
    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,
(
    --MV名とターゲットテーブルを取得する(TOが指定されている場合)
    --TODO: extractは最初のキャプチャグループのみを返すようだ :( regexpExtractが利用可能になったら置き換える
    SELECT arrayFilter(
            x->x != '',
            --空のキャプチャを除去する
            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 (
        -- 60m以内のSELECTのみ
        event_time > now() - toIntervalMinute(timeRange)
        AND startsWith(query, 'SELECT')
    ) -- クエリが暗黙的なMVターゲットテーブル名を参照しているか確認する
    AND (
        hasAny(
            tables,
            MV_implicit_possible_hidden_target_tables_names_array
        )
        OR -- クエリが明示的なMVターゲットテーブルを参照しているか確認する
        hasAny(tables, MV_explicit_target_tables_names_array)
    )
ORDER BY event_time DESC;

想定される出力:

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

この例では、上記の結果にある default.big_changes_mvdefault.sum_of_volumes_mv は、どちらも materialized view です。

Navigation