Clickhouse best practices skill

MUST USE when reviewing ClickHouse schemas, queries, or configurations.

by ClickHouse·Apache-2.0 license·★ 544 Stars on the repo·GitHub ↗

Use now

Files of Clickhouse best practices

ClickHouse/main1 file shown
SKILL.md
Show the full text275 lines

ClickHouse Best Practices

Comprehensive guidance for ClickHouse covering schema design, query optimization, data ingestion, and AI agent connectivity. Contains 31 rules across 4 main categories (schema, query, insert, agent), prioritized by impact.

Official docs: ClickHouse Best Practices

IMPORTANT: How to Apply This Skill

Before answering ClickHouse questions, follow this priority order:

  1. Check for applicable rules in the rules/ directory
  2. If rules exist: Apply them and cite them in your response using "Per rule-name..."
  3. If no rule exists: Use the LLM's ClickHouse knowledge or search documentation
  4. If uncertain: Use web search for current best practices
  5. Always cite your source: rule name, "general ClickHouse guidance", or URL

Why rules take priority: ClickHouse has specific behaviors (columnar storage, sparse indexes, merge tree mechanics) where general database intuition can be misleading. The rules encode validated, ClickHouse-specific guidance.


Agent Connectivity & Query Workflow

Before querying ClickHouse, agents must establish a connection and follow the discovery workflow:

  1. rules/agent-connect-mcp.md - Connection setup (MCP + CLI), credential discovery, output format selection
  2. rules/agent-discovery-schema.md - CRITICAL: 7-step schema discovery workflow
  3. rules/agent-query-safety.md - CRITICAL: LIMIT, timeouts, progressive exploration

Every agent session should follow this sequence:

  1. Connect — establish connection via MCP or CLI (see agent-connect-mcp)
  2. Discover — databases → tables → columns + comments → sort keys → skip indexes → sample → EXPLAIN
  3. Plan — use sort key and skip index knowledge to write efficient WHERE clauses
  4. Execute — run queries with LIMIT and timeouts
  5. Recover — on timeout/memory errors, narrow filters and retry (see agent-query-safety)
Subagent architecture notes

If your system dispatches ClickHouse tasks to specialized subagents:

  • Schema discovery + query execution: any model — the steps are procedural
  • EXPLAIN analysis + query optimization: benefits from mid-tier reasoning
  • Schema design review against all 28 rules: benefits from mid-tier reasoning

Review Procedures

For Schema Reviews (CREATE TABLE, ALTER TABLE)

Read these rule files in order:

  1. rules/schema-pk-plan-before-creation.md - ORDER BY is immutable
  2. rules/schema-pk-cardinality-order.md - Column ordering in keys
  3. rules/schema-pk-prioritize-filters.md - Filter column inclusion
  4. rules/schema-types-native-types.md - Proper type selection
  5. rules/schema-types-minimize-bitwidth.md - Numeric type sizing
  6. rules/schema-types-lowcardinality.md - LowCardinality usage
  7. rules/schema-types-avoid-nullable.md - Nullable vs DEFAULT
  8. rules/schema-partition-low-cardinality.md - Partition count limits
  9. rules/schema-partition-lifecycle.md - Partitioning purpose

Check for:

  • PRIMARY KEY / ORDER BY column order (low-to-high cardinality)
  • Data types match actual data ranges
  • LowCardinality applied to appropriate string columns
  • Partition key cardinality bounded (100-1,000 values)
  • ReplacingMergeTree has version column if used
For Query Reviews (SELECT, JOIN, aggregations)

Read these rule files:

  1. rules/query-join-choose-algorithm.md - Algorithm selection
  2. rules/query-join-filter-before.md - Pre-join filtering
  3. rules/query-join-use-any.md - ANY vs regular JOIN
  4. rules/query-index-skipping-indices.md - Secondary index usage
  5. rules/schema-pk-filter-on-orderby.md - Filter alignment with ORDER BY

Check for:

  • Filters use ORDER BY prefix columns
  • JOINs filter tables before joining (not after)
  • Correct JOIN algorithm for table sizes
  • Skipping indices for non-ORDER BY filter columns
For Insert Strategy Reviews (data ingestion, updates, deletes)

Read these rule files:

  1. rules/insert-batch-size.md - Batch sizing requirements
  2. rules/insert-mutation-avoid-update.md - UPDATE alternatives
  3. rules/insert-mutation-avoid-delete.md - DELETE alternatives
  4. rules/insert-async-small-batches.md - Async insert usage
  5. rules/insert-optimize-avoid-final.md - OPTIMIZE TABLE risks

