Snowflake auto-suspend stops a warehouse after it has been idle for a set number of seconds, so you stop paying for it. New warehouses created with SQL wait 600 seconds, which means up to 10 minutes of paid idle time after every burst of queries. Setting AUTO_SUSPEND to fit each workload is one of the quickest Snowflake savings: it is one line of SQL per warehouse and cuts idle time directly. This guide explains how auto-suspend works, what it costs, and how to choose the setting. Every fact and figure in this guide was checked against Snowflake’s documentation.
This article is part of our guide to Snowflake warehouse optimization.
What is Snowflake auto-suspend?
Auto-suspend is a warehouse setting, AUTO_SUSPEND, that tells Snowflake how many seconds of inactivity to wait before suspending the warehouse. A suspended warehouse uses no credits. With AUTO_RESUME on, the warehouse starts again automatically when the next query arrives.
AUTO_SUSPEND accepts any whole number of seconds from 0 up, or NULL. A warehouse created with CREATE WAREHOUSE and no value suspends after 600 seconds (10 minutes). A value of 0 or NULL means the warehouse never suspends. AUTO_RESUME is on by default.
Why does auto-suspend matter so much for cost?
A running warehouse bills for every second it runs, whether or not it is running queries. The time between the last query and the suspend is billed at the full rate.
For example, a Medium warehouse (4 credits per hour) that runs a 2-minute job every 15 minutes, with the default AUTO_SUSPEND of 600 seconds, is billed for about 12 minutes each time: 2 minutes of work and 10 minutes of idle time. Across a day that is 96 runs x 12 minutes = 19.2 hours billed for 3.2 hours of work, or 76.8 credits instead of 12.8. With AUTO_SUSPEND = 60, each run bills about 3 minutes, so 96 x 3 minutes = 4.8 hours, or 19.2 credits.
Snowflake checks for idle warehouses about every 30 seconds, so a warehouse can stay up a little longer than its setting, and values under 30 seconds, or that are not a multiple of 30, may not behave exactly as set.
What is the 60-second minimum?
Each time a warehouse starts or resumes, Snowflake bills at least 60 seconds, then per second after that. A warehouse that wakes for a 5-second query and suspends straight away is still billed for a full minute.
This is why the lowest AUTO_SUSPEND is not always the cheapest. On a warehouse that receives a query every minute or two, a very short suspend time can make it stop and resume over and over, paying the 60-second minimum each time.
Snowflake’s own example: a warehouse that runs for 61 seconds, shuts down, then restarts and runs for less than 60 seconds is billed for 121 seconds (60 + 1 + 60). For the same reason, Snowflake advises against a 1 to 2 minute setting on a warehouse that receives a query every 2 to 3 minutes.
What does auto-suspend cost you in performance?
A running warehouse keeps recently read data in its local disk cache, so repeated queries over the same tables can read from cache instead of remote storage. When the warehouse suspends, the cache is dropped, and the first queries after it resumes can run slower.
That is the trade-off: a shorter suspend time saves idle credits but can make the first queries after a resume slower, because they cannot reuse the warehouse’s cache.
What should you set AUTO_SUSPEND to?
Snowflake’s general recommendation is a low value, for example 5 or 10 minutes or less. Its guidance by workload:
| Workload | Snowflake’s guidance |
|---|---|
| Tasks | Suspend immediately |
| DevOps, DataOps and data science | About 5 minutes |
| BI and SELECT queries that reuse cached data | At least 10 minutes, to keep the cache |
Then measure. If idle credits stay high on a warehouse whose queries rarely read from cache (check PERCENTAGE_SCANNED_FROM_CACHE in QUERY_HISTORY), a shorter setting saves money without much performance cost. If users notice slow first queries, or the warehouse resumes many times an hour, lengthen it.
How do you find idle time on your warehouses?
WAREHOUSE_METERING_HISTORY records the compute each warehouse used and, separately, the compute attributed to its queries. The difference is idle time. Snowflake publishes this query for it:
-- Idle credits by warehouse, last 10 days (Snowflake's own example query)
SELECT
(SUM(credits_used_compute) -
SUM(credits_attributed_compute_queries)) AS idle_cost,
warehouse_name
FROM SNOWFLAKE.ACCOUNT_USAGE.WAREHOUSE_METERING_HISTORY
WHERE start_time >= DATEADD('days', -10, CURRENT_DATE())
AND end_time < CURRENT_DATE()
GROUP BY warehouse_name;
The result is in credits. Multiply by your price per credit to see it in dollars.
To list warehouses whose AUTO_SUSPEND is longer than 5 minutes, or that never suspend:
SHOW WAREHOUSES;
SELECT "name", "size", "auto_suspend", "auto_resume"
FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()))
WHERE "auto_suspend" IS NULL OR "auto_suspend" = 0 OR "auto_suspend" > 300;
The column names are in double quotes because SHOW returns them in lowercase. A NULL or 0 auto_suspend means the warehouse never suspends.
How do you change AUTO_SUSPEND?
-- Data science warehouse: suspend after 5 minutes of inactivity, resume automatically
ALTER WAREHOUSE ds_wh SET AUTO_SUSPEND = 300 AUTO_RESUME = TRUE;
-- Batch warehouse: create it with a short suspend time
CREATE WAREHOUSE etl_wh
WAREHOUSE_SIZE = SMALL
AUTO_SUSPEND = 60
AUTO_RESUME = TRUE;
What about multi-cluster warehouses?
AUTO_SUSPEND and AUTO_RESUME apply to the warehouse as a whole. A multi-cluster warehouse auto-suspends only once it is down to its minimum number of clusters and has been idle for the set time, and auto-resume only starts it when no clusters are running. In between, the scaling policy starts and stops the extra clusters. Extra clusters that stay up after a burst are a separate source of idle time; see Snowflake multi-cluster warehouses.
How Seemore removes idle time
Fixed timeouts are a compromise: whatever value you choose, some idle seconds are billed after every burst. Seemore’s Auto-Shutdown suspends each warehouse the moment it goes idle instead of waiting out a fixed timeout. It never suspends a warehouse with a running or queued query, and never suspends one inside the first minute you have already paid for, so queries always complete on their own. For multi-cluster warehouses, Auto-Scaler scales extra clusters down once they stop contributing meaningful performance. For how this works, see smart Snowflake auto-suspend with Auto-Shutdown.
Frequently asked questions
What is the default auto-suspend time in Snowflake?
600 seconds (10 minutes) for a warehouse created with CREATE WAREHOUSE without an AUTO_SUSPEND value.
What is the best Snowflake auto-suspend setting?
There is no single best value. Snowflake recommends a low value, 10 minutes or less: immediate suspension for tasks, about 5 minutes for DevOps, DataOps and data science, and at least 10 minutes for BI warehouses that rely on the cache. Measure idle credits and resume counts, then adjust.
Does a suspended Snowflake warehouse cost money?
No. A suspended warehouse uses no credits. You pay again from the moment it resumes, with a 60-second minimum.
Can I set AUTO_SUSPEND to 0 in Snowflake?
Yes, but 0 or NULL means the warehouse never suspends, so it bills around the clock. It only makes sense for a warehouse that really needs to run continuously.
Does Snowflake auto-suspend affect query performance?
It can. When a warehouse suspends, its cache is dropped, so the first queries after a resume may run slower.
Do idle Snowflake warehouses cost money?
Yes, until they suspend. A running warehouse uses credits every second whether or not it is processing queries.