skip to content

For which workloads is Snowflake's separated storage-and-compute architecture the wrong choice?

level: principalimportance: nice to knowfreq 35%

answer

  1. the engine is built to scan, not to seek
  2. tiny units of work expose fixed overhead
  3. a warehouse that can never suspend is a warning sign
  4. some declarations are documentation, not enforcement
  5. serve users from somewhere else, analyze here

basics

~20 s

Snowflake fits scan-heavy analytics over one shared dataset. It is a poor fit for high-concurrency single-row lookups with tight latency budgets, row-at-a-time OLTP writes, and applications needing enforced primary and foreign keys — those belong in a transactional or key-value store fed from the warehouse.

solid answer

~50 s

The architecture optimizes for **scanning a lot of columnar data in parallel from shared object storage**, with compilation and planning centralized in cloud services. That model works against you when the unit of work is tiny and the latency budget is tight. Poor fits: an application endpoint doing thousands of single-row lookups per second with a sub-100 ms SLA; high-frequency row-at-a-time inserts and updates, which produce many small files and heavy rewrite churn; anything needing the database to *enforce* primary or foreign keys, since in Snowflake all constraints except `NOT NULL` are informational only; and iterative row-by-row procedural logic. The standard architecture is to keep Snowflake as the analytical system of record and serve low-latency traffic from a transactional store, a key-value store or a cache populated from it. Snowflake has been extending toward row-oriented access with Hybrid Tables, so check current availability before ruling it out entirely.

go deeper

for a junior

Recall the basic division of labour: a warehouse is for analytical queries over lots of rows, while application read/write traffic belongs in a transactional database.

for a middle

Explain why the mismatch exists — columnar scanning, per-query compilation, file rewrites on updates — rather than just asserting that Snowflake is not OLTP.

for a senior

Diagnose it in a live system: a warehouse that can never suspend, mounting small-file churn, MERGE contention, and duplicates in a table whose PRIMARY KEY was assumed to be enforced.

for a principal

Own the platform boundary and the cost case. Define what lives in the warehouse versus a serving store, negotiate the freshness contract between them, and revisit the line as vendor capabilities such as row-oriented tables mature.

## What the architecture is tuned for Every design choice in Snowflake points at one workload shape: read a large amount of columnar data from shared object storage, in parallel, with the plan compiled once centrally. Immutable files, per-file statistics for pruning, elastic stateless compute, a shared result cache — all of it pays off when queries touch many rows and few columns. The corollary is that the model is misaligned when the unit of work is one row and the latency budget is tens of milliseconds. ## Where it is the wrong tool **High-concurrency point lookups behind an application.** A user-facing endpoint doing `SELECT ... WHERE customer_id = ?` thousands of times per second is asking a scan engine to behave like a key-value store. Even with clustering and Snowflake's search optimization service reducing the data touched, you still pay per-query compilation in cloud services and a network hop to object storage on a cold cache — and you are paying warehouse credits continuously to keep compute warm for it. A PostgreSQL replica, a key-value store, or a cache fed from Snowflake will serve that traffic for a fraction of the cost and latency. **Row-at-a-time OLTP writes.** Small, frequent `INSERT`s and `UPDATE`s fight the storage model twice. Small writes create small files, which hurts later scan efficiency until data is consolidated. Row-modifying DML rewrites files and serializes on a table lock, so a workload of many concurrent single-row updates queues rather than scaling. Batch or micro-batch ingestion is the intended pattern. **Workloads that need enforced referential integrity.** Snowflake accepts `PRIMARY KEY`, `UNIQUE` and `FOREIGN KEY` declarations for documentation and for optimizer hints, but does **not** enforce them — `NOT NULL` is the exception. If your correctness model assumes the database will reject a duplicate key, you must move that enforcement into the pipeline or into an upstream transactional system. This is a genuine architectural constraint, not a tuning detail, and interviewers like it because candidates who have only read about Snowflake usually miss it. **Iterative, row-by-row procedural logic.** Cursor loops and per-row procedure calls run against an engine built for set-at-a-time vectorized work. Rewrite as set operations, or do the work elsewhere. **Very small, very frequent queries where fixed overhead dominates.** If the query itself touches megabytes, compilation and dispatch can be a large fraction of total time, and the elasticity you are paying for buys nothing. ## The cost dimension of the same argument The billing model rewards bursty, heavy work: run a big warehouse briefly, suspend it, pay nothing while idle. It punishes thin, continuous work: a warehouse that must never suspend because a trickle of latency-sensitive queries keeps arriving is billing continuously for compute that is mostly idle, while delivering worse latency than a much cheaper purpose-built store. When you catch a team asking for lower auto-suspend *and* lower latency at once, that is usually the signal that the workload belongs somewhere else. ## Where it is emphatically the right tool Stating the boundary in both directions is what makes this a judgment answer rather than a criticism. Snowflake is strong for: large scan-and-aggregate analytics; many independent teams needing isolated compute over one governed copy of the data; unpredictable or bursty demand where paying only for what runs beats provisioning a peak-sized cluster; semi-structured data landed and queried without a rigid up-front schema; and sharing data across teams, accounts or organizations without shipping copies. ## The architecture to propose instead The common resolution is not "pick one" but a split with a defined boundary: - Snowflake as the analytical system of record and transformation engine. - A serving store — relational, key-value, or search — populated from it for user-facing low-latency access. - A defined refresh path and freshness SLA between them, so the serving layer's staleness is an explicit product decision rather than an accident. And note the moving target honestly: Snowflake has been extending into row-oriented, point-access workloads with Hybrid Tables, so the boundary is not fixed. Verify current capability and availability for your region and edition rather than repeating an old rule of thumb — and say exactly that in an interview, because acknowledging that a vendor boundary moves is itself a senior signal. ## How to answer this well Name the workload shapes, not the vendor. "Sub-100 ms single-row reads at high concurrency, high-frequency small writes, and enforced referential integrity" is a crisp answer that generalizes to any scan-oriented warehouse. Then give the split architecture and the freshness contract between the halves.

  • Which Snowflake table constraints are actually enforced?
    Only NOT NULL. PRIMARY KEY, UNIQUE and FOREIGN KEY declarations are accepted and stored as metadata — useful documentation and available to the optimizer — but they do not reject violating rows. Any uniqueness or referential guarantee has to be enforced by the loading pipeline or by an upstream transactional system.
  • A team wants auto-suspend disabled so their dashboard is always fast. How do you respond?
    Treat it as a signal that the workload may be mis-placed. Quantify what always-on compute costs versus the latency actually gained, check whether result caching or a materialized aggregate covers the hot queries, and if it is genuinely a high-concurrency low-latency serving pattern, move it to a serving store fed from Snowflake with an explicit freshness SLA.
  • How do you decide the freshness contract between Snowflake and a serving store?
    Start from the product requirement, not the pipeline: how stale can this number be before a user is misled? Then pick the cheapest mechanism that meets it — scheduled batch refresh, incremental change capture, or streaming — and monitor the actual lag against the stated SLA so drift is visible rather than discovered by a customer.

saying these in an interview costs you the question

  • Claims Snowflake replaces the transactional database for application traffic
  • Assumes declared PRIMARY KEY constraints reject duplicates
  • Proposes always-on warehouses to fix single-row latency
  • Says row-at-a-time inserts scale fine because storage is elastic
  • Argues no workload is a poor fit if you size the warehouse up

context