Request an exact quote
Data Warehouse migration path

From Amazon Redshift to ClickHouse

Moving analytics off provisioned Redshift to ClickHouse, UNLOAD-to-Parquet ingestion, rethinking sort/dist keys as ORDER BY, the SQL-dialect rewrite, and where Redshift still wins.

Effort
Medium
Est. timeline
~15 wks
ClickHouse model
Free OSS / Cloud
Open source
Yes
▶ Model your savings in the interactive calculator

Teams leave Amazon Redshift for ClickHouse when query cost and concurrency become the pain point, provisioned Redshift clusters (or RA3 nodes plus Spectrum) bill for capacity you hold whether or not you’re querying, and heavy dashboard/observability-style workloads get expensive. ClickHouse is a column-store built for exactly that: very fast aggregations over large tables, excellent compression, and the option to self-host or use ClickHouse Cloud. The catch is that it is not a drop-in Postgres-compatible warehouse the way Redshift is, the data model and SQL differ enough that this is a real migration, not a connection-string swap. Scope it as one.

The data-model shift: keys → ORDER BY

Redshift performance comes from sort keys and distribution keys across its nodes. ClickHouse’s equivalent lever is the table engine and its ORDER BY (sorting key) plus partitioning, usually on a MergeTree engine. The translation is conceptual, not mechanical:

  • A Redshift sort key → ClickHouse ORDER BY (the primary index that makes range scans fast).
  • A Redshift distribution key → there’s no exact analogue; for a single ClickHouse server it’s moot, and for a cluster you design sharding/replication explicitly.
  • Partitioning (e.g. by month) is set with PARTITION BY and matters for retention and pruning.

Get ORDER BY right for your common query predicates and ClickHouse will fly; get it wrong and you lose its biggest advantage. This is the single most important design decision in the migration.

Choosing the MergeTree engine

ORDER BY lives on a table engine, and the engine you pick encodes your write pattern. A plain MergeTree is the default for append-heavy fact and event tables, which is where most Redshift analytics volume lives. Reach for ReplacingMergeTree when you need last-write-wins upserts, since ClickHouse does not update rows in place cheaply, and for SummingMergeTree or AggregatingMergeTree when you want to maintain pre-aggregated rollups. Partitioning with PARTITION BY (commonly toYYYYMM on a date column) is for retention and dropping old data, not for query pruning, so keep partitions coarse and let the ORDER BY do the scan-skipping.

Moving the data

The reliable bulk path is via S3 and Parquet:

  1. UNLOAD Redshift tables to S3 as Parquet (columnar, compressed, typed).
  2. Ingest with ClickHouse’s s3() table function straight from the bucket, no intermediate ETL server required.
-- in Redshift
UNLOAD ('select * from events')
  TO 's3://bucket/events/' IAM_ROLE '…' FORMAT PARQUET;

-- in ClickHouse
INSERT INTO events
  SELECT * FROM s3('https://bucket.s3.amazonaws.com/events/*.parquet', Parquet);

For ongoing sync during a parallel-run period, repeat incrementally (by load date/partition) until cutover. UNLOAD writes one file per slice by default, which is fine: the s3() function reads a wildcard path and ingests the files in parallel. Landing the Parquet on S3 also leaves you a reusable staging layer, so a Trino or DuckDB reader could later query the same files without re-exporting from Redshift. Watch egress and request costs on very large unloads, and prefer bounded, restartable jobs per table or date range over one unbounded dump.

The SQL-dialect rewrite

Both speak SQL, but ClickHouse has its own functions and idioms. Expect to touch:

  • Window and date/JSON functions, names and semantics differ from Redshift’s Postgres-flavoured set.
  • Data types, map Redshift types to ClickHouse (VARCHARString, careful with Nullable, use LowCardinality(String) for low-distinct columns to win big on compression).
  • DISTINCT/aggregation patterns, ClickHouse has specialised functions (uniqCombined, -If/-Merge combinators) that often replace heavier Redshift SQL.

Run the rewritten queries against ClickHouse and diff results versus Redshift on the same data before trusting them.

Validate, then cut over

  • Dual-run the BI/dashboard layer against both warehouses and compare row counts, key aggregates, and latency.
  • Re-point ingestion (your ETL/ELT or streaming loaders) to ClickHouse only after read parity is confirmed.
  • Watch resource use, ClickHouse trades RAM for speed; size memory for your largest aggregations and set sensible max_memory_usage limits.