Check for:

  • Batch size 10K-100K rows per INSERT
  • No ALTER TABLE UPDATE for frequent changes
  • ReplacingMergeTree or CollapsingMergeTree for update patterns
  • Async inserts enabled for high-frequency small batches

Output Format

Structure your response as follows:

## Rules Checked
- `rule-name-1` - Compliant / Violation found
- `rule-name-2` - Compliant / Violation found
...

## Findings

### Violations
- **`rule-name`**: Description of the issue
  - Current: [what the code does]
  - Required: [what it should do]
  - Fix: [specific correction]

### Compliant
- `rule-name`: Brief note on why it's correct

## Recommendations
[Prioritized list of changes, citing rules]

Rule Categories by Priority

Priority Category Impact Prefix Rule Count
1 Primary Key Selection CRITICAL schema-pk- 4
2 Data Type Selection CRITICAL schema-types- 5
3 JOIN Optimization CRITICAL query-join- 5
4 Insert Batching CRITICAL insert-batch- 1
5 Mutation Avoidance CRITICAL insert-mutation- 2
6 Partitioning Strategy HIGH schema-partition- 4
7 Skipping Indices HIGH query-index- 1
8 Materialized Views HIGH query-mv- 2
9 Async Inserts HIGH insert-async- 2
10 OPTIMIZE Avoidance HIGH insert-optimize- 1
11 JSON Usage MEDIUM schema-json- 1
12 Agent Schema Discovery CRITICAL agent-discovery- 1
13 Agent Query Safety CRITICAL agent-query- 1
14 Agent Connectivity + Formats HIGH agent-connect- 1

Quick Reference

Schema Design - Primary Key (CRITICAL)
  • schema-pk-plan-before-creation - Plan ORDER BY before table creation (immutable)
  • schema-pk-cardinality-order - Order columns low-to-high cardinality
  • schema-pk-prioritize-filters - Include frequently filtered columns
  • schema-pk-filter-on-orderby - Query filters must use ORDER BY prefix
Schema Design - Data Types (CRITICAL)
  • schema-types-native-types - Use native types, not String for everything
  • schema-types-minimize-bitwidth - Use smallest numeric type that fits
  • schema-types-lowcardinality - LowCardinality for <10K unique strings
  • schema-types-enum - Enum for finite value sets with validation
  • schema-types-avoid-nullable - Avoid Nullable; use DEFAULT instead
Schema Design - Partitioning (HIGH)
  • schema-partition-low-cardinality - Keep partition count 100-1,000
  • schema-partition-lifecycle - Use partitioning for data lifecycle, not queries
  • schema-partition-query-tradeoffs - Understand partition pruning trade-offs
  • schema-partition-start-without - Consider starting without partitioning
Schema Design - JSON (MEDIUM)
  • schema-json-when-to-use - JSON for dynamic schemas; typed columns for known
Query Optimization - JOINs (CRITICAL)
  • query-join-choose-algorithm - Select algorithm based on table sizes
  • query-join-use-any - ANY JOIN when only one match needed
  • query-join-filter-before - Filter tables before joining
  • query-join-consider-alternatives - Dictionaries/denormalization vs JOIN
  • query-join-null-handling - join_use_nulls=0 for default values
Query Optimization - Indices (HIGH)
  • query-index-skipping-indices - Skipping indices for non-ORDER BY filters
Query Optimization - Materialized Views (HIGH)
  • query-mv-incremental - Incremental MVs for real-time aggregations
  • query-mv-refreshable - Refreshable MVs for complex joins
Insert Strategy - Batching (CRITICAL)
  • insert-batch-size - Batch 10K-100K rows per INSERT
Insert Strategy - Async (HIGH)
  • insert-async-small-batches - Async inserts for high-frequency small batches
  • insert-format-native - Native format for best performance
Insert Strategy - Mutations (CRITICAL)
  • insert-mutation-avoid-update - ReplacingMergeTree instead of ALTER UPDATE
  • insert-mutation-avoid-delete - Lightweight DELETE or DROP PARTITION
Insert Strategy - Optimization (HIGH)
  • insert-optimize-avoid-final - Let background merges work
Agent Integration - Discovery (CRITICAL)
  • agent-discovery-schema - Always discover schema before querying
Agent Integration - Safety (CRITICAL)
  • agent-query-safety - LIMIT, timeouts, progressive exploration
