Snowflake Cost Optimisation: Cut Compute Credits 60%
Snowflake bills are mostly compute. Here's how to size warehouses correctly, kill the silent burn, and use materialised views without making it worse.
By Andrii Votiakov on
Snowflake's pricing model is simple in principle: you pay for storage (cheap) and compute credits (expensive). In practice, teams under-tune warehouses, leave them running, and let dbt jobs over-provision. Most Snowflake bills can be cut 40-70% with mechanical changes. If you're running Snowflake alongside BigQuery, the BigQuery cost optimisation guide covers the analogous levers for the GCP analytics layer. For the broader GCP stack that often surrounds a Snowflake deployment, the GCP cost optimisation playbook is a good companion read.
Quick answer
Storage is rarely the issue (~$23/TB-month compressed). Compute credits are. Cut by right-sizing warehouses, aggressive auto-suspend (60s where possible), multi-cluster only where needed, materialised views for repeat aggregations, and resource monitors with hard limits to prevent runaway queries.
How Snowflake bills
Three line items:
- Compute credits: $2-4/credit depending on edition. A Small warehouse = 2 credits/hour, X-Large = 16 credits/hour.
- Storage: $23-40/TB-month (compressed) for active data. Time Travel and Fail-safe add to this.
- Cloud Services: free up to 10% of daily compute credit usage; chargeable above.
99% of optimisation is on compute credits.
Warehouse sizing: the rules
Snowflake doubles credit consumption per size step:
| Size | Credits/hour |
|---|---|
| X-Small | 1 |
| Small | 2 |
| Medium | 4 |
| Large | 8 |
| X-Large | 16 |
| 2X-Large | 32 |
| 3X-Large | 64 |
| 4X-Large | 128 |
A Large running 24/7 = 8 × 24 × 30 = 5,760 credits/month = $11,520-23,040/month. A single warehouse.
Right-sizing rules:
- A query running in 3 seconds on a Large will run in ~6 seconds on a Medium and ~12 on a Small. For ad-hoc work, smaller is almost always cheaper.
- For a 5-minute ETL job: try one size down, see if it still completes in your SLA. If yes, halve cost.
- For a 30-second dashboard query: stay small. Resizing helps only when queries are seconds-long and concurrency is the real issue.
- Per-team or per-workload warehouses, not one giant shared warehouse. Different shapes deserve different sizes.
Auto-suspend aggressively
Default auto-suspend is 600 seconds (10 minutes). Cut to 60 seconds for ad-hoc and BI workloads.
ALTER WAREHOUSE etl_xs SET AUTO_SUSPEND = 60;
Cost of suspend/resume: nearly zero (warehouses cold-start in 1-2 seconds; the first query after resume sometimes takes a small extra second).
For dashboard warehouses with cold-start sensitivity, use 60-120s. For ETL, often 30-60s is fine.
For warehouses that get queried every 10-30 seconds (heartbeat dashboards), set to 60s and let them stay warm — auto-suspend won't fire.
Multi-cluster: only where it helps
Multi-cluster warehouses scale out for concurrency. Costs add up: a max-clusters of 5 on a Medium can hit 4 × 5 = 20 credits/hour at peak.
Use multi-cluster only when:
- BI tool has dozens of concurrent dashboard users
- ETL has independent jobs that should run in parallel without queuing
Don't use multi-cluster on:
- Small teams with 2-5 active users
- Single-job ETL warehouses
Set min-clusters = 1 always. Let scale-out happen on demand.
Resource monitors and quotas
Set a credit limit per warehouse and a monthly account limit with suspend at quota action. Prevents runaway queries from a forgotten dbt model destroying a month.
CREATE RESOURCE MONITOR monthly_cap
WITH CREDIT_QUOTA = 5000
TRIGGERS
ON 80 PERCENT DO NOTIFY
ON 95 PERCENT DO SUSPEND
ON 100 PERCENT DO SUSPEND_IMMEDIATE;
Apply with ALTER WAREHOUSE etl SET RESOURCE_MONITOR = 'monthly_cap'.
Materialised views: when they pay back
MV in Snowflake = pre-computed aggregation refreshed automatically. Reduces query cost when:
- Same aggregation is queried 10+ times per day
- Underlying table is large (10+ GB)
- Refresh cost < query cost saved
Don't blanket-create MVs. Each one costs background credits to maintain. Audit access frequency:
SELECT query_text, COUNT(*) AS executions, SUM(credits_used_cloud_services) AS credits
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE start_time > DATEADD('day', -30, CURRENT_TIMESTAMP())
AND query_text ILIKE '%GROUP BY%'
GROUP BY query_text
ORDER BY credits DESC
LIMIT 20;
The top 5-10 by credits are MV candidates.
Query-level wins
- Cluster keys on tables larger than 1 TB queried with predictable filters. Drops scan time/cost.
SELECT *is expensive — Snowflake stores columnar; selecting fewer columns scans less.LIMITdoes not save cost if there's noORDER BYpredicate that can skip — Snowflake will scan.- Caching: results are cached 24h for identical queries. Some BI tools accidentally bust the cache; check yours.
- Search optimisation service: useful for needle-in-haystack lookups but expensive; only enable on tables where it pays back.
Storage and Time Travel
- Default Time Travel is 1 day. Increase only on tables with real recovery requirements.
- Fail-safe is 7 days, not configurable, included in storage cost.
- Drop unused tables — but remember Time Travel keeps them for 1 day after, Fail-safe 7 days. Storage doesn't drop instantly.
- Use Transient tables for ETL staging (no Fail-safe, lower storage).
What I check in an audit
- Top 10 warehouses by credit usage; compare size vs query duration distribution
- Auto-suspend setting on every warehouse (find any > 300s)
- Multi-cluster usage; find clusters that ramped to max but rarely needed it
- Resource monitor coverage (most accounts have none)
- Top 20 queries by credit cost — look for
SELECT *, scans without filters - Materialised view refresh cost vs benefit
- Time Travel retention on the largest tables
Realistic numbers
Recent client (~$24k/month Snowflake):
- Right-sized 4 warehouses (X-Large → Large or Medium): $6,800/month
- Auto-suspend 600s → 60s on 7 warehouses: $3,400/month
- Disabled multi-cluster on 3 warehouses: $1,900/month
- Three new MVs replacing repeated dashboard aggregations: $2,200/month
- Resource monitors capping ad-hoc query workspace: prevented one $4k/month runaway
Final: $9,700/month, ~60% reduction.
If you'd like me to audit and tune your Snowflake account on a pay-for-savings basis, book a call.