The cost comparison is the reason you are here, so measure it during the dual-run rather than estimating up front. Provisioned Redshift bills for capacity you hold whether or not you query it, plus egress and concurrency charges, while ClickHouse shifts spend to the compute, storage, and engineering you run yourself (or to ClickHouse Cloud). Put the removed node-hour spend against the ClickHouse infrastructure cost for the same migrated queries, and treat the delta as illustrative until the parallel run has held under realistic concurrency for a couple of weeks.

Where Redshift still wins, don’t over-migrate

Weigh the fit carefully. Redshift’s tight AWS integration (Spectrum over S3, Redshift ML, IAM, zero-ops RA3, Data Sharing) and its Postgres compatibility are real advantages for AWS-centric analytics and complex transactional-style warehousing. ClickHouse shines for high-volume, append-heavy, aggregation-first workloads (events, logs, metrics, product analytics). If your workload is the latter, the cost win is large; if it’s broad enterprise BI deeply wired into AWS, keep Redshift for that and move only the heavy aggregation workloads.

The realistic takeaway

Redshift → ClickHouse can sharply cut analytics cost for aggregation-heavy workloads, but it’s a real re-platform: redesign sort/dist keys as ORDER BY/partitioning, move data via UNLOAD-to-Parquet and the s3() function, and rewrite the SQL dialect with results diffed against Redshift. Dual-run before cutover, and migrate the workloads that fit ClickHouse rather than the whole estate. Model the removed provisioned-capacity spend against ClickHouse infra (or Cloud) in the calculator above.

Tooling & automation for this path

UNLOAD Redshift tables to S3 as Parquet and ingest with ClickHouse's s3() table function; convert sort/dist keys to ORDER BY and partitioning; rewrite dialect (window/JSON functions); dual-run queries to validate results and performance.

Primary references: official ClickHouse documentation ↗ and the Amazon Redshift documentation ↗ , always verify version-specific behavior against them before you migrate.

Frequently asked questions

How do Redshift sort keys and distribution keys become ClickHouse ORDER BY?

A Redshift sort key maps to the ClickHouse ORDER BY, the primary index that makes range scans fast, so lead the ORDER BY tuple with the columns you filter on most. A distribution key has no direct analogue: on a single ClickHouse server it is moot, and on a cluster you replace it with an explicit sharding and replication design. Getting the ORDER BY right for your query predicates is the single most important decision in the migration.

Does the ClickHouse s3() function read Redshift UNLOAD output directly?

Yes. UNLOAD your Redshift tables to S3 in Parquet, then INSERT INTO a MergeTree table by SELECTing from the s3() table function pointed at the bucket path. No intermediate ETL server is required. For a parallel-run window, repeat the UNLOAD and ingest incrementally by load date or partition until cutover.

What Redshift-specific SQL breaks on ClickHouse?

Redshift's Postgres-flavoured window, date, and JSON functions differ from ClickHouse names and semantics, and data types need mapping (VARCHAR to String, careful Nullable use, LowCardinality(String) for low-distinct columns). ClickHouse also offers specialised aggregation functions like uniqCombined and the -If and -Merge combinators that often replace heavier Redshift SQL. Diff the rewritten queries against Redshift on the same data before trusting them.

When should I keep Redshift instead of moving to ClickHouse?

Keep Redshift when your analytics are deeply wired into AWS, using Spectrum over S3, Redshift ML, IAM, or Data Sharing, or when you rely on its Postgres compatibility and zero-ops RA3 nodes for broad enterprise BI. ClickHouse wins on high-volume, append-heavy, aggregation-first workloads. If your estate is the former, move only the heavy aggregation workloads and leave the rest on Redshift.

Model your 3-year cost

Pre-filled for Amazon Redshift → ClickHouse; adjust every figure with your own numbers. Estimates are illustrative, not vendor quotes, see our methodology.

Sized at 200 TB managed, cost is computed on this.
Stay on Amazon Redshift (3yr)
$600,000
Move to ClickHouse (3yr + migration)
$180,000
Projected savings
$420,000 (70%)
Payback period
4.5 mo
Build a decision report from these numbers:

Illustrative, editable figures, not vendor pricing (defaults reviewed May 2026).

Request a vendor-accurate ClickHouse quote

A guided builder that turns your estimates into a requirements report (RFQ) you can send to a vendor, partner, or distributor for a binding quote, then feed the real prices back into the calculator above. How our estimates work.

  1. 1Size it
  2. 2Requirements
  3. 3Your details
  4. 4Channels & export

How big is your Amazon Redshift estate?

Sum your usable array capacity, or the total front-end data you protect. Not sure? Enter rough numbers, the distributor confirms exact counts later.

200 TB managed
Default mid-size assumption (200 TB managed)