Home Database Virtual Warehouses: Compute, Sizing & Auto-Scaling
Beginner 3 min · July 17, 2026
Virtual Warehouses: Compute Resources, Sizing, and Auto-Scaling

Virtual Warehouses: Compute, Sizing & Auto-Scaling

Learn how Snowflake virtual warehouses work, how to size them, and how auto-scaling handles concurrency.

N
Naren Founder & Principal Engineer

20+ years shipping high-throughput database systems. Drawn from code that ran under real load.

Follow
Production
production tested
July 17, 2026
last updated
2,439
articles · all by Naren
Before you start⏱ 15-20 min read
  • Basic understanding of SQL (SELECT, INSERT, etc.)
  • A Snowflake account with access to create warehouses
 ● Production Incident 🔎 Debug Guide ⚙ Triage Commands
Quick Answer

Snowflake virtual warehouses are clusters of compute resources that execute queries. They can be sized from X-Small to 6X-Large, support auto-scaling (multi-cluster) for concurrency, and can be set to auto-suspend to save costs. Key settings: warehouse size, multi-cluster configuration, and auto-suspend timeout.

✦ Definition~90s read
What is Virtual Warehouses?

A Snowflake virtual warehouse is a cluster of compute resources that you use to execute SQL queries and DML operations, separate from storage, and you can size, suspend, and auto-scale it independently.

Think of a virtual warehouse like a fleet of delivery trucks.
Plain-English First

Think of a virtual warehouse like a fleet of delivery trucks. A small warehouse is one small truck (X-Small), a large warehouse is a big truck (X-Large). Auto-scaling adds more trucks when there are many packages (queries) to deliver. Auto-suspend parks the trucks when no deliveries are needed, saving fuel (credits).

Snowflake's architecture separates storage and compute, allowing you to scale compute independently. Virtual warehouses are the compute layer—they process queries, load data, and perform DML operations. Choosing the right warehouse size and configuration is critical for performance and cost. A warehouse too small causes slow queries; too large wastes credits. Auto-scaling (multi-cluster) handles variable concurrency, automatically adding clusters when queries queue up. This tutorial covers everything you need to know: sizing guidelines, multi-cluster setup, auto-suspend, and real-world debugging. By the end, you'll be able to design cost-effective, performant warehouses for your workloads.

What is a Virtual Warehouse?

A virtual warehouse is a cluster of compute resources (CPU, memory, and storage) that Snowflake uses to execute SQL queries and perform DML operations. It is separate from storage, so you can scale compute independently. Each warehouse can be sized from X-Small (1 node) to 6X-Large (128 nodes). You can create multiple warehouses for different workloads (e.g., ETL, BI, development) and they can be suspended when not in use to save credits. Key properties: size, auto-suspend, auto-resume, and multi-cluster (for concurrency).

create_warehouse.sqlSQL
1
2
3
4
5
6
7
8
9
-- Create a virtual warehouse
CREATE WAREHOUSE my_wh
  WITH WAREHOUSE_SIZE = 'XSMALL'
  AUTO_SUSPEND = 300
  AUTO_RESUME = TRUE
  INITIALLY_SUSPENDED = TRUE;

-- Show all warehouses
SHOW WAREHOUSES;
Output
+---------+--------+------+-------------+...+
| name | size | state | auto_suspend|...|
+---------+--------+------+-------------+...+
| MY_WH | XSmall | Suspended | 300 |...|
+---------+--------+------+-------------+...+
🔥Warehouse Sizing
📊 Production Insight
Always start with X-Small for development. Only increase size when queries are CPU-bound or spill to remote storage.
🎯 Key Takeaway
Virtual warehouses are independent compute clusters that you can size and suspend to control performance and cost.

Sizing a Warehouse: How to Choose the Right Size

Choosing the right warehouse size depends on the workload. For small data loads or simple queries, X-Small or Small is sufficient. For complex aggregations on large tables, consider Large or larger. A common approach: start with Medium, monitor query performance, and adjust. Use the QUERY_HISTORY view to check bytes_spilled_to_remote_storage—if >0, the warehouse is too small. Also check average execution time. Rule of thumb: double the size until spillage disappears or performance plateaus.

