< blog
5 min read

The Truth About Snowflake Query Costs, And How to Lower Them

Blurred SQL SELECT statements on a blue grid with yellow dollar signs

Snowflake is widely praised for its scalability and performance, but cost control often remains a black box. Many teams rely on simplified query cost estimates that don’t reflect how Snowflake actually bills usage. In this post, we’ll break down the underlying factors that drive cost per query and show how a more accurate method can lead to smarter optimization and lower spend.

Decoding Snowflake cost per query

Several key components contribute to your Snowflake bill: compute usage, query complexity, execution plans, and supporting services. For most users, compute costs represent the largest portion of total spend. Understanding how these costs are incurred is crucial for effective optimization.

Compute costs: virtual warehouse size and runtime

Virtual Warehouses are Snowflake’s core compute engines, built as massively parallel processing clusters. Each cluster consists of multiple virtual machines and offers elastic, horizontal scaling. Snowflake doubles processing power, memory, and SSD capacity with each increase in warehouse size, ensuring predictable and linear performance scaling.

While larger warehouses do incur higher costs per unit of time, a common misconception is that bigger always means more expensive. In reality, larger warehouses can often reduce total cost of ownership by completing queries faster and more efficiently. It’s essential to evaluate the full picture: query complexity, execution plan, and overall load all influence true cost.

Warehouse and cluster size determine the resources available per query. Importantly, Snowflake charges based on warehouse uptime, not query duration. This means query concurrency significantly impacts cost calculations.

See credit map illustrating warehouse sizes, available resources per query, and corresponding credit costs.

Larger warehouses offer more memory and processing power, allowing for faster execution—if the query plan can leverage parallelization. Once the limit of parallel execution is reached, additional resources provide diminishing returns and can drive up costs unnecessarily.

 

Compute costs: concurrency

Another key factor influencing query cost is concurrency. An X-Small (XS) warehouse is powered by one virtual machine with 8 cores. As warehouse sizes grow, the number of cores increases—but the default concurrency limit remains 8 queries, whether using XS or 6XL.

Concurrency can be adjusted via the MAX_CONCURRENCY_LEVEL parameter or by increasing cluster count. For example:

  • If MAX_CONCURRENCY_LEVEL is set to 8, one active cluster handles 8 parallel queries.
  • If two clusters are active, the limit doubles to 16 parallel queries.

However, it’s uncommon and risky,to increase MAX_CONCURRENCY_LEVEL beyond 8. While technically possible, doing so often results in performance degradation due to queuing. We’ve observed multiple use cases where increasing it to 24 or 32 caused noticeable slowdowns.

 

Calculating cost per query

Flawed approach

The most common (and incorrect) way to calculate cost per query is to look at query duration in isolation and multiply it by the warehouse’s per-hour cost. For example:

  • 1-minute query on an X-Small warehouse (1 credit/hour) = 1/60 x $3 = $0.05

This is flawed for two reasons:

  1. Concurrency Ignored: Multiple queries may be running at once. Since Snowflake bills uptime, not per-query runtime, the cost is overestimated.
  2. Auto-Suspend Ignored:A single 1-second query may trigger several minutes of billed time if auto-suspend is set to 300 seconds, underestimating the cost.

In short, this method produces skewed results.

Improved method

Since billing is based on warehouse uptime, a more accurate approach allocates costs based on that uptime. Here’s how we do it at Seemore Data:

  1. Treat each warehouse uptime as a single event.
  2. Group all queries that ran during that uptime.
  3. Calculate total query duration.
  4. Allocate a percentage of total time to each query.
  5. Multiply those percentages by total warehouse uptime to get “normalized query runtimes.”
  6. Apply cost per second based on warehouse type and compute the “normalized cost per query.”

This method correctly accounts for concurrency, idle time, and avoids the distortion seen in simpler models.

Let’s walk through a real example:

  • A Small warehouse runs for 53 seconds.
  • Query processing takes 38 seconds, with 10 seconds of idle time.

 

Queries:

  • Query 1: 10s
  • Query 2: 24s
  • Query 3: 4s
  • Query 4: 6s
  • Total query duration: 44s

 

Percentage allocation:

  • Q1: 22%
  • Q2: 55%
  • Q3: 9%
  • Q4: 14%

 

Normalized query runtimes:

  • Q1: 12s
  • Q2: 29s
  • Q3: 5s
  • Q4: 7s

 

Cost per second (Small warehouse @ 2 credits/hour = $6/hour = $0.0017/second):

  • Q1: 12s x $0.0017 = $0.02
  • Q2: 29s x $0.0017 = $0.05
  • Q3: 5s x $0.0017 = $0.008
  • Q4: 7s x $0.0017 = $0.012

 

Check:

  • Total warehouse cost: 53s x $0.0017 = $0.09
  • Sum of query costs: $0.02 + $0.05 + $0.008 + $0.012 = $0.09

 

✅ Aligned.

 

Why this matters

Snowflake’s pricing model rewards efficient resource usage,but only if you understand how it works. Simple cost-per-query estimates often lead teams astray, inflating or underestimating expenses and obscuring optimization opportunities. By using a normalized, warehouse-uptime-based approach, you get a clearer picture of true query costs,and a better foundation for cost control.

What to do next

If you’re aiming to lower your Snowflake spend without compromising performance, precision matters. At Seemore Data, we specialize in uncovering the real story behind your warehouse metrics. Want to see how much you could save? Schedule a consultation  with our data optimization experts today.

Should you migrate to Gen2?
Abstract data center with glowing streams of binary code
12 min read

Modern Data Stack Architecture: Building Scalable and Efficient Data Pipelines

the standalone hero blog thumbnail, presented as a single file on its own canvas. It features a browser-like frame with rounded corners (radius 18), the three window dots at the top left, and a clean background (light off-white #F7FBFC) with a thin navy blue (#001049) outline. At the center is a large, winking, smiling pink piggy bank. On the left side, inside the frame, there is a bar chart visualization of inefficient Snowflake warehouse usage, showing high idle minutes flagged with red alert flags and waste-category colors. On the right side, inside the frame, there is a line graph showing a clear downward trend in estimated cost savings with success-category colors. Prominent text in navy blue (#001049) Poppins font integrated inside the screen frame reads: "BENCHMARK YOUR SNOWFLAKE EFFICIENCY: UNLOCK SAVINGS". Integrated H2 header text integrated above the image is omitted, and no colored blocks are present on the far left or right margins within the overall screen frame. The entire image has the clean Seemore Data brand aesthetic .
7 min read

Snowflake Cost Optimization: Benchmark Warehouse Efficiency and Unlock Savings

Snowflake ROUND Function
15 min read

Snowflake ROUND Function Explained: A Quick Guide

Cool, now
what can you DO with this?

data ROI