Skip to main content
Metrics type: Key MetricsCategory: Performance

At a glance

Slow-Query Rate % is the share of queries in the window whose total elapsed time crossed the “slow” threshold, expressed as a percentage of all queries that ran. It answers a question a single latency percentile cannot: not “how slow is my worst query?” but “what fraction of my workload is painful right now?” For a platform team, a creeping slow-query rate is the early tremor before a saturation incident: warehouses starting to queue, a partner pushing unbounded scans, or a stats-stale table forcing full scans where a prune should have happened.

Calculation

The card divides the count of slow queries by the count of all completed queries in the rolling hour and multiplies by 100:
TOTAL_ELAPSED_TIME in QUERY_HISTORY is the full wall-clock duration of the query: compilation, queueing (provisioning and overload), and execution combined. The card uses elapsed rather than execution-only time on purpose, because a query that “executed” in 2s but sat queued for 40s is slow from the consumer’s point of view; queue time is part of the user’s pain. The slow threshold is configurable per profile in the Alert Rules tab; for Snowflake analytics workloads it is commonly set in the multi-second range (Snowflake latency is naturally measured in seconds, not milliseconds), so the default should be tuned to your workload shape rather than borrowed from an OLTP database. Two filters keep the denominator honest. First, only queries with a terminal EXECUTION_STATUS of SUCCESS or FAIL count; queries still running or in BLOCKED state are excluded so the live tail does not skew the ratio. Second, system and metadata queries (cache-only lookups, SHOW/DESCRIBE, results-reuse hits with zero scan) are excluded where the engine can identify them, because counting near-instant metadata calls in the denominator would mask a genuinely degrading analytical workload. The result is a rate that reflects the queries a human or a job actually waited on.

Worked example

A data platform team supports a BI estate where roughly 1,200 queries run per hour against the BI_WH (Medium) and LOAD_WH (Large) warehouses. Their slow threshold is set to 30 seconds, alert at > 5%. Snapshot taken on 22 Apr 26 at 14:00 BST. At 14:00 the rate jumps to 7.6% and Nerve Centre pages. Latency percentiles alone would have been ambiguous (the p95 moved only modestly), but the rate makes it obvious that a large slice of the workload is now slow.
The fix is two-layered. Immediately, the team moves the offending dashboard to a dedicated EMBED_WH so it can no longer starve BI_WH, and the slow-query rate on BI_WH falls back to 2.4% within the next window. Structurally, they push the partner to add a date predicate so the tile prunes by micro-partition instead of full-scanning, which removes the slow queries entirely rather than just isolating them. Three takeaways for the team:
  1. Rate catches breadth; percentiles catch depth. p95/p99 tell you how bad the worst queries are; slow-query rate tells you how widespread the pain is. A small number of catastrophic queries can leave the rate low; this card is the “how much of my workload hurts” view.
  2. Queue time counts as slow. Because the metric uses elapsed (not execution) time, warehouse queueing inflates the rate directly. A jump in slow-query rate with no change in scanned bytes points at saturation, not bad SQL.
  3. Isolation buys time; pruning fixes it. Moving a noisy workload to its own warehouse stops it starving others, but the credits still burn. The durable fix is making the query prune properly.

Sibling cards

Reconciling against the source

Where to look in Snowflake’s own tooling:
Query SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY filtering on START_TIME within your hour and TOTAL_ELAPSED_TIME >= threshold, divided by total rows, to recompute the rate by hand. For the recent window with no ACCOUNT_USAGE delay, use the INFORMATION_SCHEMA.QUERY_HISTORY table function. In Snowsight, open Monitoring to Query History, filter by duration and warehouse, and sort by total duration to see the slow set directly.
Why our number may legitimately differ from Snowflake’s view:

Known limitations / FAQs

What counts as a “slow” query? A completed query whose TOTAL_ELAPSED_TIME (compile plus queue plus execute) is at or above the slow threshold configured for your profile. Because Snowflake latency is naturally in the seconds range for analytics, the default threshold is set in seconds, not milliseconds. Tune it in the Alert Rules tab to your workload; an OLTP-style cutoff will flag almost everything. My p95 looks fine but the slow-query rate is high. How? The two answer different questions. p95 reports the duration at the 95th percentile (depth of the tail); the rate reports how large a fraction crossed your line (breadth). Many queries clustered just over the threshold raise the rate while leaving p95 only mildly elevated. Read both: rate for breadth, percentiles for depth. Does queue time inflate this number? Yes, deliberately. The metric uses elapsed time, which includes provisioning and overload queue time. A query that executed quickly but waited 40s in a queue is slow from the consumer’s perspective, so it counts. If your rate jumps with no change in scanned data, suspect warehouse saturation and check Avg Query Queue Depth per Warehouse. Why exclude metadata and cache-only queries from the denominator? A workload can fire thousands of near-instant SHOW, DESCRIBE, and results-reuse calls. Counting them in the denominator would mathematically suppress the rate and hide a genuinely degrading analytical workload behind a wall of trivial calls. The card focuses the ratio on queries someone actually waited on. The rate spiked for one hour then returned to normal. Was it a real problem? Often yes, but transient. A single bad dashboard release, an ad-hoc unbounded scan, or a one-off bulk load can spike the rate for an hour. The card’s job is to make that spike visible so you can decide whether it is a one-off or a pattern. Use Top 10 Slowest Queries for the hour to identify whether it was a recurring query text. Can a high slow-query rate cost me money even if nothing fails? Yes. Slow queries hold compute longer and often scan more, both of which burn credits, and queueing keeps warehouses running at full tilt. A sustained high rate usually shows up as elevated Avg Cost per Query ($) and Credits Burned (24h). Performance and cost move together here. Does results caching skew the rate downward? It can, in your favour, and that is accurate. A query served entirely from the results cache returns in milliseconds and is genuinely fast for the user, so excluding or fast-counting it is correct. The risk is the opposite: if cache hit rates fall (for example after a data load invalidates results), previously fast queries re-run cold and the slow-query rate can rise even though no SQL changed.

Tracked live in Vortex IQ Nerve Centre

Slow-Query Rate % is one of hundreds of KPI pulses Vortex IQ tracks across Snowflake and 70+ other ecommerce connectors. Nerve Centre runs the detection layer; Vortex Mind investigates the cause when something moves; Ask Viq lets you interrogate any number in plain English. Start for free or book a demo to see this metric running on your own data.