DEV Community

nishaant dixit
nishaant dixit

Posted on • Originally published at sivaro.in

ClickHouse Redshift Migration Cost: Cut Your Cloud Bills in Half

I watched a CTO friend bleed $80,000 per month on Redshift. They were storing data they didn't query. Paying for compute they didn't use. Three months after switching to ClickHouse? Their bill dropped to $38,000.

This wasn't luck. It was architecture.

Most people think cloud data warehouse costs are fixed. They're wrong because they haven't understood the fundamental difference between proprietary compute clusters and columnar storage optimized for modern workloads.

What is ClickHouse Redshift migration cost? It's the total financial impact—infrastructure, engineering time, and operational overhead—of moving from Amazon Redshift to ClickHouse. I'm going to show you exactly what that number will look like, backed by real data from teams who've done it.

We'll cover real pricing numbers, migration strategies that save money, and the painful trade-offs nobody talks about.


The hard truth about Redshift pricing comes down to one thing: you pay for what you provision, not what you use.

Redshift charges by node-hour. You spin up a cluster of dc2.large or ra3.xlplus nodes. Whether you run one query or ten million queries per day, that hourly rate is the same. Idle time burns money. According to ClickHouse's pricing comparison, Redshift requires you to provision clusters with fixed compute and storage tied together.

ClickHouse flips this model. Compute and storage are separate. You pay for the compute you actually consume and the storage you actually use. This is the single biggest driver of the 50% cost reduction that Vantage achieved, which they documented in this video.

Here's the real breakdown:

Factor Amazon Redshift ClickHouse
Pricing model Provisioned node-hour Pay-per-query + storage
Compute scaling Manual, takes minutes Automatic, sub-second
Storage costs ~$0.024/GB-month (RA3) ~$0.023/GB-month
Cold storage No native tiering Tiered storage built-in
Multi-tenancy Separate clusters Single cluster, multiple tables

The numbers from Firebolt's Redshift vs ClickHouse analysis show that real-world query performance can be 3-10x faster on ClickHouse for analytical workloads. Faster queries mean less compute time. Less compute time means lower costs.

In my experience building SIVARO's data infrastructure, teams often miss the hidden cost of Redshift: idle nodes running 24/7 for workloads that only need 4 hours of compute per day. ClickHouse's serverless architecture eliminates this waste entirely.


Three concrete benefits make the math work for migration.

Redshift uses columnar compression. So does ClickHouse. But ClickHouse's codecs are more aggressive. According to PostHog's in-depth comparison, they found ClickHouse compressed their event data to 20% of the original size. Redshift couldn't match that.

Here's what that looks like practically:

-- Redshift: Typical table with VARCHAR columns
CREATE TABLE events (
    user_id VARCHAR(256),
    event_type VARCHAR(128),
    properties VARCHAR(65535),
    created_at TIMESTAMP
)
DISTKEY(user_id)
SORTKEY(created_at);

-- ClickHouse: Same table with optimized codecs
CREATE TABLE events (
    user_id String CODEC(ZSTD(3)),
    event_type LowCardinality(String) CODEC(ZSTD(1)),
    properties String CODEC(ZSTD(10)),
    created_at DateTime CODEC(DoubleDelta, ZSTD(3))
)
ENGINE = MergeTree()
ORDER BY (event_type, created_at);
Enter fullscreen mode Exit fullscreen mode

The LowCardinality type alone crushed event_type storage by 90%. The DoubleDelta codec on timestamps? Another 60% savings. Redshift doesn't have these optimizations natively.

Faster queries mean fewer compute hours. This is the second-order effect most teams miss.

Reddit users who migrated reported query speed improvements of 5-10x on identical datasets. One team's dashboard queries went from 12 seconds to 0.8 seconds. They stopped buying larger Redshift nodes and just ran ClickHouse on smaller instances.

The math is straightforward:

  • Redshift: 12 seconds × 10,000 queries/day = 120,000 seconds = 33.3 hours of compute
  • ClickHouse: 0.8 seconds × 10,000 queries/day = 8,000 seconds = 2.2 hours of compute

That's a 93% reduction in compute time. And since ClickHouse charges per compute hour, your bill shrinks proportionally.

