DataXPipe
Best Practices

Snowflake Warehouse Sizing for ETL (Without Idle Compute)

Right-size Snowflake warehouses for batch pipelines: XS vs S vs M, auto-suspend, one warehouse per workload, and checks so retries do not scale you up by accident.

DataXPipe Team Updated August 12, 2026
  • snowflake
  • warehouse
  • sizing
  • etl
Diverse team engaging in a collaborative meeting with charts and laptops.
Photo by fauxels on Pexels

Snowflake warehouse sizes look simple until the ETL bill arrives. Teams scale from XS to L because a DAG “felt slow,” leave warehouses running between hourly jobs, and then scale up again when a silent failure triggers retries.

Warehouse sizing is a pipeline contract problem: which job, which warehouse, which SLA, who owns the cost.

Start with workload, not a default Medium

WorkloadTypical sizeWhy
Incremental MERGE on a few million rowsXS–SMost batch loads are latency-tolerant
Large COPY INTO / first backfillM–L, then scale downBurst, then return to S
dbt tests + freshness SQLXSMetadata queries should not share an L warehouse with transforms
Concurrent hourly martsSeparate S warehouses, not one LIsolation beats a bigger shared pool

If every pipeline uses TRANSFORM_WH_L, you cannot tell which DAG caused the spike. Put the warehouse name on the pipeline spec and in the catalog.

Auto-suspend is not optional

For scheduled ETL:

  • Auto-suspend: 60 seconds for bursty jobs; 5 minutes only if the next task in the DAG is guaranteed within that window.
  • Auto-resume: on.
  • Minimum cluster count: 1 unless you have proven query queuing during the batch window.

Idle warehouses are the most common “we sized up” mistake. An S that suspends beats an M that sits warm for 50 minutes after orders_daily_sync finishes.

Do not scale up to hide stale data

A classic incident:

  1. mart.executive_kpis is 38 hours stale.
  2. Airflow still reports SUCCESS (the COPY finished; the source was empty).
  3. Someone resizes the warehouse and re-runs the DAG.
  4. Snowflake credits spike; the table is still stale.

Size does not fix a missing increment. Add a freshness check on the target and revoke the Pipeline Passport when it fails. Then debug the source — silent failures are cheaper than a larger warehouse.

One warehouse per SLA class

Group pipelines by when they must finish, not by team Slack channel:

  • ETL_BATCH_S — nightly finance loads, 2 a.m. window
  • ETL_HOURLY_XS — product analytics micro-batch
  • ADHOC_XS — analysts; never the same warehouse as SLA pipelines

When a check fails, lineage should answer: warehouse, pipeline, downstream dashboards. That is what a Pipeline Passport is for.

Snowflake connector example (catalog)

In DataXPipe, register the connection once, then reference it from specs so checks run against the same warehouse the transform uses. See the Snowflake connector example for auth, role, and check SQL.

Practical next steps

  1. List warehouses used by production DAGs and kill any without auto-suspend.
  2. Move dbt tests off the transform warehouse.
  3. Attach freshness checks to the three marts leadership actually opens.
  4. Import the DAGs into DataXPipe so warehouse, owner, and checks sit on one catalog entry.

Start free — 2 pipelines · See pricing