executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
clickhouse-rate-limitsConfigure ClickHouse query concurrency, memory quotas, and connection limits. Use when hitting "too many simultaneous queries", managing concurrent users, or tuning server-side resource limits so an app never starves the cluster. Trigger with "clickhouse rate limit", "clickhouse concurrency", "clickhouse quota", "too many simultaneous queries", "clickhouse …
Independent GitHub snapshot · Automated classification · Original documentation governs
name: clickhouse-rate-limits description: | Configure ClickHouse query concurrency, memory quotas, and connection limits. Use when hitting "too many simultaneous queries", managing concurrent users, or tuning server-side resource limits so an app never starves the cluster. Trigger with "clickhouse rate limit", "clickhouse concurrency", "clickhouse quota", "too many simultaneous queries", "clickhouse connection limit". allowed-tools: Read, Write, Edit version: 1.7.0 license: MIT author: Jeremy Longshore jeremy@intentsolutions.io tags:
ClickHouse has no REST API rate limits like a SaaS product. Instead it enforces server-side concurrency limits, memory quotas, and per-user settings that control resource usage. This skill configures those server-side limits and pairs them with client-side controls so an application stays within them under load.
@clickhouse/client Node package for the client-side patterns.Work top-down: cap resources at the server, then make the client respect the cap.
The defaults you tune most often:
| Setting | Default | Controls |
|---|---|---|
max_concurrent_queries | 100 | Queries running simultaneously |
max_connections | 4096 | Max TCP/HTTP connections |
max_memory_usage | ~10GB | Per-query memory |
max_execution_time | 0 (unlimited) | Per-query timeout (seconds) |
ClickHouse Cloud's management API (not the query interface) is separately limited to 10 requests per 10 seconds. Full table in references/implementation.md.
Bind a quota and a settings profile to each application user:
CREATE SETTINGS PROFILE IF NOT EXISTS app_profile
SETTINGS
max_memory_usage = 5000000000, -- 5GB per query
max_execution_time = 30, -- 30s timeout
max_concurrent_queries_for_user = 10 -- 10 parallel queries
TO app_user;
The full quota (CREATE QUOTA … FOR INTERVAL 1 HOUR MAX …) plus verification
queries are in references/implementation.md.
Four client-side patterns keep the app inside the server limits — connection
pooling, an app-level concurrency queue (p-queue), retry-with-backoff on
TOO_MANY_SIMULTANEOUS_QUERIES, and insert buffering to avoid TOO_MANY_PARTS.
Each is a drop-in TypeScript snippet in
references/implementation.md, with the
concurrency queue as the smallest starting point:
import PQueue from 'p-queue';
const queryQueue = new PQueue({ concurrency: 5, timeout: 30_000, throwOnTimeout: true });
const rateLimitedQuery = <T>(sql: string) =>
queryQueue.add(async () => (await client.query({ query: sql, format: 'JSONEachRow' })).json<T>());
Watch live concurrency and confirm limits bind with the queries in
references/examples.md (system.processes,
system.metrics, system.query_log, SHOW QUOTAS).
Applying this skill produces:
| Error | Code | Solution |
|---|---|---|
TOO_MANY_SIMULTANEOUS_QUERIES | 202 | Reduce client concurrency or raise max_concurrent_queries; retry with backoff |
MEMORY_LIMIT_EXCEEDED | 241 | Lower max_threads, add query filters, reduce max_memory_usage scope |
TIMEOUT_EXCEEDED | 159 | Increase max_execution_time or optimize the query |
TOO_MANY_PARTS | 252 | Batch inserts via the insert buffer, wait for merges |
The retry wrapper in references/implementation.md treats codes 202, 159, and network errors as retryable.
Three worked end-to-end scenarios live in references/examples.md:
p-queue limiter.queryWithRetry absorbs code-202 bursts
with exponential backoff + jitter instead of returning 500s.TOO_MANY_PARTS — InsertBuffer batches
a firehose into a few large inserts.For security hardening (users, roles, TLS), see the clickhouse-security-basics
skill. For query-level performance work, see clickhouse-performance-tuning.