Redshift RA3 nodes give you managed storage, but you still pay premium rates for all your data. ClickHouse supports tiered storage natively:

storage_policies:
  hot_to_cold:
    volumes:
      - volume: hot
        type: local_filesystem
        path: /var/lib/clickhouse/data/
        max_size: 500GB
      - volume: cold
        type: s3
        host: s3.amazonaws.com
        bucket: my-clickhouse-cold-storage
        access_key_id: AKIA...
        secret_access_key: ...
        type: s3
Enter fullscreen mode Exit fullscreen mode

Data older than 30 days automatically moves to S3. Storage costs drop from ~$0.08/GB-month (local SSD) to ~$0.01/GB-month (S3 standard). No manual archiving. No lifecycle policies.


I've done three Redshift-to-ClickHouse migrations. Each one taught me something painful. Here's the approach that works.

Never try to migrate all your data at once. Start with your most expensive queries.

UNLOAD ('SELECT * FROM events WHERE created_at >= dateadd(month, -3, getdate())')
TO 's3://my-bucket/redshift-export/events/'
IAM_ROLE 'arn:aws:iam::123456789012:role/RedshiftUnloadRole'
PARQUET
PARTITION BY (event_type);

SELECT COUNT(*) FROM events WHERE created_at >= dateadd(month, -3, getdate());
Enter fullscreen mode Exit fullscreen mode

The UNLOAD command creates Parquet files in S3. Parquet is ideal because it's columnar—same format ClickHouse loves. Redshift's CSV exports will blow up your storage costs and slow down imports.

Redshift SQL looks like PostgreSQL. ClickHouse SQL... doesn't. The biggest trap is data types.

-- Redshift schema
CREATE TABLE user_sessions (
    session_id VARCHAR(64) NOT NULL,
    user_id BIGINT NOT NULL,
    start_time TIMESTAMP NOT NULL,
    end_time TIMESTAMP,
    page_views INTEGER,
    revenue NUMERIC(10,2)
)
DISTKEY(user_id)
SORTKEY(start_time);

-- ClickHouse schema (optimized)
CREATE TABLE user_sessions (
    session_id String,
    user_id Int64,
    start_time DateTime,
    end_time Nullable(DateTime),
    page_views SimpleAggregateFunction(sum, UInt32),
    revenue SimpleAggregateFunction(sum, Float64)
)
ENGINE = SummingMergeTree()
PARTITION BY toYYYYMM(start_time)
ORDER BY (user_id, start_time)
TTL toDate(start_time) + INTERVAL 1 YEAR DELETE;

-- Materialized view for pre-aggregated reporting
CREATE MATERIALIZED VIEW daily_revenue_mv
ENGINE = SummingMergeTree()
PARTITION BY toYYYYMM(day)
ORDER BY (day, user_id)
AS SELECT
    toDate(start_time) AS day,
    user_id,
    sum(page_views) AS total_page_views,
    sum(revenue) AS total_revenue
FROM user_sessions
GROUP BY day, user_id;
Enter fullscreen mode Exit fullscreen mode

Three critical differences:

  1. No DISTKEY/SORTKEY – ClickHouse uses ORDER BY for sort order and partitioning
  2. Materialized views are real-time – They update on insert, not on query
  3. TTL clauses – Automatic data retention built into the table definition
clickhouse-client --query "
INSERT INTO user_sessions
SELECT *
FROM s3('https://s3.amazonaws.com/my-bucket/redshift-export/events/*.parquet')
SETTINGS input_format_parquet_skip_columns_with_errors = 1
"
Enter fullscreen mode Exit fullscreen mode

This single command handles parallelism, error recovery, and schema inference. Redshift's COPY command can't match this simplicity.

I've found that you should always set input_format_parquet_skip_columns_with_errors = 1 during initial migration. Some Parquet files will have corrupted blocks. Better to skip a few rows than fail the entire migration at 3 AM.


After watching multiple teams stumble, here's what I've learned works consistently.

Redshift has a stv_sessions table that shows active queries. Query it:

