← All visual guides Compute

Adaptive warehouses, and what changes when you switch

Snowflake can now size and scale compute per query. What changes, what stays the same, and how I'd move a customer over.

6 min read

Adaptive Warehouses Set a spend ceiling. Snowflake picks the compute for each query. Before one warehouse per workload XS BI dashboards M ELT jobs 2XL "the month-end one" idle 27 days a month queued ✗ you pick the size up front ✗ resize by hand when it queues ✗ idle time = credits burned ✗ one big query jams the small one same SQL After one adaptive warehouse ADAPTIVE_WH q1 small q2 big, briefly q3 medium ✓ Snowflake sizes compute per query ✓ scales out when queries queue ✓ shared pool, so far less idle you set: max credits that's the whole config What stays the same connection strings keep the warehouse name, roles and grants carry over, queries are unchanged. start with dev and BI; leave tuned ELT on classic warehouses at first sketch 02 · snowflake, drawn out
Click the sketch to open it full size

The first thing every Snowflake admin used to learn was the warehouse size ladder. XS, S, M, L, XL and up, each step doubling the credits per hour. You picked a size, watched queries, resized by hand, and had the same discussion every quarter about whether the month-end 2XL could be an XL.

Adaptive warehouses take that decision away. You create one warehouse, set a spend ceiling, and Snowflake chooses the compute for each query and scales out when things queue.

What changes

With a classic warehouse you get a fixed-size cluster. A small lookup and a 40-billion-row join run on the same hardware. Size for the big one and the small one wastes money. Size for the small one and the big one spills to disk or queues.

With an adaptive warehouse, the warehouse is a pool. Each query is routed to an appropriate amount of compute based on what Snowflake knows about it and about similar queries it has seen. Concurrency scales out on its own. When nothing is running you pay nothing, as before.

The configuration mostly collapses to one number: the maximum credit rate you are willing to spend.

CREATE WAREHOUSE analytics_adaptive
  RESOURCE_CONSTRAINT = ADAPTIVE  -- check current docs; parameter names have changed between preview and GA
  MAX_CREDITS_PER_HOUR = 20;

I keep the DDL loose here on purpose. The idea is stable even where the syntax is not: adaptive mode plus a cost ceiling.

What stays the same

This is what customers ask about most, and the answers are boring in a good way.

  • The warehouse name in connection strings. Recreate under the same name and no config changes.
  • Roles and grants. USAGE on a warehouse is still USAGE on a warehouse.
  • The SQL. Nothing about the query changes.
  • Auto-suspend and auto-resume. Still there.
  • Query history and per-query credit attribution, so chargeback keeps working.

Why it matters for cost

Idle time is where most Snowflake money goes. With a dozen fixed warehouses, each one has its own idle tail after every burst of work. Consolidating onto one adaptive pool means one idle tail instead of twelve, and no more running an XL for a single dashboard because it once timed out on a M.

It also handles the opposite case, the under-sized warehouse that spills to remote storage. Spilling is slow, and since you pay for time, expensive. Sizing up for one heavy query and back down afterwards is exactly the thing people do not do by hand.

How I would move a customer over

  1. Start with dev and BI workloads. They are bursty and forgiving.
  2. Set the ceiling at the current average spend, not the peak. Let it show it can do the same work for less before loosening it.
  3. Leave hand-tuned ELT on classic warehouses for now. If someone spent weeks tuning a nightly load on a specific size, move it after you have a month of adaptive data to compare against.
  4. Watch two numbers for two weeks: credits per day, and p95 duration on the main dashboards. If both hold or improve, move more.
  5. Drop the warehouses that are now empty. Going from fifteen to four is where the saving shows up.

When I would wait

  • A workload with a strict SLA that has already been tuned to a size. Measure first.
  • Anything built around warehouse-level cache behaviour on purpose.
  • Regions or editions where the feature is still in preview. Test it, do not put production on it yet.

Fixed sizes made customers do the scheduler’s job. This hands it back.