使用 system.query_log 表
下面这个实用查询会显示你已执行的查询中,哪些占用了最多内存。
关于这个查询,有几点说明:
- 结果基于过去一天 (
now() - toIntervalDay(1))) 的数据计算得出,不过你也可以轻松调整这个时间间隔 - 它假设你有一个名为
default的集群;在 ClickHouse Cloud 中,你的集群名称就是这个。请将default替换为你的集群名称 - 如果你没有集群,请参阅本文末尾列出的查询
SELECT
count() as nb_query,
user,
query,
sum(memory_usage) AS memory,
normalized_query_hash
FROM
clusterAllReplicas(default, system.query_log)
WHERE
(event_time >= (now() - toIntervalDay(1)))
AND is_initial_query = 1
AND query_kind = 'Select'
AND type = 'QueryFinish'
and user != 'monitoring-internal'
GROUP BY
normalized_query_hash,
query,
user
ORDER BY
memory DESC;响应如下:
┌─nb_query─┬─user────┬─query─────────────────────────────────────────────────────────┬───memory─┬─normalized_query_hash─┐
│ 11 │ default │ select version() │ 46178924 │ 7202516440347714159 │
│ 2 │ default │ SELECT * FROM "system"."table_functions" LIMIT 31 OFFSET 0 │ 8391544 │ 12830067173062987695 │
└──────────┴─────────┴───────────────────────────────────────────────────────────────┴──────────┴───────────────────────┘如果你没有集群,则可以直接查询仅有的那张 system.query_log 表:
SELECT
count() as nb_query,
user,
query,
sum(memory_usage) AS memory,
normalized_query_hash
FROM
system.query_log
WHERE
(event_time >= (now() - toIntervalDay(1)))
AND is_initial_query = 1
AND query_kind = 'Select'
AND type = 'QueryFinish'
and user != 'monitoring-internal'
GROUP BY
normalized_query_hash,
query,
user
ORDER BY
memory DESC;