Data Warehouse vs Data Lake in AWS: Redshift, S3 and Athena Explained
A data lake stores everything cheaply. A data warehouse queries it fast. Most teams on AWS end up using both. The question is which data goes where, and when.
Quick answer
Use Amazon S3 + Athena when you want to store raw or semi-structured data cheaply and query it occasionally without managing infrastructure. Use Amazon Redshift when analysts or BI tools run frequent structured SQL queries and need consistent, fast responses. Use both (the lakehouse pattern) when you need cheap long-term storage and fast querying from the same data.
Simple explanation
A data warehouse is like a well-organized filing cabinet. Everything is labeled, sorted, and ready to retrieve in seconds. Adding a new document means deciding exactly which drawer and folder it belongs in before you file it.
A data lake is like a storage unit. You throw everything in — boxes, bags, loose papers — without sorting first. It is cheap and flexible, but finding something specific takes more effort.
The lakehouse is the same storage unit, but with labeling, shelving, and a catalogue added on top. You can retrieve things quickly when you need them without losing the flexibility of keeping everything.
In AWS terms: the storage unit is Amazon S3. The catalogue and query layer on top is AWS Glue and Athena. The filing cabinet is Amazon Redshift.
Data warehouse vs data lake at a glance
| Property | Data Warehouse (Redshift) | Data Lake (S3 + Athena) |
|---|---|---|
| Schema | Schema-on-write: defined before loading | Schema-on-read: defined at query time |
| Data formats | Structured tables only | Any format: JSON, CSV, Parquet, ORC, images |
| Storage cost | Higher: managed storage priced per node/hour | Lower: S3 Standard ~$23/TB/month |
| Query performance | Fast and consistent: optimized for concurrency | Variable: depends on file format and partitioning |
| Concurrency | High: built for many simultaneous users | Limited: depends on Athena service quotas |
| Query cost model | Per cluster-hour (fixed, whether querying or not) | Per byte scanned ($5/TB scanned) |
| Maintenance | Cluster sizing, VACUUM, maintenance windows | Minimal: S3 and Athena are fully managed |
| Data quality | Enforced by schema and constraints | Depends on data producer discipline |
| Best for | BI reporting, dashboards, structured analytics | Exploration, ML, raw storage, infrequent queries |
The core difference is when you define structure. Warehouses require structure upfront (schema-on-write). Lakes let you skip that and figure it out later (schema-on-read). Neither is universally better. Each fits a different workflow.
What a data warehouse is in AWS
A data warehouse is a database designed for analytical SQL queries across large amounts of structured data. You load clean, transformed data with a defined schema. This is schema-on-write: the structure is fixed before data enters.
In AWS, that service is Amazon Redshift. Redshift stores data in columnar format distributed across managed compute nodes. Aggregate queries (SUM, COUNT, GROUP BY across millions of rows) are very fast because Redshift only reads the columns relevant to your query, not entire rows.
Redshift is the right choice when:
- Business analysts and BI tools (Tableau, QuickSight, Looker) run frequent structured queries
- Dashboards and reports must load in seconds under concurrent load
- Data quality and schema consistency are critical
- You have a stable schema that does not change week to week
To understand how Redshift distributes data and optimizes queries internally, see the Redshift architecture guide. For cost planning, the Redshift pricing guide covers node types, reserved pricing, and Serverless.
What a data lake is in AWS
A data lake stores data in its raw or lightly processed state in Amazon S3. There is no predefined schema required when you write the data. You decide how to interpret it at query time. This is schema-on-read.
Because S3 storage is cheap (around $23/TB/month for Standard), you can afford to keep everything: raw JSON API responses, CSV exports, Parquet files, application logs, and more. Nothing has to be discarded because it does not fit a schema yet.
Athena is the query engine that sits on top. It runs standard SQL on files in S3 without you provisioning or managing a server. You point Athena at an S3 path and a table definition in the Glue Data Catalog, and Athena reads and queries the files directly.
A data lake is the right choice when:
- Data formats vary or change frequently: JSON APIs, nested structures, semi-structured logs
- You are doing exploratory analysis or building machine learning features from raw data
- Multiple teams need different views of the same underlying data without copying it
- You want to store data before you fully know how it will be used
Athena charges $5 per TB scanned. If your S3 data is unpartitioned and stored as uncompressed JSON, a single large query can get expensive fast. Always partition by date or a high-cardinality key, and convert to Parquet or ORC format. This alone can cut Athena costs by 70-90%.
For a deeper look at how to organize a data lake with raw, processed, and curated zones, see the data lake architectures guide.
How it works in AWS: the typical data flow
Most AWS data platforms follow a layered flow from raw ingestion to structured analytics. Here is what that looks like in practice:
- Raw data lands in S3. Application logs, database exports, and API responses are written to an S3 raw zone, often as JSON or CSV. Nothing is transformed yet.
- Glue crawlers catalog the data. AWS Glue scans the S3 prefix and registers table definitions in the Glue Data Catalog, making the raw files queryable by Athena immediately.
- Athena queries raw or processed data. Data scientists and analysts run exploratory SQL on S3 data via Athena without provisioning anything. Queries on Parquet files with date-based partitions are fast and cheap.
- Glue ETL jobs transform and promote data. A Glue ETL job reads from the raw zone, cleans and reshapes the data, and writes curated Parquet files to a processed S3 zone or loads them directly into Redshift.
- Curated data loads into Redshift. The most frequently queried, structured data is loaded into Redshift via the COPY command (covered in the loading data into Redshift guide). BI tools connect to Redshift for dashboards and reporting.
- Redshift Spectrum bridges both worlds. For historical or infrequently accessed data still in S3, Redshift Spectrum lets you query it from inside Redshift with standard SQL, joining it against local Redshift tables in the same query.
Raw ingestion Processing Querying
| | |
S3 (raw) --> Glue ETL --> S3 (processed) --> Athena
\ (exploration, ML)
--> Redshift COPY --> Redshift
(BI, dashboards)
^
Redshift Spectrum
(S3 data queried from
inside Redshift)Apache Iceberg is worth knowing at this stage. Iceberg is an open table format that adds ACID transactions, schema evolution, and time travel (querying data as it looked at a past timestamp) to S3-backed tables. Both Athena and Redshift Spectrum support Iceberg natively, making it the standard for lakehouse implementations.
For the full picture of how batch and streaming pipelines connect these layers, see designing data pipelines in AWS.
When to use a data warehouse
Start with or move to Redshift when:
- You have regular, concurrent users (analysts, BI tools) querying structured data throughout the day
- Dashboards are timing out or returning inconsistent results under load from Athena
- You need sub-second query responses on aggregated data
- Data governance requires enforced schemas and type constraints
- You are running hundreds of queries per day and Athena per-scan costs are adding up
Load only the data that needs fast, frequent access into Redshift. Historical raw data that is rarely queried belongs in S3, not in expensive managed storage. For tuning Redshift once it is set up, see the Redshift performance optimization guide.
When to use a data lake
Start with or stay with S3 + Athena when:
- You are a small team or early-stage product with low query volume
- Data formats change frequently or are not yet well-defined
- You want to store raw data for future use cases you have not defined yet
- Queries are infrequent: a few per day at most
- You need to support data science or ML workflows that process raw or semi-structured data
- You want to minimize operational overhead with no clusters to size or maintain
Athena query costs drop dramatically when you store data in columnar Parquet or ORC format and partition it by date or a relevant key. See the guide on S3 cost optimization for storage-side savings.
When to use both: the lakehouse pattern
The lakehouse is not a third option. It is the default for most mature data platforms. S3 is the single storage layer. Athena and Redshift both query it, each for different workloads.
The pattern works like this: everything lands in S3 (cheap, durable, scalable). Raw and historical data stays there permanently. A subset of curated, frequently-queried data gets loaded into Redshift managed storage for BI performance. Redshift Spectrum bridges the two: it lets Redshift query S3-backed data in the same SQL statement as local Redshift tables.
-- Redshift Spectrum: join local Redshift table with S3-backed Spectrum table
SELECT
r.customer_name,
s.order_count,
s.total_revenue
FROM redshift_local.customers r
JOIN spectrum_schema.daily_order_summary s
ON r.customer_id = s.customer_id
WHERE s.date = '2026-03-01'
ORDER BY s.total_revenue DESC;Use both when:
- You need cheap storage for large historical datasets alongside fast querying for recent or curated data
- Different teams have different needs: data scientists use Athena on raw S3 data, analysts use Redshift for dashboards
- You want one copy of data accessible by multiple query engines without duplication
- You are adopting open table formats like Apache Iceberg for ACID transactions and schema evolution on S3
Redshift Spectrum, Athena Iceberg support, and EMR all read the same S3-backed open table formats. Once your data is in Parquet or Iceberg on S3, you can query it with any of these engines without copying it. That is the direction the whole AWS data stack is moving toward.
Redshift vs Athena: direct comparison
Both services run SQL. The difference is what they are optimized for and how they are priced.
| Property | Amazon Redshift | Amazon Athena |
|---|---|---|
| Infrastructure | Provisioned cluster or Serverless: you manage capacity | Fully serverless: no infrastructure to manage |
| Cost model | Per node-hour (provisioned) or per RPU-hour (Serverless) | $5 per TB scanned: pay only when you query |
| Query performance | Consistent low latency: data is in managed columnar storage | Variable: depends on file size, format, and partitioning |
| Concurrency | High: built for many simultaneous users and BI tools | Limited by service quotas; not designed for high concurrency |
| Data location | Managed Redshift storage (or S3 via Spectrum) | Always in S3: Athena does not store data |
| Best query type | Frequent structured SQL: dashboards, aggregations, joins | Infrequent ad-hoc SQL: exploration, one-off analysis |
| Maintenance | Cluster sizing, VACUUM, sort keys, distribution keys | None: serverless and fully managed |
| Typical users | Analysts, BI tools, scheduled reports | Data engineers, scientists, ad-hoc exploration |
At low query volumes (a few queries per day), Athena is cheaper because you are not paying for idle cluster time. At high query volumes (hundreds of queries per day from concurrent users), Redshift’s fixed hourly rate usually works out cheaper than Athena’s per-scan charges, and performance is far more predictable. If your Athena costs are growing noticeably as usage scales, that is your signal to move curated data into Redshift.
Common mistakes
Loading all data into Redshift. Redshift managed storage is expensive relative to S3. Raw and historical data that is rarely queried belongs in S3, not in the warehouse. Only load data that needs frequent, fast access into Redshift managed storage.
Treating Athena as a Redshift replacement. Athena ad-hoc queries are not a substitute for BI dashboards that need consistent sub-second responses under concurrent load. If your dashboards are slow because Athena cannot keep up, move the curated data into Redshift.
Not partitioning S3 data before querying with Athena or Spectrum. Both services charge per byte scanned. Querying terabytes of unpartitioned data is slow and expensive. Always partition by date or a high-cardinality key and store data in Parquet or ORC format. The partitioned tables guide covers the mechanics.
Thinking you have to choose one or the other. The lakehouse is the standard pattern for mature data platforms. The question is not “warehouse or lake” but “which data goes where.” Most teams end up using both.
Skipping the data catalog. Raw data dumped into S3 without a Glue catalog entry is invisible to Athena and Spectrum. Register your tables in the Glue Data Catalog from day one, even for exploratory data. It costs nothing and saves significant rework later.
Summary
- Data warehouses use schema-on-write (structured, fast, higher storage cost); data lakes use schema-on-read (flexible, variable query performance, cheap storage)
- Redshift is best for frequent, concurrent structured SQL from BI tools and dashboards; Athena is best for ad-hoc exploration on S3 data
- Athena costs per byte scanned; Redshift costs per cluster-hour. Athena wins at low volume; Redshift wins at high volume
- The lakehouse pattern uses S3 as the single storage layer and queries it with both Athena and Redshift Spectrum. Most mature platforms do this
- Start with S3 + Athena; add Redshift when BI users need consistent performance; connect both with Redshift Spectrum and Iceberg
- Always partition S3 data by date and store in Parquet. It makes both Athena and Spectrum fast and cheap
Frequently asked questions
What is the main difference between a data warehouse and a data lake?
A data warehouse stores structured, processed data in a defined schema optimized for SQL queries. You define the structure before loading data (schema-on-write). A data lake stores raw data in any format without a predefined schema. Structure is defined when you query it (schema-on-read). Warehouses give consistent, fast query performance. Lakes give flexibility and cheap storage for any kind of data.
When should I use Redshift vs Athena?
Use Redshift when multiple analysts or BI tools run frequent structured queries and need consistent, low-latency responses. Redshift stores data in columnar format on managed storage built for concurrency. Use Athena when you want ad-hoc SQL on data already sitting in S3 without managing any infrastructure. Athena charges per byte scanned; Redshift charges per cluster hour regardless of usage.
What is a data lakehouse?
A lakehouse combines the flexible, cheap storage of a data lake with the performance and governance of a data warehouse. In AWS, this means storing data in S3 in open table formats like Apache Iceberg, and querying it with both Athena (serverless) and Redshift Spectrum (from inside the warehouse). One copy of data, accessible by multiple engines.
Is Athena a replacement for Redshift?
No. Athena is best for ad-hoc, infrequent, or exploratory queries. Redshift is built for high-concurrency, low-latency workloads where many users run structured queries simultaneously. At low query volumes Athena is cheaper; at high query volumes Redshift typically wins on both cost and performance.
Do I need to choose between a data lake and a data warehouse?
Most mature AWS data platforms use both. S3 is the single storage layer; Athena queries it for exploration and data science; Redshift handles structured analytics and BI. Redshift Spectrum and open table formats like Iceberg let both engines read the same data without duplicating it.