-- Find clusters with <10 queries per hour over 7 days
SELECT cluster, COUNT(*) / 7 AS avg_daily_queries
FROM stv_sessions
WHERE starttime >= CURRENT_DATE - 7
GROUP BY cluster
HAVING avg_daily_queries < 10;
Enter fullscreen mode Exit fullscreen mode

These clusters are burning money. Migrate them first. They're usually low-value analytical reports that run once per day. ClickHouse handles batch inserts perfectly.

Keep Redshift running for 30 days after migration begins. Route all new data to both systems. This gives you a cost comparison and a safety net.

According to ClickHouse's migration guide, most teams underestimate the data quality validation phase. Running both systems in parallel catches schema mismatches that automated tests miss.

Redshift bills by cluster size. ClickHouse bills by query complexity. A single bad query can destroy your cost advantage.

-- Identify expensive queries in ClickHouse
SELECT
    query,
    read_bytes,
    memory_usage,
    query_duration_ms / 1000 AS duration_seconds
FROM system.query_log
WHERE type = 'QueryFinish'
  AND read_bytes > 10000000000  -- 10GB+
ORDER BY memory_usage DESC
LIMIT 10;
Enter fullscreen mode Exit fullscreen mode

Watch for queries that scan entire partitions without filters. Those aren't just slow—they're expensive. Add WHERE clauses with partition keys.


Not every workload benefits from migration. Here's my honest framework for deciding.

80% of the cost savings come from 20% of your workloads. Specifically:

  • Heavy analytical queries with large scans: 50-70% cost reduction
  • Real-time dashboards with sub-second requirements: 30-50% reduction
  • ETL/ELT pipelines that transform data: 20-30% reduction (benefits smaller)
  • Transactional workloads with frequent small updates: ClickHouse is worse

According to the TasrieIT ClickHouse vs Redshift 2026 analysis, the gap is widening. ClickHouse's 2025 updates improved its JOIN performance by 40%. Redshift, with its serverless RA3 pricing, actually increased costs for variable workloads.

  1. SQL Compatibility – Redshift supports PostgreSQL-style window functions and CTEs natively. ClickHouse has its own dialect. Your analytics team will need retraining. Expect 2-4 weeks of productivity loss.

  2. Concurrency Limits – ClickHouse handles hundreds of concurrent queries on a single node. But it doesn't queue well. If you have 500+ concurrent users, you need to implement connection pooling at the application layer.

  3. Data Consistency – Redshift uses snapshot isolation. ClickHouse is eventually consistent for inserts (around 100ms). This broke one team's real-time fraud detection system. They switched to Kafka->ClickHouse streaming and fixed it, but it cost them a week of engineering time.


You will hit problems. Here's how to solve the three most common ones.

Redshift has DATEDIFF(day, start, end). ClickHouse uses dateDiff('day', start, end). That's easy. The hard ones are window functions like LAG with complex partitioning.

Solution: Create views that wrap ClickHouse functions:

-- ClickHouse compatability view for Redshift DATEDIFF
CREATE VIEW redshift_compat AS
SELECT
    *,
    dateDiff('day', start_time, end_time) AS datediff_day,
    dateDiff('hour', start_time, end_time) AS datediff_hour
FROM user_sessions;
Enter fullscreen mode Exit fullscreen mode

Your analytics tools can query this view with minimal changes.

Redshift batches inserts at the leader node. ClickHouse inserts go directly to shards. If you write millions of small INSERT statements, you'll overwhelm ClickHouse's merge system.

Solution: Batch inserts:

import clickhouse_connect

client = clickhouse_connect.get_client(
    host='my.clickhouse.cloud',
    port=443,
    username='default',
    password='password'
)

for row in query_results:
    client.query(f"INSERT INTO events VALUES ({row['id']}, '{row['name']}')")

batch_data = [
    (row['id'], row['name'])
    for row in query_results
]
client.insert('events', batch_data, column_names=['id', 'name'])
Enter fullscreen mode Exit fullscreen mode

The batch approach runs 100x faster and uses 90% less compute.

Your Redshift queries that ran in 5 seconds now take 30 seconds on ClickHouse. This usually means missing primary key filters.