check_spillage.sqlSQL
1
2
3
4
5
6
7
-- Check queries that spilled to remote storage
SELECT query_id, warehouse_size, bytes_spilled_to_remote_storage, execution_time
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE warehouse_name = 'MY_WH'
  AND start_time > DATEADD('day', -1, CURRENT_TIMESTAMP())
  AND bytes_spilled_to_remote_storage > 0
ORDER BY bytes_spilled_to_remote_storage DESC;
Output
+----------+----------------+----------------------------------+-----------------+
| QUERY_ID | WAREHOUSE_SIZE | BYTES_SPILLED_TO_REMOTE_STORAGE | EXECUTION_TIME |
+----------+----------------+----------------------------------+-----------------+
| 12345 | Medium | 500000000 | 12000 |
+----------+----------------+----------------------------------+-----------------+
💡Sizing Strategy
📊 Production Insight
Beware of 'one-size-fits-all'—different queries may need different warehouses. Use separate warehouses for ETL, reporting, and ad-hoc queries.
🎯 Key Takeaway
Monitor spillage and execution time to right-size warehouses. Double size until spillage is zero.

Auto-Suspend and Auto-Resume: Saving Credits

Auto-suspend automatically suspends a warehouse after a period of inactivity (default 10 minutes). Auto-resume starts it again when a query is submitted. This is critical for cost savings—idle warehouses still consume credits. Set auto-suspend to a low value (e.g., 60 seconds) for development warehouses. For production, 5-10 minutes is common to avoid frequent restarts. You can also manually suspend warehouses with ALTER WAREHOUSE ... SUSPEND.

alter_auto_suspend.sqlSQL
1
2
3
4
5
6
7
8
-- Set auto-suspend to 1 minute
ALTER WAREHOUSE my_wh SET AUTO_SUSPEND = 60;

-- Suspend warehouse immediately
ALTER WAREHOUSE my_wh SUSPEND;

-- Resume warehouse
ALTER WAREHOUSE my_wh RESUME;
Output
Statement executed successfully.
⚠ Auto-Resume Latency
📊 Production Insight
Use resource monitors to cap credit usage per warehouse or account. Example: CREATE RESOURCE MONITOR my_monitor WITH CREDIT_QUOTA = 1000;
🎯 Key Takeaway
Auto-suspend is your primary cost control. Set it aggressively for non-production warehouses.

Multi-Cluster Warehouses: Handling Concurrency

Multi-cluster warehouses allow Snowflake to automatically add or remove clusters (up to a max) based on query concurrency. This is ideal for variable workloads like BI dashboards. Configure MIN_CLUSTER_COUNT and MAX_CLUSTER_COUNT. When queries queue, Snowflake adds clusters up to MAX. When concurrency drops, clusters are removed. Each cluster is a full warehouse of the specified size, so costs multiply. Use multi-cluster only when concurrency is unpredictable.

create_multi_cluster.sqlSQL
1
2
3
4
5
6
7
8
9
10
-- Create a multi-cluster warehouse
CREATE WAREHOUSE bi_wh
  WITH WAREHOUSE_SIZE = 'MEDIUM'
  MIN_CLUSTER_COUNT = 1
  MAX_CLUSTER_COUNT = 5
  AUTO_SUSPEND = 300
  AUTO_RESUME = TRUE;

-- Alter existing warehouse to enable multi-cluster
ALTER WAREHOUSE my_wh SET MIN_CLUSTER_COUNT = 2 MAX_CLUSTER_COUNT = 10;
Output
Statement executed successfully.
🔥Multi-Cluster Cost
📊 Production Insight
Monitor WAREHOUSE_LOAD_HISTORY to see how many clusters were active. If MAX is always reached, consider increasing size instead of adding more clusters.
🎯 Key Takeaway
Use multi-cluster to handle concurrent queries automatically. Set MAX_CLUSTER_COUNT to limit cost.

Best Practices for Warehouse Configuration

  1. Use separate warehouses for different workloads (ETL, BI, ad-hoc). 2. Start with X-Small and scale up based on monitoring. 3. Set auto-suspend to 1-5 minutes for dev, 5-10 for prod. 4. Enable multi-cluster only when concurrency is an issue. 5. Use resource monitors to set credit quotas. 6. Regularly review warehouse usage in ACCOUNT_USAGE views. 7. Consider using 'Warehouse Sizing' recommendations from Snowflake's UI.
