Redshift Cost Optimisation
Amazon Redshift can be one of the most expensive services on an AWS bill if you leave a provisioned cluster running 24/7 for workloads that only run a few hours a day. The right configuration saves 40–70% without reducing capability.
Understanding Redshift pricing
Redshift pricing has two components: compute (the cluster nodes) and storage (the data).
Provisioned cluster pricing is per-node-hour. Common node types:
dc2.large: $0.25/node-hour — best for small clusters or testingra3.xlplus: $1.086/node-hour — general purpose, separates compute from storagera3.4xlarge: $3.26/node-hour — medium workloadsra3.16xlarge: $13.04/node-hour — large enterprise workloads
A 2-node ra3.xlplus cluster running 24/7:
2 × $1.086 × 730 hours = $1,585/month
Redshift Serverless charges per RPU-second (Redshift Processing Unit). The base price is approximately $0.375 per RPU-hour. Serverless automatically scales RPUs from a configured minimum to a maximum.
For a team running queries 4 hours/day with an average of 8 RPUs: 8 RPUs × 4 hr × 30 days × $0.375 = $360/month
Versus the provisioned cluster at $1,585/month for the same workload. Serverless is dramatically cheaper for low-utilisation workloads.
The break-even is roughly when your cluster is running meaningful query load for more than 8–10 hours per day, at which point provisioned with Reserved Nodes becomes cheaper.
Choosing between Serverless and provisioned
| Factor | Redshift Serverless | Provisioned cluster |
|---|---|---|
| Pricing model | Per RPU-second (pay for query time) | Per node-hour (pay whether querying or idle) |
| Best for | Intermittent, unpredictable, or dev workloads | Consistent, high-utilisation production workloads |
| Scaling | Automatic (no configuration) | Manual node count, or elastic resize |
| Reserved pricing | Not available | 1-year and 3-year Reserved Nodes (up to 75% savings) |
| Concurrency scaling | Built-in | Manual configuration |
| Cold start | Seconds to resume from idle | No cold start (always on) |
For development and analytics teams with variable query schedules, Serverless is the default recommendation. Migrate to provisioned only once you have 90 days of Serverless cost data showing consistent high utilisation.
Pausing provisioned clusters during off-hours
If you have a provisioned cluster and your team only runs queries during business hours, pausing the cluster at night and on weekends can cut the compute bill by 65–70%.
A ra3.xlplus 2-node cluster running 8 hours/day × 5 days/week:
2 × $1.086 × (8hr × 22 workdays) = 2 × $1.086 × 176 = $382/month
Versus running 24/7: $1,585/month. Saving: $1,203/month.
Storage charges continue during the pause (ra3 nodes use S3 for managed storage, charged at $0.024/GB/month), but compute stops.
To schedule pausing with the AWS CLI:
# Pause the cluster
aws redshift pause-cluster --cluster-identifier my-cluster
# Resume the cluster
aws redshift resume-cluster --cluster-identifier my-clusterUse an EventBridge scheduled rule with a Lambda function (or AWS Systems Manager Automation) to pause and resume automatically at specified times. For example, pause at 7pm weekdays and resume at 7am weekdays.
Reserved Nodes for consistent production workloads
For provisioned clusters running 8+ hours/day consistently, Reserved Nodes provide significant savings:
- 1-year Reserved: approximately 40% discount over On-Demand
- 3-year Reserved: approximately 75% discount over On-Demand
For a 2-node ra3.xlplus cluster:
- On-Demand: $1,585/month
- 1-year Reserved: ~$950/month
- 3-year Reserved: ~$400/month
The commitment is per-node, not per-cluster. You buy 2 reserved nodes of type ra3.xlplus, and the reservation applies to any cluster using those node types in that region.
Before purchasing Reserved Nodes, run the cluster for at least 60–90 days On-Demand to confirm the node count and type are appropriate. Changing node type after buying reserved nodes is not straightforward.
For Redshift pricing in detail, see the Redshift pricing explained page.
Redshift Spectrum: query S3 instead of loading data
Redshift Spectrum extends Redshift queries to data stored in S3 without loading it into the cluster. This is significant for cost because:
- S3 storage costs $0.023/GB/month
- Redshift managed storage (ra3) costs $0.024/GB/month
- But data in Redshift must be queried within Redshift (compute cost); data in S3 is accessed via Spectrum at $5/TB scanned
The cost-saving use case: historical data queried infrequently. If you have 5TB of transaction records from 2022 that are queried once a month, keeping them in Redshift costs: 5,000GB × $0.024 = $120/month in storage, plus the compute cost of having a cluster large enough to hold it.
Moving that 5TB to S3 (as Parquet or ORC) costs: 5,000GB × $0.023 = $115/month in storage, plus $5 per TB scanned when queried. Monthly query cost: ~$25 (assuming 5TB scanned in the monthly query).
Net saving: minimal on storage, but the cluster can be smaller (fewer nodes) because it doesn’t need to hold 5TB of cold data, which saves significantly on compute.
Partitioning for Spectrum cost reduction — Spectrum charges for data scanned. If your S3 data is partitioned by date (e.g., s3://bucket/data/year=2022/month=03/), a query filtering to WHERE year = 2022 AND month = 03 only scans that partition — dramatically reducing the per-query cost.
Data compression and storage reduction
Redshift uses columnar storage with compression encodings to reduce the physical size of data on disk. Efficient compression reduces storage costs and improves query performance (less data to read = faster queries).
Redshift automatically applies compression encoding when you load data using COPY. You can also run ANALYZE COMPRESSION on a table to see what encoding Redshift recommends:
ANALYZE COMPRESSION my_table;Common encoding types:
- RAW — no encoding, largest storage footprint
- AZ64 — AWS proprietary, works well for numeric and date columns
- ZSTD — general-purpose compression, often best for string columns
- Runlength — efficient for low-cardinality columns (e.g., status codes, boolean flags)
For a typical analytics dataset, applying proper compression reduces storage by 50–70%. On an ra3 cluster with 2TB of data, that’s the difference between $48/month and $14–24/month in storage.
Materialized views to reduce repeated query cost
Some queries run frequently and are expensive — full scans of large tables, complex joins, aggregations. Materialized views pre-compute the result and store it, so subsequent queries hit the cached result instead of re-scanning the underlying data.
CREATE MATERIALIZED VIEW monthly_revenue_summary AS
SELECT
date_trunc('month', order_date) AS month,
product_category,
SUM(revenue) AS total_revenue
FROM orders
GROUP BY 1, 2;Refreshing the materialized view on a schedule (e.g., nightly) means dashboards hit the pre-computed summary instead of scanning the orders table. For a 500GB orders table queried 100 times per day by a BI tool, materialized views can reduce the scan volume from 50TB/day to near zero.
This reduces both query execution time and WLM (Workload Manager) queue pressure, which can allow a smaller node count — directly reducing compute cost.
Note: When evaluating Redshift Serverless, be aware that the minimum RPU setting matters. If you set a minimum of 8 RPUs but your workload only needs 4 RPUs for most queries, you’re paying for 8 RPUs during those queries. Start with the default base capacity and reduce it if Cost Explorer shows the cluster is consistently using less than the minimum.
Common mistakes
- Running a provisioned cluster 24/7 for a 9-to-5 analytics team — If queries only run during business hours, pausing nights and weekends saves over 60% of compute cost. Schedule pauses before the first bill arrives.
- Loading all historical data into Redshift — Data that is rarely queried is expensive to store in Redshift. Archive old data to S3 and query it via Spectrum when needed.
- Not using columnar compression — Tables loaded without compression encoding can be 3–5× larger than necessary. Always use COPY with automatic compression or run ANALYZE COMPRESSION on existing tables.
- Buying Reserved Nodes before the cluster is stable — If you reserve 4 nodes and then rightsize to 2 nodes, you’re paying for 2 unused reserved nodes. Establish stable usage patterns before committing.
- Not partitioning S3 data used with Spectrum — Unpartitioned S3 data means every Spectrum query scans everything. Partitioning by date or another common filter column can reduce scan cost by 90%+.
Summary
- Redshift Serverless is cheaper for workloads running queries less than ≈50% of the day
- Pausing a provisioned cluster at nights and weekends saves 60–70% of compute cost
- Reserved Nodes provide 40% (1-year) to 75% (3-year) discounts on provisioned clusters
- Redshift Spectrum queries S3 data at $5/TB scanned — cheaper than loading cold data into the cluster
- Columnar compression reduces storage by 50–70%; use ANALYZE COMPRESSION to find optimal encodings
- Materialized views eliminate repeated expensive scans, reducing query cost and enabling smaller clusters
- Partition S3 data by common filter dimensions to minimise Spectrum scan costs
Frequently asked questions
Should I use Redshift Serverless or a provisioned cluster?
Redshift Serverless is better for variable or unpredictable workloads — you pay per RPU-second used. Provisioned clusters are cheaper for workloads running queries most of the day. If your cluster is active more than about 50% of the time, provisioned with Reserved Nodes is usually cheaper.
Can I pause a Redshift cluster to save money?
Yes. Provisioned Redshift clusters can be paused, which stops the compute charges. Storage charges for the data continue during the pause. Clusters can be paused manually or on a schedule using the AWS CLI or EventBridge.
What is Redshift Spectrum?
Redshift Spectrum lets you query data stored in S3 directly from Redshift without loading it into Redshift storage. Pricing is $5 per TB of data scanned. It is cheaper than loading large historical datasets into Redshift when they are queried infrequently.