Clickhouse Query

Run ClickHouse queries for analytics and metrics with safety guardrails

✨ The solution you've been looking for

Verified
Tested and verified by our team
6981 Stars

Run ClickHouse queries for analytics, metrics analysis, and event data exploration. Use when you need to query ClickHouse directly, analyze metrics, check event tracking data, or test query performance. Read-only by default.

clickhouse analytics database query metrics debugging sql data-analysis
Repository

See It In Action

Interactive preview & real-world examples

Live Demo
Skill Demo Animation

AI Conversation Simulator

See how users interact with this skill

User Prompt

Show me the top 10 most viewed models in the last 7 days with their view counts

Skill Processing

Analyzing request...

Agent Response

A formatted table showing model IDs, names, and view counts with proper aggregation and time filtering

Quick Start (3 Steps)

Get up and running in minutes

1

Install

claude-code skill install clickhouse-query

claude-code skill install clickhouse-query
2

Config

3

First Trigger

@clickhouse-query help

Commands

CommandDescriptionRequired Args
@clickhouse-query analyze-user-engagement-metricsQuery view events and user activities to understand platform usage patternsNone
@clickhouse-query debug-query-performanceUse explain plans and system tables to identify slow queries and optimize database performanceNone
@clickhouse-query monitor-system-healthQuery system tables across replica clusters to monitor database health and identify issuesNone

Typical Use Cases

Analyze User Engagement Metrics

Query view events and user activities to understand platform usage patterns

Debug Query Performance

Use explain plans and system tables to identify slow queries and optimize database performance

Monitor System Health

Query system tables across replica clusters to monitor database health and identify issues

Overview

ClickHouse Query Testing

Use this skill to run ad-hoc ClickHouse queries for analytics, metrics analysis, and debugging.

Running Queries

Use the included query script:

1node .claude/skills/clickhouse-query/query.mjs "SELECT count() FROM views"

Options

FlagDescription
--explainShow query execution plan
--writableAllow write operations (requires user permission)
--timeout <s>, -tQuery timeout in seconds (default: 30)
--file, -fRead query from a file
--jsonOutput results as JSON
--quiet, -qMinimal output, only results

Examples

 1# Count rows in a table
 2node .claude/skills/clickhouse-query/query.mjs "SELECT count() FROM views"
 3
 4# Query with filters
 5node .claude/skills/clickhouse-query/query.mjs "SELECT * FROM modelEvents WHERE modelId = 123 LIMIT 10"
 6
 7# Check query execution plan
 8node .claude/skills/clickhouse-query/query.mjs --explain "SELECT * FROM views WHERE userId = 1"
 9
10# Override default 30s timeout for longer queries
11node .claude/skills/clickhouse-query/query.mjs --timeout 60 "SELECT ... (complex aggregation)"
12
13# Query from file
14node .claude/skills/clickhouse-query/query.mjs -f my-query.sql
15
16# JSON output for processing
17node .claude/skills/clickhouse-query/query.mjs --json "SELECT type, count() FROM modelEvents GROUP BY type"

Safety Features

  1. Read-only by default: Blocks INSERT/ALTER/DROP unless --writable flag is used
  2. 30 second timeout: Prevents runaway queries (override with --timeout)
  3. Explicit permission required: Before using --writable, you MUST ask the user for permission

When to Use –writable

Only use the --writable flag when:

  • The user explicitly requests write access
  • You need to insert test data
  • You’re running maintenance operations

IMPORTANT: Always ask the user for permission before running with --writable.

Common Tables

TableDescription
viewsPage/entity view events
modelEventsModel create/publish/update events
modelVersionEventsModel version events including downloads
userActivitiesUser registration, login, subscription events
imagesImage upload/delete events
reactionsLike/dislike events
reportsContent report events
entityMetricEventsAggregated metric events

Querying Replica Clusters

IMPORTANT: Production uses a ClickHouse replica cluster. When querying system tables (logs, metrics, etc.), you must use clusterAllReplicas() to get data from all nodes.

System Tables on Replica Clusters

1-- WRONG: Only queries the node you're connected to
2SELECT * FROM system.query_log WHERE event_time > now() - INTERVAL 1 HOUR
3
4-- CORRECT: Queries all replicas in the cluster
5SELECT * FROM clusterAllReplicas(default, system.query_log)
6WHERE event_time > now() - INTERVAL 1 HOUR

Common System Table Queries

 1-- Find recent queries across all nodes
 2SELECT
 3    hostname(),
 4    event_time,
 5    query_duration_ms,
 6    formatReadableSize(memory_usage) AS memory,
 7    query
 8FROM clusterAllReplicas(default, system.query_log)
 9WHERE type = 'QueryFinish'
10    AND event_time > now() - INTERVAL 5 MINUTE
11ORDER BY event_time DESC
12LIMIT 20
13
14-- Find expensive queries by memory usage (last 24 hours)
15SELECT
16    count() as query_count,
17    user,
18    sum(memory_usage) AS total_memory,
19    normalized_query_hash
20FROM clusterAllReplicas(default, system.query_log)
21WHERE event_time > now() - INTERVAL 1 DAY
22    AND query_kind = 'Select'
23    AND type = 'QueryFinish'
24GROUP BY normalized_query_hash, user
25ORDER BY total_memory DESC
26LIMIT 10
27
28-- Search query logs by pattern
29SELECT event_time, query_id, query, type
30FROM clusterAllReplicas(default, merge('system', '^query_log*'))
31WHERE query ILIKE '%some_table%'
32    AND event_time > now() - INTERVAL 5 MINUTE
33
34-- Debug a specific query across all nodes
35SELECT hostname(), message
36FROM clusterAllReplicas(default, system.text_log)
37WHERE query_id = 'your-query-id-here'
38ORDER BY event_time_microseconds ASC

When to Use clusterAllReplicas()

Use CaseFunction
System tables (query_log, text_log, etc.)clusterAllReplicas(default, system.table_name)
Application tables (views, modelEvents, etc.)Direct query (already distributed)
Search multiple system tablesclusterAllReplicas(default, merge('system', '^pattern*'))

ClickHouse SQL Tips

 1-- Use count() not COUNT(*)
 2SELECT count() FROM views
 3
 4-- Date filtering with toDate()
 5SELECT * FROM views WHERE toDate(time) = today()
 6
 7-- Last 7 days
 8SELECT * FROM modelEvents WHERE time > now() - INTERVAL 7 DAY
 9
10-- Aggregations
11SELECT type, count() as cnt FROM modelEvents GROUP BY type ORDER BY cnt DESC

What Users Are Saying

Real feedback from the community

Environment Matrix

Dependencies

Node.js (for query script execution)
ClickHouse client connection

Context Window

Token Usage ~1K-3K tokens for typical queries and results

Security & Privacy

Information

Author
civitai
Updated
2026-01-30
Category
debugging