resource_monitor.sqlSQL
1
2
3
4
5
6
7
8
9
10
-- Create a resource monitor
CREATE RESOURCE MONITOR daily_limit
  WITH CREDIT_QUOTA = 500
  FREQUENCY = 'DAILY'
  START_TIMESTAMP = '2024-01-01 00:00:00'
  TRIGGERS ON 80 PERCENT DO NOTIFY
           ON 100 PERCENT DO SUSPEND;

-- Assign monitor to warehouse
ALTER WAREHOUSE my_wh SET RESOURCE_MONITOR = daily_limit;
Output
Statement executed successfully.
💡Warehouse Monitoring
📊 Production Insight
Set up alerts for credit usage spikes using Snowflake's notification integration.
🎯 Key Takeaway
Combine sizing, auto-suspend, multi-cluster, and resource monitors for optimal cost and performance.

Real-World Example: ETL vs. BI Workloads

Consider a company with two main workloads: daily ETL that loads and transforms large tables, and a BI dashboard with many concurrent users. For ETL, use a Large warehouse (or bigger) to process data quickly, with auto-suspend set to 10 minutes (since it runs once daily). For BI, use a Medium multi-cluster warehouse with MIN=1, MAX=5 to handle variable concurrency, auto-suspend 5 minutes. This separation ensures ETL doesn't impact BI performance and costs are isolated.

etl_bi_setup.sqlSQL
1
2
3
4
5
6
7
8
9
10
11
12
13
-- ETL warehouse
CREATE WAREHOUSE etl_wh
  WITH WAREHOUSE_SIZE = 'LARGE'
  AUTO_SUSPEND = 600
  AUTO_RESUME = TRUE;

-- BI warehouse
CREATE WAREHOUSE bi_wh
  WITH WAREHOUSE_SIZE = 'MEDIUM'
  MIN_CLUSTER_COUNT = 1
  MAX_CLUSTER_COUNT = 5
  AUTO_SUSPEND = 300
  AUTO_RESUME = TRUE;
Output
Statement executed successfully.
🔥Workload Isolation
📊 Production Insight
Tag warehouses with metadata (e.g., COMMENT) to identify purpose: COMMENT 'ETL warehouse for daily loads'.
🎯 Key Takeaway
Isolate workloads into separate warehouses to avoid interference and simplify cost tracking.
● Production incidentPOST-MORTEMseverity: high

The $10,000 Query: How an Oversized Warehouse Burned Credits

Symptom
Monthly Snowflake bill doubled. Finance flagged the account.
Assumption
The team assumed a larger warehouse would always speed up queries, so they set all warehouses to X-Large or larger.
Root cause
Queries that processed small data volumes (e.g., a few hundred rows) were run on 6X-Large warehouses, incurring high credit consumption with no performance benefit.
Fix
Resized warehouses appropriately: X-Small for light development, Small for small data loads, Medium for typical reporting. Implemented resource monitors to cap credit usage.
Key lesson
  • Match warehouse size to query complexity and data volume.
  • Use X-Small or Small for development and testing.
  • Set resource monitors to alert on unexpected credit spikes.
  • Leverage auto-suspend (e.g., 5 minutes) to avoid idle costs.
  • Monitor warehouse usage with ACCOUNT_USAGE views.
