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_mv と default.sum_of_volumes_mv は、どちらも materialized view です。