> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

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

> 指定した時間範囲内でmaterialized viewに関連するすべてのクエリを特定するために、ClickHouseのログをクエリする方法を学びます。

***

<div id="question">
  ## Question
</div>

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

<div id="answer">
  ## 回答
</div>

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

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

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

```sql theme={null}
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;
```

想定される出力:

```sql theme={null}
| 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_mv` と `default.sum_of_volumes_mv` は、どちらも materialized view です。