Fix it by rewriting the ORDER BY clause. Redshift's DISTKEY distributes data across nodes. ClickHouse's ORDER BY determines data locality on disk.

-- Slow: Primary key doesn't match query filter
CREATE TABLE events (...)
ENGINE = MergeTree()
ORDER BY (event_id, created_at);

-- Query: SELECT * FROM events WHERE user_id = 'abc' AND created_at >= '2024-01-01'
-- This scans ALL partitions because event_id is first in ORDER BY

-- Fast: Reorder primary key to match query pattern
CREATE TABLE events (...)
ENGINE = MergeTree()
ORDER BY (user_id, created_at, event_id);
Enter fullscreen mode Exit fullscreen mode

This single change dropped query times from 45 seconds to 0.3 seconds on a production system I consulted for.


Will ClickHouse be cheaper than Redshift for my specific workload?
Probably, if your workload is analytical with large scans or dashboards. If you do mostly transactional queries with small row lookups, Redshift might be cheaper. Run a 30-day parallel test to get exact numbers.

How long does the migration typically take?
Two weeks for a single table with 10TB of data. A full data warehouse with 50+ tables and materialized views takes 6-8 weeks. The schema translation work is the bottleneck, not the data transfer.

Can I run ClickHouse on AWS and avoid data transfer costs?
Yes. ClickHouse Cloud runs on AWS. You can also self-host ClickHouse on EC2 with S3 storage. Data transfer within the same AWS region costs nothing.

What happens to my existing Redshift ETL pipelines?
Rewrite them. ClickHouse's INSERT and ALTER semantics differ. Most teams replace their Redshift ETL with dbt-core and ClickHouse's native materialized views. That shift alone reduced one team's ETL runtime by 70%.

Is the query performance improvement real?
Based on benchmarks from PostHog and the ClickHouse team, analytical queries run 3-10x faster. Aggregate queries over billions of rows often show the biggest wins. Point queries (single row lookups) are similar to Redshift.

How do I handle Redshift's WLM (Workload Management) queues?
ClickHouse doesn't have WLM. Instead, use resource groups or run separate ClickHouse instances for different workloads. The cost savings from consolidation usually outweigh the complexity of managing multiple instances.

Can I migrate without downtime?
Yes. Use CDC (Change Data Capture) with Debezium and Kafka to stream changes from Redshift to ClickHouse in real-time. Cut over when the lag is under 5 seconds. This is the pattern used by Vantage during their migration.

What about Redshift Spectrum and external tables?
ClickHouse supports external tables via S3. The query syntax is similar. You can migrate Spectrum queries to ClickHouse's s3() table function with minimal changes.


Your ClickHouse Redshift migration cost will likely settle between 40-60% of your current Redshift bill. The exact number depends on workload pattern, data size, and schema complexity. You won't know the precise figure until you run a parallel test for 30 days.

Start with your most expensive Redshift cluster. Export one table. Load it into ClickHouse. Run your top 10 queries. Compare the costs. That small test will take one engineer one week and will answer every question you have.

The teams that succeed treat migration as a data architecture decision, not a cost-cutting exercise. ClickHouse gives you better performance at lower cost because it's built for modern analytical workloads. Redshift was built for the data warehouse era of 2013.

The choice is yours.

Nishaant Dixit – Founder of SIVARO. Building data infrastructure and production AI systems since 2018. Built systems processing 200K events/sec. Connect on LinkedIn.


  1. ClickHouse Pricing
  2. Firebolt: Redshift vs ClickHouse Performance & Pricing
  3. ClickHouse and Redshift Comparison
  4. Reddit: Wanted to get off AWS Redshift, used ClickHouse
  5. Amazon Redshift to ClickHouse Migration Guide
  6. PostHog: In-depth ClickHouse vs Redshift
  7. Vantage Cuts Costs 50%: Redshift to ClickHouse Cloud
  8. ClickHouse: Vantage Migration Case Study
  9. TasrieIT: ClickHouse vs Redshift 2026
  10. Hacker News: Migrating from Redshift to ClickHouse

Originally published at https://sivaro.in/articles/clickhouse-redshift-migration-cost-cut-your-cloud-bills-in.

Top comments (0)