Skip to main content

描述

包含当前会话中已执行查询的 query id,按执行顺序排列。可借助它在 system.query_log 中查找“我刚刚运行的那些查询”,而无需在客户端指定 query_id,也无需用 log_comment 为查询打标签。 其内容的作用域为会话级:每个会话只能看到自己的历史记录,其他会话的查询绝不会出现。 query id 在查询开始时即被记录,因此:
  • 当前正在运行的查询从该表中查询数据时,其自身已可见。
  • 失败的查询同样会被记录 - 获取刚刚失败查询的 id 正是一个主要用例。
内部查询 (如系统日志刷写等) 不会被记录。distributed 查询在远端 shard 上运行的子查询也不会被记录 - 只有发起的那个查询会出现在 initiator 的会话中。

各接口的会话范围

  • 原生/TCP 连接 (ClickHouse 客户端、各类驱动) 以及 clickhouse-local:会话即连接,因此历史记录会累积该连接上的所有查询,包括客户端一次调用中执行的多条查询。
  • 带 session_id 参数的 HTTP:只要请求传入相同的 session_id,历史记录就会在这些请求之间保留,直到会话过期。
  • 不带 session_id 的 HTTP:每个请求自成一个会话,因此该表始终只显示当前查询。

历史记录大小

历史记录是一个环形缓冲区,其大小受会话设置 session_query_ids_history_size (默认 1000) 限制;当历史记录超过该大小时,最旧的条目会被优先淘汰。将其设为 0 则禁用记录;此前已记录的条目仍会保留在表中,直到被 TRUNCATE 或淘汰。 该设置在查询开始时、解析查询之前读取,因此查询自身的 SETTINGS 子句不会影响该查询是否被记录;请改用 SET、HTTP URL 参数或 settings profile。

TRUNCATE

TRUNCATE TABLE system.session_query_ids 会清除当前会话的历史记录。序列计数器不会重置,因此在同一会话内 sequence_number 的值不会被重复使用。

列

  • sequence_number (UInt64) — 该查询在会话中的位置,单调递增。
  • query_id (String) — 查询 id,可与 system.query_log 进行连接。

Example

运行几个查询,然后从 system.query_log 中拉取它们的详细信息:
当前查询在开始时即被记录,因此它显示为最后一条记录。通过连接 system.query_log,可以获取时间戳、status 以及所有其他详细信息:

参见

  • system.query_log - 已执行查询的详细信息。
  • session_query_ids_history_size 设置。
最后修改于 2026年9月28日