Production debug guideSymptom to Action4 entries
Symptom · 01
Queries are slow despite large warehouse
Fix
Check if queries are spilling to remote disk (QUERY_HISTORY view). If so, increase warehouse size or optimize query.
Symptom · 02
High credit consumption
Fix
Review warehouse usage in ACCOUNT_USAGE.WAREHOUSE_METERING_HISTORY. Look for warehouses with long idle times; reduce auto-suspend timeout.
Symptom · 03
Queries queuing (concurrency issues)
Fix
Enable multi-cluster warehouse with min/max clusters. Check QUEUED_OVERLOAD_TIME in QUERY_HISTORY.
Symptom · 04
Warehouse not scaling up as expected
Fix
Verify that multi-cluster is enabled and that the warehouse is not already at max clusters. Check for resource monitors limiting credits.
★ Quick Debug Cheat SheetCommon warehouse issues and immediate actions
Slow query on large warehouse
Immediate action
Check query profile for spillage
Commands
SELECT * FROM TABLE(INFORMATION_SCHEMA.QUERY_HISTORY_BY_WAREHOUSE(WAREHOUSE_NAME=>'MY_WH', RESULT_LIMIT=>10)) ORDER BY START_TIME DESC;
SELECT query_id, warehouse_size, credits_used, bytes_spilled_to_remote_storage FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY WHERE warehouse_name='MY_WH' AND start_time > DATEADD('hour', -1, CURRENT_TIMESTAMP());
Fix now
Resize warehouse to next size up or optimize query
High credit usage+
Immediate action
Check auto-suspend setting
Commands
SHOW WAREHOUSES;
ALTER WAREHOUSE MY_WH SET AUTO_SUSPEND = 60;
Fix now
Set auto-suspend to 1-5 minutes
Queries queuing+
Immediate action
Enable multi-cluster
Commands
ALTER WAREHOUSE MY_WH SET MIN_CLUSTER_COUNT = 1 MAX_CLUSTER_COUNT = 5;
SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.WAREHOUSE_LOAD_HISTORY WHERE WAREHOUSE_NAME='MY_WH' ORDER BY START_TIME DESC;
Fix now
Increase max clusters or reduce concurrency
Warehouse SizeNodesvCPUsMemory (GB)Credits per Hour
X-Small18641
Small2161282
Medium4322564
Large8645128
X-Large16128102416
2X-Large32256204832
3X-Large64512409664
4X-Large12810248192128
⚙ Quick Reference
6 commands from this guide
FileCommand / CodePurpose
create_warehouse.sqlCREATE WAREHOUSE my_whWhat is a Virtual Warehouse?
check_spillage.sqlSELECT query_id, warehouse_size, bytes_spilled_to_remote_storage, execution_timeSizing a Warehouse
alter_auto_suspend.sqlALTER WAREHOUSE my_wh SET AUTO_SUSPEND = 60;Auto-Suspend and Auto-Resume
create_multi_cluster.sqlCREATE WAREHOUSE bi_whMulti-Cluster Warehouses
resource_monitor.sqlCREATE RESOURCE MONITOR daily_limitBest Practices for Warehouse Configuration
etl_bi_setup.sqlCREATE WAREHOUSE etl_whReal-World Example

Key takeaways

1
Virtual warehouses are independent compute clusters that you can size, suspend, and scale.
2
Right-size warehouses by monitoring spillage and execution time; start small and scale up.
3
Auto-suspend is essential for cost control; set it aggressively for non-production.
4
Multi-cluster warehouses handle variable concurrency but multiply costs; use sparingly.
5
Isolate workloads into separate warehouses for performance and cost tracking.

Common mistakes to avoid

4 patterns
×

Using a single warehouse for all workloads

×

Setting auto-suspend too high (e.g., 1 hour)

×

Over-provisioning warehouse size for small queries

×

Enabling multi-cluster without monitoring

INTERVIEW PREP · PRACTICE MODE

Interview Questions on This Topic

Q01JUNIOR
What is a Snowflake virtual warehouse?
Q02SENIOR
How does multi-cluster warehousing work?
Q03SENIOR
How would you troubleshoot a sudden spike in credit usage?
Q01 of 03JUNIOR

What is a Snowflake virtual warehouse?

ANSWER
A virtual warehouse is a cluster of compute resources (CPU, memory, cache) that executes SQL queries and DML operations. It is separate from storage and can be sized, suspended, and scaled independently.
FAQ · 5 QUESTIONS

Frequently Asked Questions

01
What is the difference between warehouse size and multi-cluster?
02
Can I change warehouse size without downtime?
03
How do I know if my warehouse is too small?
04
What is the cost of a multi-cluster warehouse?
05
Should I use auto-resume?
N
Naren Founder & Principal Engineer

20+ years shipping high-throughput database systems. Drawn from code that ran under real load.

Follow
Verified
production tested
July 17, 2026
last updated
2,439
articles · all by Naren
🔥

That's Snowflake. Mark it forged?

3 min read · try the examples if you haven't

Previous
Databases, Schemas, Tables, and Data Types
4 / 33 · Snowflake
Next
Data Loading: Stages, COPY INTO, and File Formats