← All articles SNOWFLAKE · COST

Snowflake bill too high? 8 checks I run first

Hikmat UllahSenior Data Engineer7 min read

Most Snowflake bills do not grow because of one bad decision. They grow slowly, through warehouses that never sleep, sizes picked once and never revisited, and a handful of queries that scan far more data than they need. The good news is that the first 20 to 40 percent of savings usually comes from simple checks. These are the eight I run first on any account.

1. Find out where the credits actually go

Before changing anything, measure. Compute is normally the biggest part of the bill, so start with credits per warehouse over the last 30 days.

SELECT warehouse_name,
       ROUND(SUM(credits_used), 1) AS credits
FROM snowflake.account_usage.warehouse_metering_history
WHERE start_time >= DATEADD(day, -30, CURRENT_TIMESTAMP())
GROUP BY warehouse_name
ORDER BY credits DESC;

In most accounts two or three warehouses use the majority of credits. Focus there first. Note that the ACCOUNT_USAGE views have some delay, so very recent activity may not show yet.

2. Fix auto-suspend

A warehouse bills per second while it is running, with a minimum of 60 seconds each time it resumes. A warehouse left with a long auto-suspend keeps billing while nobody uses it. For most ELT and BI warehouses, 60 seconds is a sensible starting point.

ALTER WAREHOUSE transform_wh SET AUTO_SUSPEND = 60;
ALTER WAREHOUSE transform_wh SET AUTO_RESUME = TRUE;

Going much lower than 60 seconds rarely helps because of the one minute minimum, and very short values can also throw away the warehouse cache between queries that run close together.

3. Right-size, do not oversize

Every step up in warehouse size doubles the credits per hour. A bigger warehouse is only worth it if queries finish proportionally faster. Test a heavy job on the current size and one size smaller. If the run time barely changes, the smaller size is the better deal. If a query spills to remote storage, that is a sign it genuinely needs more memory.

4. Put a cap on spend with resource monitors

Resource monitors give you an early warning and a hard stop. Set a monthly quota, get notified at 80 percent and suspend at 100 percent on non-critical warehouses.

CREATE RESOURCE MONITOR monthly_cap
  WITH CREDIT_QUOTA = 300
  FREQUENCY = MONTHLY
  START_TIMESTAMP = IMMEDIATELY
  TRIGGERS ON 80 PERCENT DO NOTIFY
           ON 100 PERCENT DO SUSPEND;

ALTER WAREHOUSE transform_wh SET RESOURCE_MONITOR = monthly_cap;

Pick the quota from your measured usage in step 1, not from a guess.

5. Tune the queries that cost the most

A small number of queries usually account for most of the run time. List the slowest ones from the last week and look at how much data they scan.

SELECT query_id,
       warehouse_name,
       total_elapsed_time / 1000 AS seconds,
       bytes_scanned / POWER(1024, 3) AS gb_scanned,
       LEFT(query_text, 80) AS query_start
FROM snowflake.account_usage.query_history
WHERE start_time >= DATEADD(day, -7, CURRENT_TIMESTAMP())
ORDER BY total_elapsed_time DESC
LIMIT 20;

The usual fixes are simple: select only the columns you need instead of SELECT *, filter early on columns that let Snowflake prune micro-partitions, avoid joins that explode row counts, and replace full reloads with incremental loads where the source allows it.

6. Stop recomputing the same thing

Pipelines often rebuild the same large tables every run even when only a small slice changed. Moving to incremental models, using streams and tasks for change capture, or materializing an expensive intermediate result once instead of in every downstream query can remove a large share of compute. Repeated identical queries on unchanged data can also be served from the result cache for 24 hours at no compute cost.

7. Watch storage and serverless features

Storage is usually cheaper than compute, but it adds up. Staging and scratch tables that can be rebuilt do not need long Time Travel or Fail-safe, so transient tables are a good fit for them. Also check serverless features such as automatic clustering, Snowpipe, search optimization and materialized view maintenance. They bill separately from warehouses and are easy to forget. Automatic clustering in particular only pays off on very large tables that are filtered selectively.

8. Make cost visible every week

The checks above save money once. Keeping costs down needs a habit: a small weekly report of credits by warehouse and the top queries, shared with the team that owns them. When people can see what their workloads cost, most of the waste fixes itself.

Where to start

If you only have one hour, do steps 1, 2 and 4. Measure, set auto-suspend to 60 seconds and add a resource monitor. That alone often stops the bill from creeping up. If you would like a second pair of eyes on your account, I offer a Snowflake cost and performance review.

Questions about your own setup?
Book a free 20-minute call or send me a message on WhatsApp.
Book a free call WhatsApp