> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-trino-dialect.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# 根据内存使用量识别 ClickHouse 中的高开销查询

> 了解如何使用 `system.query_log` 表找出 ClickHouse 中最耗费内存的查询，并提供适用于集群和独立部署的示例。

<div id="using-the-systemquery-log-table">
  ## 使用 `system.query_log` 表
</div>

下面这个实用查询会显示你已执行的查询中，哪些占用了最多内存。

关于这个查询，有几点说明：

* 结果基于过去一天 (`now() - toIntervalDay(1))`) 的数据计算得出，不过你也可以轻松调整这个时间间隔
* 它假设你有一个名为 `default` 的集群；在 [ClickHouse Cloud](https://console.clickhouse.cloud) 中，你的集群名称就是这个。请将 `default` 替换为你的集群名称
* 如果你没有集群，请参阅本文末尾列出的查询

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

响应如下：

```response theme={null}
┌─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 │
└──────────┴─────────┴───────────────────────────────────────────────────────────────┴──────────┴───────────────────────┘
```

<Note>
  如果你没有 `system.query_log` 表，那么很可能尚未启用查询日志。有关如何启用它的详细信息，请参阅 [`query_log` setting](/zh/reference/settings/server-settings/settings/query#query_log) 的相关说明。
</Note>

<Note>
  **`query_log` 中记录的不止是你提交的查询**

  你提交的一条查询可能会显示为多行：包括初始查询 (`is_initial_query = 1`) 以及派生步骤或内部步骤 (`is_initial_query = 0`) ，例如用于分布式执行的次级查询，或用于计算视图的内部查询。这些内部行都有各自的 `query_id` 值——由 ClickHouse 分配，有时还会带有类似 `queryView...` 的标签——因此，不要假定每个 `query_id` 都与你的客户端报告的一致。若要将使用情况归因到你实际运行的那条查询，请按 `is_initial_query = 1` 进行过滤，或匹配 `query_id = initial_query_id`。有关详细信息，请参阅[如何识别最昂贵的查询](/zh/resources/support-center/knowledge-base/performance-optimization/find-expensive-queries#initial_query_id-vs-query_id)和 [`query_log` reference](/zh/reference/system-tables/query_log)。
</Note>

如果你没有集群，则可以直接查询仅有的那张 `system.query_log` 表：

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