ducklens
Warehouse Fit Report · snowflake
2026-03-17 to 2026-06-14 (90d) · 25,000 queries · 5 warehouses

What fits on one machine

39%of your Snowflake bill is query compute that fits on one DuckDB machine

$43,442/yr movable of a $112,348/yr invoice · 69% of attributed query compute · 43% of queries

Recommendation2 MOVE2 SPLIT1 KEEPof 5 warehouses
$112,348
bill analyzed / yr
$43,442
movable to DuckDB / yr
$9,652
runs at (box + storage) / yr

Where your Snowflake bill goes

$112,348/yr, every dollar colored by what to do with it. A cost dashboard stops at the first column.

Movable to DuckDB$43,442/yr · 39%
Must stay (residual)$19,298/yr · 17%
Idle warehouse time$37,286/yr · 33%
Serverless / cloud services$12,322/yr · 11%

Gross annual saving

$28,722 - $38,859 / yr

central $33,791 run-rate delta: migrate $43,442/yr of compute, run it at ~$9,652/yr. Excludes one-time migration, dual-running, egress, at-rest storage, ops.

Hybrid split

Each warehouse scored on its own bill: MOVE wholesale, SPLIT the movable queries off, or KEEP as is.

WarehouseFitSpend/yrVerdictTop blocker
AD_HOC_WH77%$18,665SPLITwarehouse-specific SQL (heuristic)
ANALYTICS_WH79%$17,103SPLITwarehouse-specific SQL (heuristic)
BI_SERVING_WH37%$15,032KEEPhigh-concurrency serving
DBT_WH85%$8,926MOVEmulti-statement write transactions
LOAD_WH81%$3,015MOVEcontinuous high-frequency writes

Before a MOVE, clear: inbound/outbound Secure Data Shares · RBAC/row-access/masking policies · downstream BI & reverse-ETL · Streams/Tasks/Dynamic Tables · data residency/compliance.

What must stay, and why

ReasonSpend/yrQueries
high-concurrency serving$5,9026,048
warehouse-specific SQL (heuristic)$5,784899
multi-statement write transactions$3,295687
multi-cluster scale-out$1,469798
stored procedures / UDFs$1,317177
continuous high-frequency writes$1,0455,312
queued / overloaded$485273

Top blockers

The costliest queries keeping a warehouse on Snowflake.

QueryWarehouseReasonSpend/yr
982355990f72... CREATE TABLE stg_orders AS SELECT * FROM raw.ordersAD_HOC_WHmulti-statement write transactions$57
01e3f6d154b7... INSERT INTO target SELECT * FROM stagingAD_HOC_WHmulti-statement write transactions$44
794ec926bc9e... INSERT INTO target SELECT * FROM stagingAD_HOC_WHmulti-statement write transactions$42
be806943707d... SELECT * FROM TABLE(GENERATOR(ROWCOUNT => 1000))AD_HOC_WHwarehouse-specific SQL (heuristic)$41
ed22f249555b... INSERT INTO target SELECT * FROM stagingAD_HOC_WHmulti-statement write transactions$41
97801d0e3e1f... INSERT INTO target SELECT * FROM stagingAD_HOC_WHmulti-statement write transactions$41
280f47eb33bc... CALL refresh_marts()AD_HOC_WHstored procedures / UDFs$40
e3803de21a67... SELECT PARSE_JSON(payload):user:id::string AS uid FROM eventsAD_HOC_WHwarehouse-specific SQL (heuristic)$40

If the box had more disk

Fit recomputed at other local-NVMe sizes; DuckDB spills to disk, so disk is the spill budget.

Local NVMeFit % of query computeMovable $/yr
2 TB69%$43,419
4 TB69%$43,442
7.5 TB (target)69%$43,442
8 TB69%$43,442
16 TB69%$43,442
30 TB69%$43,442

Assumptions

256 GB RAM + NVMe box at $800/mo (an r6id.4xlarge-class instance, reserved, incl. ops headroom) + object-storage reads at $0.50/TiB, full re-read assumed (no cache credit). Pricing basis: $3.00/credit (enterprise). The ±15% band is illustrative, not a confidence interval.

Caveats