Agent Integration - Connectivity + Formats (HIGH)
  • agent-connect-mcp - MCP + CLI setup, credential discovery, output format selection

When to Apply

This skill activates when you encounter:

  • AI agent connecting to ClickHouse (MCP, CLI, HTTP)

  • Agent workflow design for ClickHouse

  • Schema discovery or exploration requests

  • CREATE TABLE statements

  • ALTER TABLE modifications

  • ORDER BY or PRIMARY KEY discussions

  • Data type selection questions

  • Slow query troubleshooting

  • JOIN optimization requests

  • Data ingestion pipeline design

  • Update/delete strategy questions

  • ReplacingMergeTree or other specialized engine usage

  • Partitioning strategy decisions


Rule File Structure

Each rule file in rules/ contains:

  • YAML frontmatter: title, impact level, tags
  • Brief explanation: Why this rule matters
  • Incorrect example: Anti-pattern with explanation
  • Correct example: Best practice with explanation
  • Additional context: Trade-offs, when to apply, references

Full Compiled Document

For the complete guide with all rules expanded inline: AGENTS.md

Use AGENTS.md when you need to check multiple rules quickly without reading individual files.

1---
2name: clickhouse-best-practices
3description: MUST USE when reviewing ClickHouse schemas, queries, or configurations. Contains 31 rules that MUST be checked before providing recommendations. Always read relevant rule files and cite specific rules in responses.
4license: Apache-2.0
5metadata:
6 author: ClickHouse Inc
7 version: "0.4.0"
8---
9 
10# ClickHouse Best Practices
11 
12Comprehensive guidance for ClickHouse covering schema design, query optimization, data ingestion, and AI agent connectivity. Contains 31 rules across 4 main categories (schema, query, insert, agent), prioritized by impact.
13 
14> **Official docs:** [ClickHouse Best Practices](https://clickhouse.com/docs/best-practices)
15 
16## IMPORTANT: How to Apply This Skill
17 
18**Before answering ClickHouse questions, follow this priority order:**
19 
201. **Check for applicable rules** in the `rules/` directory
212. **If rules exist:** Apply them and cite them in your response using "Per `rule-name`..."
223. **If no rule exists:** Use the LLM's ClickHouse knowledge or search documentation
234. **If uncertain:** Use web search for current best practices
245. **Always cite your source:** rule name, "general ClickHouse guidance", or URL
25 
26**Why rules take priority:** ClickHouse has specific behaviors (columnar storage, sparse indexes, merge tree mechanics) where general database intuition can be misleading. The rules encode validated, ClickHouse-specific guidance.
27 
28---
29 
30## Agent Connectivity & Query Workflow
31 
32Before querying ClickHouse, agents must establish a connection and follow the discovery workflow:
33 
341. `rules/agent-connect-mcp.md` - Connection setup (MCP + CLI), credential discovery, output format selection
352. `rules/agent-discovery-schema.md` - **CRITICAL**: 7-step schema discovery workflow
363. `rules/agent-query-safety.md` - **CRITICAL**: LIMIT, timeouts, progressive exploration
37 
38**Every agent session should follow this sequence:**
39 
401. **Connect** — establish connection via MCP or CLI (see `agent-connect-mcp`)
412. **Discover** — databases → tables → columns + comments → sort keys → skip indexes → sample → EXPLAIN
423. **Plan** — use sort key and skip index knowledge to write efficient WHERE clauses
434. **Execute** — run queries with LIMIT and timeouts
445. **Recover** — on timeout/memory errors, narrow filters and retry (see `agent-query-safety`)
45 
46### Subagent architecture notes
47 
48If your system dispatches ClickHouse tasks to specialized subagents:
49- **Schema discovery + query execution**: any model — the steps are procedural
50- **EXPLAIN analysis + query optimization**: benefits from mid-tier reasoning
51- **Schema design review against all 28 rules**: benefits from mid-tier reasoning
52 
53---
54 
55## Review Procedures
56 
57### For Schema Reviews (CREATE TABLE, ALTER TABLE)
58 
59**Read these rule files in order:**
60 
611. `rules/schema-pk-plan-before-creation.md` - ORDER BY is immutable
622. `rules/schema-pk-cardinality-order.md` - Column ordering in keys
633. `rules/schema-pk-prioritize-filters.md` - Filter column inclusion
644. `rules/schema-types-native-types.md` - Proper type selection
655. `rules/schema-types-minimize-bitwidth.md` - Numeric type sizing
666. `rules/schema-types-lowcardinality.md` - LowCardinality usage
677. `rules/schema-types-avoid-nullable.md` - Nullable vs DEFAULT
688. `rules/schema-partition-low-cardinality.md` - Partition count limits
699. `rules/schema-partition-lifecycle.md` - Partitioning purpose
70 
71**Check for:**
72- [ ] PRIMARY KEY / ORDER BY column order (low-to-high cardinality)
73- [ ] Data types match actual data ranges
74- [ ] LowCardinality applied to appropriate string columns
75- [ ] Partition key cardinality bounded (100-1,000 values)
76- [ ] ReplacingMergeTree has version column if used
77 
78### For Query Reviews (SELECT, JOIN, aggregations)
79 
80**Read these rule files:**
81 
821. `rules/query-join-choose-algorithm.md` - Algorithm selection
832. `rules/query-join-filter-before.md` - Pre-join filtering
843. `rules/query-join-use-any.md` - ANY vs regular JOIN
854. `rules/query-index-skipping-indices.md` - Secondary index usage
865. `rules/schema-pk-filter-on-orderby.md` - Filter alignment with ORDER BY
87 
88**Check for:**
89- [ ] Filters use ORDER BY prefix columns
90- [ ] JOINs filter tables before joining (not after)
91- [ ] Correct JOIN algorithm for table sizes
92- [ ] Skipping indices for non-ORDER BY filter columns
93 
94### For Insert Strategy Reviews (data ingestion, updates, deletes)
95 
96**Read these rule files:**
97 
981. `rules/insert-batch-size.md` - Batch sizing requirements
992. `rules/insert-mutation-avoid-update.md` - UPDATE alternatives
1003. `rules/insert-mutation-avoid-delete.md` - DELETE alternatives
1014. `rules/insert-async-small-batches.md` - Async insert usage
1025. `rules/insert-optimize-avoid-final.md` - OPTIMIZE TABLE risks
103 
104**Check for:**
105- [ ] Batch size 10K-100K rows per INSERT
106- [ ] No ALTER TABLE UPDATE for frequent changes
107- [ ] ReplacingMergeTree or CollapsingMergeTree for update patterns
108- [ ] Async inserts enabled for high-frequency small batches
109 
110---
111 
112## Output Format
113 
114Structure your response as follows:
115 
116```
117## Rules Checked
118- `rule-name-1` - Compliant / Violation found
119- `rule-name-2` - Compliant / Violation found
120...
121 
122## Findings
123 
124### Violations
125- **`rule-name`**: Description of the issue
126 - Current: [what the code does]
127 - Required: [what it should do]
128 - Fix: [specific correction]
129 
130### Compliant
131- `rule-name`: Brief note on why it's correct
132 
133## Recommendations
134[Prioritized list of changes, citing rules]
135```
136 
137---
138 
139## Rule Categories by Priority
140 
141| Priority | Category | Impact | Prefix | Rule Count |
142|----------|----------|--------|--------|------------|
143| 1 | Primary Key Selection | CRITICAL | `schema-pk-` | 4 |
144| 2 | Data Type Selection | CRITICAL | `schema-types-` | 5 |
145| 3 | JOIN Optimization | CRITICAL | `query-join-` | 5 |
146| 4 | Insert Batching | CRITICAL | `insert-batch-` | 1 |
147| 5 | Mutation Avoidance | CRITICAL | `insert-mutation-` | 2 |
148| 6 | Partitioning Strategy | HIGH | `schema-partition-` | 4 |
149| 7 | Skipping Indices | HIGH | `query-index-` | 1 |
150| 8 | Materialized Views | HIGH | `query-mv-` | 2 |
151| 9 | Async Inserts | HIGH | `insert-async-` | 2 |
152| 10 | OPTIMIZE Avoidance | HIGH | `insert-optimize-` | 1 |
153| 11 | JSON Usage | MEDIUM | `schema-json-` | 1 |
154| 12 | Agent Schema Discovery | CRITICAL | `agent-discovery-` | 1 |
155| 13 | Agent Query Safety | CRITICAL | `agent-query-` | 1 |
156| 14 | Agent Connectivity + Formats | HIGH | `agent-connect-` | 1 |
157 
158---
159 
160## Quick Reference
161 
162### Schema Design - Primary Key (CRITICAL)
163 
164- `schema-pk-plan-before-creation` - Plan ORDER BY before table creation (immutable)
165- `schema-pk-cardinality-order` - Order columns low-to-high cardinality
166- `schema-pk-prioritize-filters` - Include frequently filtered columns
167- `schema-pk-filter-on-orderby` - Query filters must use ORDER BY prefix
168 
169### Schema Design - Data Types (CRITICAL)
170 
171- `schema-types-native-types` - Use native types, not String for everything
172- `schema-types-minimize-bitwidth` - Use smallest numeric type that fits
173- `schema-types-lowcardinality` - LowCardinality for <10K unique strings
174- `schema-types-enum` - Enum for finite value sets with validation
175- `schema-types-avoid-nullable` - Avoid Nullable; use DEFAULT instead
176 
177### Schema Design - Partitioning (HIGH)
178 
179- `schema-partition-low-cardinality` - Keep partition count 100-1,000
180- `schema-partition-lifecycle` - Use partitioning for data lifecycle, not queries
181- `schema-partition-query-tradeoffs` - Understand partition pruning trade-offs
182- `schema-partition-start-without` - Consider starting without partitioning
183 
184### Schema Design - JSON (MEDIUM)
185 
186- `schema-json-when-to-use` - JSON for dynamic schemas; typed columns for known
187 
188### Query Optimization - JOINs (CRITICAL)
189 
190- `query-join-choose-algorithm` - Select algorithm based on table sizes
191- `query-join-use-any` - ANY JOIN when only one match needed
192- `query-join-filter-before` - Filter tables before joining
193- `query-join-consider-alternatives` - Dictionaries/denormalization vs JOIN
194- `query-join-null-handling` - join_use_nulls=0 for default values
195 
196### Query Optimization - Indices (HIGH)
197 
198- `query-index-skipping-indices` - Skipping indices for non-ORDER BY filters
199 
200### Query Optimization - Materialized Views (HIGH)
201 
202- `query-mv-incremental` - Incremental MVs for real-time aggregations
203- `query-mv-refreshable` - Refreshable MVs for complex joins
204 
205### Insert Strategy - Batching (CRITICAL)
206 
207- `insert-batch-size` - Batch 10K-100K rows per INSERT
208 
209### Insert Strategy - Async (HIGH)
210 
211- `insert-async-small-batches` - Async inserts for high-frequency small batches
212- `insert-format-native` - Native format for best performance
213 
214### Insert Strategy - Mutations (CRITICAL)
215 
216- `insert-mutation-avoid-update` - ReplacingMergeTree instead of ALTER UPDATE
217- `insert-mutation-avoid-delete` - Lightweight DELETE or DROP PARTITION
218 
219### Insert Strategy - Optimization (HIGH)
220 
221- `insert-optimize-avoid-final` - Let background merges work
222 
223### Agent Integration - Discovery (CRITICAL)
224 
225- `agent-discovery-schema` - Always discover schema before querying
226 
227### Agent Integration - Safety (CRITICAL)
228 
229- `agent-query-safety` - LIMIT, timeouts, progressive exploration
230 
231### Agent Integration - Connectivity + Formats (HIGH)
232 
233- `agent-connect-mcp` - MCP + CLI setup, credential discovery, output format selection
234 
235---
236 
237## When to Apply
238 
239This skill activates when you encounter:
240 
241- AI agent connecting to ClickHouse (MCP, CLI, HTTP)
242- Agent workflow design for ClickHouse
243- Schema discovery or exploration requests
244 
245- `CREATE TABLE` statements
246- `ALTER TABLE` modifications
247- `ORDER BY` or `PRIMARY KEY` discussions
248- Data type selection questions
249- Slow query troubleshooting
250- JOIN optimization requests
251- Data ingestion pipeline design
252- Update/delete strategy questions
253- ReplacingMergeTree or other specialized engine usage
254- Partitioning strategy decisions
255 
256---
257 
258## Rule File Structure
259 
260Each rule file in `rules/` contains:
261 
262- **YAML frontmatter**: title, impact level, tags
263- **Brief explanation**: Why this rule matters
264- **Incorrect example**: Anti-pattern with explanation
265- **Correct example**: Best practice with explanation
266- **Additional context**: Trade-offs, when to apply, references
267 
268---
269 
270## Full Compiled Document
271 
272For the complete guide with all rules expanded inline: `AGENTS.md`
273 
274Use `AGENTS.md` when you need to check multiple rules quickly without reading individual files.
275 

Discussion