跳转到主要内容

回答

system 数据库中的 query_log 表会记录你的所有查询,包括:
  • 查询消耗了多少内存,以及
  • 查询需要多少 CPU 时间
以下查询会返回前 10 个查询,其中“前”是指内存使用量最高的查询:
返回结果如下:
initial_query_id 表示初始查询的 ID,即由接收请求的节点发起、用于分布式查询执行的查询。query_id 则包含在其他节点上执行的子查询 ID。更多详情请参见这篇文章
你可以使用查询 ID 提取该查询的更多详细信息。让我们来分析一下上面运行时间最长的查询 (第一个) :
结果表明,这正是我们用来向名为 youtube 的表插入数十亿行数据的查询 (参见 YouTube dislikes 数据集) :

initial_query_id VS query_id

请注意,在 ClickHouse 集群环境中 (如 ClickHouse Cloud) ,initial_query_id 表示由接收请求的节点发起、用于分布式查询执行的初始查询 ID; 而 query_id 字段则包含在其他节点上执行的子查询 ID。
Distributed 执行并不是 query_id 值不同的唯一来源单个查询也可能派生出内部子查询,这些子查询会以各自的 query_idis_initial_query = 0 被记录下来——最常见的情况是 ClickHouse 为评估 views 而运行的内部查询。这些内部标识符由 ClickHouse 分配,其格式可能与返回给客户端的格式不同;在与视图相关的步骤中,你可能会看到包含 queryView... 之类标签的 query_id 值。当你想精确定位自己提交的那条查询时,请按 is_initial_query = 1 (或 query_id = initial_query_id) 进行过滤。这是 query_log 的 server-side 行为,对任何客户端都一致,包括 Cloud SQL 控制台。
如果我们将 query_id 添加到上述查询中,就会把搜索范围锁定在 initial_query_id = a7262fa2-bd8b-4b51-a359-621ccf282417hostname() 上:
结果如下:
请注意,我们得到了来自多个主机 (即不同集群节点) 的多条结果。 若要进一步缩小范围,只保留子查询,还可以在 WHERE 子句中添加 query_id != initial_query_id 条件:
返回在远程节点上执行的所有子查询 (这里的“远程”是相对于最初发起该查询的节点而言) :
反过来,query_id = initial_query_id 只会返回在最初发起分布式查询的本地节点上执行的查询:
结果如下:
至于其他系统表,你可以在我们的文档中了解每个字段含义的更多细节。
最后修改于 2026年6月29日