Amazon Redshift Architecture Explained: Nodes, Slices & MPP
Amazon Redshift is built differently from most databases. It uses a distributed architecture — leader node, compute nodes, and slices — designed specifically for analytical queries across billions of rows. Once you understand how these pieces fit together, table design decisions like picking a distribution key or sort key stop feeling arbitrary and start making obvious sense.
Simple explanation
Think of a Redshift cluster like a large restaurant kitchen. The leader node is the head chef: it takes your order (SQL query), figures out how to prepare each component, and assigns tasks to the line cooks. The compute nodes are those line cooks, each preparing their portion in parallel. The slices are the individual workstations at each line cook’s bench. More workstations means more things cooking at once, which means the full meal arrives faster.
When you run a query, the leader node parses the SQL, builds an execution plan, and sends compiled work to every compute node simultaneously. Each node scans only the columns and rows it needs because Redshift stores data column by column, not row by row. Partial results flow back to the leader node, which assembles the final answer and returns it to your client.
This parallel execution model is called MPP (massively parallel processing). It is the reason Redshift can scan 100 billion rows in seconds on a dataset that would take hours on a single-node database. See the Amazon Redshift Overview for context on when to use Redshift at all before going deeper on architecture.
What Redshift architecture actually includes
A provisioned Redshift cluster has four structural layers:
- Leader node — single entry point for SQL connections and the query coordinator
- Compute nodes — store all user data and execute query work in parallel
- Slices — subdivisions of each compute node; the fundamental unit of parallelism
- MPP execution model — compiled query code runs across all slices simultaneously
Redshift Serverless uses the same columnar MPP engine but abstracts away nodes and slices. You configure Redshift Processing Units (RPUs) instead of choosing node types. The table design concepts (distribution styles, sort keys, columnar storage) still apply. See the Provisioned vs Serverless section below.
How Redshift executes a query
Here is the full sequence from the moment you press enter to the moment results appear:
- Your SQL client connects to the leader node and sends the query.
- The leader node parses the SQL, checks permissions, and validates syntax.
- It builds an execution plan using table statistics and metadata. Prepend
EXPLAINto any query to inspect this plan before running it. - The leader node compiles the plan into C++ code and distributes it to every compute node simultaneously.
- Each compute node executes against its local slices. Columnar storage means only the referenced columns are read from disk — irrelevant columns are skipped entirely.
- If a join requires data held on a different slice or node, Redshift performs a redistribute step: a network shuffle that moves rows to where they are needed. This is the most expensive part of many queries. Matching distribution keys on join columns eliminates it.
- Each compute node returns its partial result to the leader node.
- The leader node applies any final
ORDER BY,LIMIT, or top-level aggregation, then returns the full result to your client.
For practical examples of running queries and reading EXPLAIN output, see Running Your First Redshift Query.
Leader node
The leader node does the following:
- Parses incoming SQL and checks for syntax errors
- Builds an optimised execution plan using table statistics
- Distributes compiled query code to compute nodes
- Aggregates partial results into a final result set
- Manages cluster metadata: table definitions, column statistics, user permissions
The leader node does not store user data, does not scan tables, and does not participate in data-heavy query work. It is a pure coordinator. AWS does not charge extra for the leader node; it is included in the cluster price.
If your query is slow, the bottleneck is almost never the leader node. It is usually a redistribute step, data skew, or a missing sort key on the compute side. The Redshift Performance Optimisation guide covers how to diagnose each of these with EXPLAIN and SVV_TABLE_INFO.
Compute nodes and slices
Compute nodes are where your data physically lives and where query execution happens. Each compute node is subdivided into slices. A slice has its own dedicated CPU threads, memory allocation, and storage. Data is distributed across all slices at load time, and every slice processes its portion of every query in parallel.
The number of slices per node is fixed by the node type:
- dc2.large: 2 slices per node
- dc2.8xlarge: 16 slices per node
- ra3.xlplus: 4 slices per node
- ra3.4xlarge: 8 slices per node
- ra3.16xlarge: 16 slices per node
A 4-node dc2.large cluster has 8 total slices. When loading data, Redshift distributes rows across all 8 slices. When running a query, all 8 slices work in parallel. Adding more nodes adds more slices, which adds more parallelism.
Skew happens when some slices hold significantly more data than others. One overloaded slice does the lion’s share of work while the rest sit idle. The whole query runs only as fast as the slowest slice. Distribution key selection is the primary way to prevent it.
Columnar storage and why OLAP is different from OLTP
Row-based databases like RDS store each full row contiguously on disk. Running
SELECT SUM(amount) FROM orders forces the engine to read all 50 columns of
every row, including the 47 columns the query never touches.
Redshift stores each column separately. Every value in the amount column
sits together on disk. That same query reads only the amount data. If a
table has 50 columns and your query uses 3, you read roughly 6% of the I/O a row-store
would require.
Columnar layout also enables far higher compression ratios. Values in the same column share a data type and are often similar in value (all prices, all dates, all status codes). Compression algorithms, which Redshift applies automatically at load time, achieve much better results on homogeneous data than on mixed row data.
This is the architectural reason Redshift exists as a separate service from RDS. It is not a faster version of MySQL. It is a different design built for a different workload. See Data Warehouses vs Data Lakes for more context on where Redshift fits in the broader data landscape.
| Property | Row-store (RDS, MySQL) | Columnar (Redshift) |
|---|---|---|
| Data layout on disk | All columns of one row together | All values of one column together |
| Best query pattern | Single-row reads and writes (OLTP) | Aggregations across many rows (OLAP) |
| Columns read per query | All columns, even unused ones | Only referenced columns |
| Compression efficiency | Lower (mixed types per block) | Higher (same type per block) |
| INSERT/UPDATE speed | Fast | Slow — Redshift is bulk-load optimised |
Distribution styles
When Redshift loads data, it must decide which slice receives each row. This is the table’s distribution style. The wrong choice creates skew or forces expensive data movement during joins.
EVEN distribution
Rows are distributed across slices in round-robin order, regardless of content. Every slice ends up with roughly the same number of rows. Use EVEN for tables that are rarely joined to other large tables.
KEY distribution
You designate one column as the distribution key (DISTKEY). Rows with the same DISTKEY value land on the same slice. When you join two tables on matching DISTKEY columns, Redshift runs that join locally on each slice with no network shuffle and no redistribute step.
Choose a column that appears in frequent joins and has high cardinality (many
distinct values). A good example: customer_id or order_id.
A bad example: status (values like ‘active’ and ‘inactive’ send most of your
rows to just two slices). For further guidance, see
Redshift Performance Optimisation.
ALL distribution
A full copy of the table is stored on every compute node. Joins never need to shuffle data. Only practical for small dimension tables (a few million rows at most). Using ALL on a large table multiplies your storage cost by the number of compute nodes and significantly slows data loads.
AUTO distribution
Redshift starts with ALL distribution for small tables, then automatically switches to EVEN as the table grows. This is the recommended default for most tables. Let Redshift decide unless you have a clear reason to override it.
Run SELECT tablename, diststyle, skew_rows FROM SVV_TABLE_INFO; to see
the distribution style and skew for every table. A skew_rows value above 1.0
means data is not spreading evenly across slices and your DISTKEY likely needs revisiting.
Sort keys
Sort keys control the physical order of rows within each slice. When a query filters
with WHERE order_date BETWEEN ‘2025-01-01’ AND ‘2025-03-31’, Redshift
checks the zone map, a per-block min/max index, to determine whether
each 1 MB block of data contains any rows in the date range. Blocks outside the range
are skipped without touching disk. This is called zone map pruning.
Without a sort key on order_date, rows are stored in arbitrary order.
Redshift cannot skip any blocks and scans the entire table for every date-filtered query.
Imagine your data is stored in 1,000 filing cabinets. Each cabinet has a label showing
the earliest and latest date inside it. A sort key on order_date means
Redshift only opens the cabinets whose date ranges overlap with your filter. Without a
sort key, every cabinet gets opened regardless.
Match the sort key to your most common filter column. If most queries filter by date,
order_date is the right sort key. If most queries filter by region, use
region. For a full treatment of compound vs interleaved sort keys, see the
sort keys guide.
Provisioned Redshift vs Redshift Serverless
Provisioned Redshift gives you explicit control: you choose node types, node counts, and manage the cluster. The node/slice model described throughout this page is fully visible to you. You tune distribution styles and sort keys knowing exactly how many slices your data will be spread across.
Redshift Serverless removes that infrastructure layer. You configure RPU (Redshift Processing Unit) capacity instead of nodes. AWS allocates compute automatically and scales to zero when idle. You do not choose node types or count slices.
Redshift Serverless uses the same columnar MPP architecture internally. Distribution styles and sort keys still apply to your table design and still affect query performance. The architectural concepts on this page remain relevant; you just do not interact with the node/slice layer directly.
| Property | Provisioned | Serverless |
|---|---|---|
| Infrastructure visible to you | Yes — nodes, slices, node types | No — AWS manages automatically |
| Scales to zero | No | Yes |
| Distribution / sort keys apply | Yes | Yes |
| Billed by | Node-hours | RPU-seconds consumed |
| Best for | Steady, predictable workloads | Intermittent or unpredictable workloads |
For pricing differences between the two models, see Redshift Pricing Explained.
Redshift vs RDS architecture
The most common confusion newcomers have is treating Redshift like a faster version of RDS. It is not. They are built for different purposes at the architecture level.
| Property | Amazon RDS | Amazon Redshift |
|---|---|---|
| Storage model | Row-based | Columnar |
| Workload type | OLTP — many small reads/writes | OLAP — large scans and aggregations |
| INSERT/UPDATE speed | Fast | Slow — use COPY for bulk loads |
| Query parallelism | Single node (mostly) | Distributed across many slices |
| Table design levers | Indexes, foreign keys | Distribution keys, sort keys |
The reason Redshift exists as a separate service is that columnar storage and MPP execution are fundamentally incompatible with the transactional consistency guarantees that make RDS fast for OLTP. You use RDS for your application database and Redshift for analytics on top of that data. For a deeper look at how data moves between the two, see ETL vs ELT and AWS Glue Overview.
When to use this knowledge
This architecture page is not abstract background. It directly informs practical decisions:
- Choosing DISTKEY and SORTKEY: match DISTKEY to join columns, match SORTKEY to filter columns.
- Debugging slow joins: run
EXPLAINand look for a redistribute step. If it is present, your tables do not share a distribution key on the join column. - Understanding skew: it comes from a low-cardinality DISTKEY sending most rows to the same slice.
- Understanding why Redshift behaves differently from RDS: it does not have row-level locks, it is slow at single-row inserts, and VACUUM must be run manually to reclaim space from deleted rows.
- Making sense of query costs: network shuffles and full-table scans are expensive. Architecture decisions either eliminate them or guarantee them.
- Loading data efficiently: the Loading Data into Redshift guide explains why the COPY command (which loads all slices in parallel) is dramatically faster than single-row INSERT statements.
Common mistakes
Low-cardinality DISTKEY. Choosing a column like
statusorcountryas your distribution key sends most rows to a small number of slices. Queries run at the speed of the slowest, most overloaded slice. Usecustomer_id,order_id, or another high-cardinality column that spreads rows evenly.Ignoring skew. You can have a high-cardinality DISTKEY that still skews badly if your data is not uniformly distributed. Check
skew_rowsinSVV_TABLE_INFOregularly, especially after large data loads.Using ALL distribution on large tables. ALL distribution stores a full copy on every node. On a 100M-row table with 8 nodes, you are storing 800M rows worth of data. This is only sensible for small dimension tables that are joined very frequently.
Treating Redshift like an OLTP database. Single-row INSERT statements are slow. No row-level locking means concurrent writes behave differently than in Postgres or MySQL. Redshift is designed for bulk loading via COPY and bulk reading via SELECT, not for application-level transactional writes.
Not understanding the redistribute step. If you join two large tables with different distribution keys, Redshift must broadcast or redistribute one of them across the network before the join can execute. This can turn a 5-second query into a 5-minute query. Always run
EXPLAINbefore optimising a slow join.Assuming Serverless means architecture no longer matters. Redshift Serverless abstracts infrastructure, not table design. A table with a low-cardinality DISTKEY still skews. A table with no SORTKEY still triggers full scans. The columnar MPP rules still apply.
Summary
- A provisioned Redshift cluster has a leader node (coordinator) and compute nodes (data and execution)
- Each compute node is divided into slices, the fundamental unit of parallel execution
- The leader node never touches user data; it plans, coordinates, and assembles results
- Columnar storage means only referenced columns are read from disk, dramatically reducing I/O vs row-based databases
- Distribution styles (EVEN, KEY, ALL, AUTO) control how rows are spread across slices at load time
- KEY distribution enables local joins when join columns match the distribution key, eliminating the expensive redistribute step
- Sort keys enable zone map pruning; blocks outside the filter range are skipped without reading disk
- Redshift Serverless uses the same engine; distribution and sort key choices still affect performance
Frequently asked questions
What is the difference between the leader node and compute nodes in Redshift?
The leader node is the coordinator. It receives your SQL, builds a query plan, sends compiled work to the compute nodes, then assembles the final result. Compute nodes are where data lives and where queries actually run. You connect to the leader node and you never talk directly to a compute node.
What is a slice in Redshift?
A slice is a subdivision of a compute node. Each node is split into a fixed number of slices based on the node type. Data is distributed across all slices at load time, and each slice processes its share of every query in parallel. A 4-node dc2.large cluster has 8 slices total. More slices means more parallelism, which generally means faster queries on large datasets.
What is a distribution key in Redshift?
A distribution key is a column that controls which slice a row lands on. Rows with the same DISTKEY value go to the same slice. When you join two large tables on their shared distribution key, Redshift can run that join locally on each slice without moving data across the network, eliminating the expensive redistribute step.
Why do joins get slow in Redshift?
When two tables being joined have different distribution keys, Redshift must physically move rows from one slice to another — called a redistribute step. This network shuffle is the most common cause of slow join performance. Choosing the same distribution key on frequently-joined columns eliminates the shuffle. You can see whether a redistribute step is happening by running EXPLAIN before your query.
Does Redshift Serverless still use the same architectural concepts?
Redshift Serverless runs on the same columnar MPP engine under the hood. The difference is that you do not choose or manage nodes, slices, or node types — AWS handles that automatically. Concepts like distribution styles and sort keys still apply to your table design; you just don't think about the physical infrastructure they run on.