$ lexprog.com

// notes from an old coder -- php, databases, and the occasional rant

[October 29, 2024] ClickHouse

ClickHouse vs TimescaleDB for Time Series

ClickHouse vs TimescaleDB: Tips & Tricks

────────────────────────────────────────────────────────

ClickHouse vs TimescaleDB: Tips & Tricks

Tip: ClickHouse for Pure Analytics

  • Faster aggregations (100M rows in ~0.5s)
  • Better compression
  • Column-oriented by design
  • Built-in distributed support

Gotcha: TimescaleDB is PostgreSQL

TimescaleDB is a PostgreSQL extension. You get all PostgreSQL features (joins, transactions, extensions) with time-series optimization.

Tip: When to Choose ClickHouse

  • Pure analytics workload
  • Massive data volumes (billions+ rows)
  • Need sub-second queries on huge datasets
  • Team comfortable with SQL-like syntax

Gotcha: TimescaleDB Performance

TimescaleDB: 100M rows aggregation in ~2-5s. Slower than ClickHouse but still very fast for most use cases.

Tip: When to Choose TimescaleDB

  • Already using PostgreSQL
  • Need complex joins with other tables
  • ACID transaction requirements
  • Smaller data volumes
  • Team knows PostgreSQL

Gotcha: Data Migration Between Them

Moving from TimescaleDB to ClickHouse (or vice versa) requires data transformation. Plan your architecture upfront.

Tip: Hybrid Approach

Use TimescaleDB for operational time-series data (recent, frequently queried) and ClickHouse for historical analytics.

Gotcha: ClickHouse Doesn't Do Transactions

If you need ACID compliance for time-series data, TimescaleDB is the better choice.

Tip: Both Support Continuous Aggregations

  • ClickHouse: Materialized Views
  • TimescaleDB: Continuous Aggregates

Both pre-compute aggregations for fast queries.

Tip: Order of Columns in ORDER BY Matters Massively

ClickHouse's primary key is defined by ORDER BY. Put high-cardinality columns first for better data skipping. ORDER BY (timestamp, user_id) is very different from ORDER BY (user_id, timestamp) in query performance.

Tip: Use LowCardinality for Enum-Like Strings

Strings like status, country, browser benefit from LowCardinality(String) — it's stored as a dictionary internally, reducing storage 10x and speeding up scans.

Gotcha: Mutations Are Heavy

ALTER TABLE ... UPDATE and DELETE in ClickHouse create new parts instead of modifying in place. A single mutation on a large table can take hours and block merges. Design for append-only from day one.

Senior Insight

The ClickHouse vs TimescaleDB decision depends on your workload. ClickHouse excels at analytics on large datasets with columnar compression. TimescaleDB is better for time-series with frequent single-row inserts and update-heavy workloads. I've benchmarked both: ClickHouse stored the same dataset at 1/5 the size and queried it 10x faster for aggregates. But TimescaleDB handled point lookups and UPSERTS better. Choose based on your query patterns, not hype.

Source: ClickHouse Blog (https://clickhouse.com/blog), Altinity Blog (https://altinity.com/blog), Altinity Knowledge Base (https://kb.altinity.com/)

────────────────────────────────────────────────────────
<-- back to posts