跳到主要内容

通过内存使用量识别 ClickHouse 中开销大的查询

·2 分钟阅读
了解如何使用 `system.query_log` 表查找 ClickHouse 中最占用内存的查询,并提供集群和独立设置的示例。

使用 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 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 表,那么您可能没有启用查询日志记录。查看 query_log 设置 的详细信息,了解如何启用它。

如果您没有集群,您可以直接查询您的一个 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 query_kind = 'Select'
AND type = 'QueryFinish'
and user != 'monitoring-internal'
GROUP BY
normalized_query_hash,
query,
user
ORDER BY
memory DESC;