mcpField
C
clickhouse-query

clickhouse-query

github.com/civitai数据与数据库7.3k95 次安装今天更新
代码仓库

关于 clickhouse-query

用于分析、指标检查和调试的 ClickHouse 临时查询命令行技能。它支持查看执行计划,并默认采取只读保护。

主要功能

  1. 01执行 ClickHouse SQL 查询
  2. 02查看查询执行计划
  3. 03从文件读取查询并输出 JSON
  4. 04写操作需使用 --writable
  5. 05设置查询超时

适用场景

  1. 01分析应用事件指标
  2. 02检查查询执行计划
  3. 03跨副本查询系统表

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/civitai/civitai --skill clickhouse-query

安装后在 Claude Code 中输入/clickhouse-query确认已加载。

附带文件.env.examplequery.mjs

详细介绍

ClickHouse 查询测试

使用此技能运行临时 ClickHouse 查询,用于分析、指标分析和调试。

运行查询

使用附带的查询脚本:

node .claude/skills/clickhouse-query/query.mjs "SELECT count() FROM views"
选项
标志说明
--explain显示查询执行计划
--writable允许写入操作(需要用户许可)
--timeout <s>, -t查询超时时间,单位为秒(默认值:30)
--file, -f从文件读取查询
--json以 JSON 格式输出结果
--quiet, -q精简输出,仅显示结果
示例
# Count rows in a table
node .claude/skills/clickhouse-query/query.mjs "SELECT count() FROM views"

# Query with filters
node .claude/skills/clickhouse-query/query.mjs "SELECT * FROM modelEvents WHERE modelId = 123 LIMIT 10"

# Check query execution plan
node .claude/skills/clickhouse-query/query.mjs --explain "SELECT * FROM views WHERE userId = 1"

# Override default 30s timeout for longer queries
node .claude/skills/clickhouse-query/query.mjs --timeout 60 "SELECT ... (complex aggregation)"

# Query from file
node .claude/skills/clickhouse-query/query.mjs -f my-query.sql

# JSON output for processing
node .claude/skills/clickhouse-query/query.mjs --json "SELECT type, count() FROM modelEvents GROUP BY type"

安全功能

  1. 默认只读:除非使用 --writable 标志,否则会阻止 INSERT/ALTER/DROP
  2. 30 秒超时:防止查询长时间运行(可通过 --timeout 覆盖)
  3. 需要明确许可:使用 --writable 之前,必须征得用户许可

何时使用 --writable

仅在以下情况下使用 --writable 标志:

  • 用户明确请求写入权限
  • 需要插入测试数据
  • 正在运行维护操作

重要:使用 --writable 运行之前,务必征得用户许可。

常见表

表说明
views页面/实体查看事件
modelEvents模型创建/发布/更新事件
modelVersionEvents模型版本事件,包括下载
userActivities用户注册、登录、订阅事件
images图片上传/删除事件
reactions点赞/点踩事件
reports内容举报事件
entityMetricEvents聚合指标事件

查询副本集群

重要:生产环境使用 ClickHouse 副本集群。查询系统表(日志、指标等)时,必须使用 clusterAllReplicas() 获取所有节点的数据。

副本集群上的系统表
-- WRONG: Only queries the node you're connected to
SELECT * FROM system.query_log WHERE event_time > now() - INTERVAL 1 HOUR

-- CORRECT: Queries all replicas in the cluster
SELECT * FROM clusterAllReplicas(default, system.query_log)
WHERE event_time > now() - INTERVAL 1 HOUR
常见系统表查询
-- Find recent queries across all nodes
SELECT
    hostname(),
    event_time,
    query_duration_ms,
    formatReadableSize(memory_usage) AS memory,
    query
FROM clusterAllReplicas(default, system.query_log)
WHERE type = 'QueryFinish'
    AND event_time > now() - INTERVAL 5 MINUTE
ORDER BY event_time DESC
LIMIT 20

-- Find expensive queries by memory usage (last 24 hours)
SELECT
    count() as query_count,
    user,
    sum(memory_usage) AS total_memory,
    normalized_query_hash
FROM clusterAllReplicas(default, system.query_log)
WHERE event_time > now() - INTERVAL 1 DAY
    AND query_kind = 'Select'
    AND type = 'QueryFinish'
GROUP BY normalized_query_hash, user
ORDER BY total_memory DESC
LIMIT 10

-- Search query logs by pattern
SELECT event_time, query_id, query, type
FROM clusterAllReplicas(default, merge('system', '^query_log*'))
WHERE query ILIKE '%some_table%'
    AND event_time > now() - INTERVAL 5 MINUTE

-- Debug a specific query across all nodes
SELECT hostname(), message
FROM clusterAllReplicas(default, system.text_log)
WHERE query_id = 'your-query-id-here'
ORDER BY event_time_microseconds ASC
何时使用 clusterAllReplicas()
使用场景函数
系统表(query_log、text_log 等)clusterAllReplicas(default, system.table_name)
应用表(views、modelEvents 等)直接查询(已分布)
搜索多个系统表clusterAllReplicas(default, merge('system', '^pattern*'))

ClickHouse SQL 提示

-- Use count() not COUNT(*)
SELECT count() FROM views

-- Date filtering with toDate()
SELECT * FROM views WHERE toDate(time) = today()

-- Last 7 days
SELECT * FROM modelEvents WHERE time > now() - INTERVAL 7 DAY

-- Aggregations
SELECT type, count() as cnt FROM modelEvents GROUP BY type ORDER BY cnt DESC

评论

支持 Markdown