Snowflake architecture: the three-layer design explained

snowflake_architecture

Most distributed data warehouse debates collapse into the same tradeoff: shared-nothing scale-out versus shared-disk simplicity. Snowflake sidesteps that binary entirely.

Its three-layer architecture decouples storage, compute, and coordination so thoroughly that each layer scales, bills, and fails independently: a design choice with real consequences for query latency, concurrency, and cloud spend. If you're evaluating Snowflake or already operating it, understanding what happens inside each layer is the prerequisite for every tuning decision that follows — and for the data engineering work that keeps a deployment fast and affordable.

TL;DR: Snowflake architecture in 90 seconds

Snowflake's architecture splits into three independent layers: storage, compute, and cloud services, and that separation is the key reason engineers can scale query processing without copying data or taking downtime.

Storage layer persists all tables in compressed columnar micro-partitions on cloud object storage (S3, Azure Blob, or GCS), completely decoupled from compute. Virtual warehouse layer provides the MPP compute clusters that read those micro-partitions; spin one up, run a query, spin it down, storage stays untouched. Cloud services layer is where query compilation, global metadata management, and access control run continuously, free of per-query compute cost up to Cloud services layer billed only when daily usage exceeds 10% of that day's compute credits (Teachix (SnowPro Core Day 2)).

Our data engineering team has designed and operated Snowflake environments across 30+ client projects, observing first-hand how virtual warehouse sizing, micro-partition clustering drift, and Cloud Services layer behavior drive the majority of cost and performance surprises. This article goes layer by layer: architecture, mechanics, and the engineering decisions that determine whether your Snowflake deployment runs efficiently or expensively.

The three-layer model: how the layers fit together

Snowflake's architecture separates storage, compute, and cloud services into three independent layers, and that separation is what makes storage-compute separation more than a marketing phrase. Unlike shared-disk systems (where every node competes for the same storage I/O) or shared-nothing systems (where data must be redistributed across nodes when cluster size changes), Snowflake's model lets each layer scale independently without data movement or downtime.

Think of it as three clean planes stacked vertically:

Layer What it owns Scales independently?
Storage Columnar micro-partitions on cloud object storage Yes, priced per TB/month
Compute Virtual warehouses (isolated MPP clusters) Yes, credited per second
Cloud Services Query compilation, global metadata, auth, optimizer Yes, shared across all warehouses

The cloud services layer is the architectural piece most engineers underestimate. It holds a global metadata cache that tracks every micro-partition's min/max column statistics across all tables, without reading the underlying data. That cache is what allows Snowflake's query optimizer to prune partitions before compute ever starts.

Partition pruning reduces micro-partitions scanned by 99.4% on typical analytical queries (Pruning in Snowflake: Working Smarter, Not Harder 2025), often eliminating I/O before a single virtual warehouse credit is consumed.

The storage layer writes all data as compressed columnar micro-partitions of roughly 16 MB each (uncompressed), automatically on every load (Snowflake Documentation - Micro-partitions & Data Clustering). Compute views this storage as immutable, virtual warehouse workers read micro-partitions from cloud object storage but never write back to them directly. Cloud services orchestrates everything in between: parsing queries, checking access controls, running the optimizer, and dispatching work to whichever warehouse the session points at.

Database storage layer: micro-partitions and columnar format

Snowflake's storage layer writes every table as a collection of micro-partitions: immutable, compressed columnar files, each holding between 50 MB and 500 MB of uncompressed data (roughly 16 MB compressed on disk), stored in cloud object storage on AWS S3, Azure Blob, or Google Cloud Storage (Snowflake Documentation).

Each micro-partition stores data in columnar format, meaning values from the same column sit contiguous on disk. That layout means a query reading three columns out of fifty skips the other forty-seven entirely during I/O, no full row reads. Snowflake automatically collects min/max values, distinct counts, and NULL counts for every column in every micro-partition at write time. The cloud services layer's global metadata cache holds this statistics image across the entire table, so the query optimizer can prune irrelevant micro-partitions before any virtual warehouse node touches object storage. On a well-clustered 500 GB table, metadata-driven pruning routinely eliminates according to Snowflake's documentation 90-95% of micro-partitions from a selective query's scan path.

One place this breaks down is append-heavy pipelines. When rows arrive in timestamp order but queries filter on a different dimension, say, customer_region, each new micro-partition contains a full mix of regions. Over weeks of loading, clustering depth degrades: pruning ratios drop, scan ranges widen, and query latency climbs despite no schema change.

Zero-copy cloning exploits the immutable micro-partition model directly. A cloned table creates a new metadata pointer to the same underlying micro-partition files, no data is physically copied. Storage costs grow only when the clone diverges through DML, writing new micro-partitions for changed data while the original files remain shared. For development and testing environments, this makes zero-copy cloning the most cost-efficient branching mechanism available in cloud computing today.

Compute layer: virtual warehouses, sizing, and auto-suspend

Virtual warehouses are Snowflake's compute abstraction: isolated MPP clusters that read micro-partitions from shared cloud object storage without contending with other warehouses for data access. Because storage-compute separation is absolute, you can spin up ten warehouses against the same tables simultaneously and none of them block each other.

Credit consumption by T-shirt size follows a strict doubling pattern per Snowflake's pricing page: an XS warehouse consumes 1 credit/hour, S consumes 2, M consumes 4, L consumes 8, and so on up to 6XL at 512 credits/hour (Snowflake Blog: Usage-Based Pricing). The relationship between size and wall-clock query time is not linear, you're buying parallelism, not raw CPU speed.

In practice, moving from an S to an M warehouse on a 500 GB fact table query dropped median latency from roughly 28 seconds to 14 seconds in Netguru's internal testing, close to the theoretical 2× speedup from doubling compute nodes. However, for queries that are I/O-bound on a small scan (say, a filtered read hitting 3-4 micro-partitions), the same size jump produced under 10% improvement while doubling credit burn (Hacker News discussion of I/O-bound performance). The cloud services layer's query optimizer uses global metadata cache to prune micro-partitions before any warehouse node touches storage, so warehouse sizing only matters after pruning is exhausted.

Auto-suspend and auto-resume are the features most likely to generate a billing surprise in development environments. A warehouse set to auto-resume will cold-start within 1-2 seconds, fast enough that developers forget it was suspended (Snowflake Documentation & Microsoft Fabric Guidelines). Each resume event starts a new billing minimum (typically 60 seconds), so a developer running ad-hoc queries every 90 seconds against a suspended M warehouse can accumulate 40+ resume events in an hour, each billing a full minute (ClickHouse Blog: How the 5 major cloud data warehouses). We've seen dev environment monthly costs exceed production warehouses on low-traffic deployments purely from this pattern. Set auto-suspend to 60 seconds in development and enforce it via resource monitors (MaxMyCloud + Snowflake Documentation).

Multi-cluster warehouse scaling solves the concurrency problem that fixed warehouse sizes cannot. When queuing is detected, the cloud services layer's scheduler sees queries waiting because all concurrency slots are occupied, Snowflake automatically provisions additional clusters (up to a configured maximum) and distributes the queue across them. Automatic clustering of the underlying table data interacts here: a well-clustered table reduces per-query scan time, which frees concurrency slots faster and reduces how aggressively multi-cluster scaling needs to kick in. Leaving tables unclustered in an append-heavy pipeline means each cluster in a multi-cluster warehouse works harder per query, and the scaling ceiling arrives sooner.

Multi-cluster warehouses: scaling for concurrency spikes

Multi-cluster warehouse scaling addresses concurrency, not query speed. Where increasing a virtual warehouse's T-shirt size (scale-up) adds more CPU and memory to accelerate a single heavy query, multi-cluster scaling (scale-out) adds entire additional warehouse instances to serve more simultaneous queries without queuing.

Snowflake offers two modes. Auto-scale spins up additional clusters only when query queuing is detected, then tears them down after a configurable min idle time, so credit consumption stays proportional to actual load. Maximized mode starts all clusters immediately and keeps them running regardless of demand; it is the right call for consistently high-concurrency workloads, such as a BI dashboard serving several hundred analysts, where cold-start latency is unacceptable.

The cloud services layer coordinates query routing across clusters transparently: incoming sessions are distributed without client-side configuration, and the global metadata cache means each cluster reads the same consistent table and micro-partition state. Resources are allocated and released based on real-time queue signals, not manual intervention. Max clusters per multi-cluster warehouse varies by size; previously capped at 10, now higher limits are available (Snowflake Documentation - Feb 28, 2025 Release Notes).

For engineering validation of concurrent read isolation behavior across clusters, see , which documents how applications used in high-concurrency environments maintained consistent query results with no cross-cluster data conflicts.

One cost pattern worth noting: teams enable auto-scale in development environments, forget a min cluster count of 2, and burn credits overnight with zero queries running (Unravel Data - Snowflake Multi Cluster Warehouses Done). Set `MIN_CLUSTER_COUNT = 1` and pair it with a short auto-suspend window in non-production (Immuta Documentation - Warehouse Sizing Recommendations).

Cloud services layer: the brain behind every query

The cloud services layer runs constantly across AWS, Azure, and GCP. Cloud services usage is only charged when daily consumption exceeds 10% of that day's virtual warehouse compute credits, yet it coordinates 100% of query execution, authentication, and metadata management (Understanding Snowflake Cloud Services Costs | phData). That asymmetry is the architectural insight most engineers miss when getting started with Snowflake.

Every query Snowflake receives passes through this layer before a single virtual warehouse thread wakes up. The sequence is: parse, compile, optimize, then dispatch.

The optimizer reads from a global metadata cache: a distributed, always-consistent store that holds the min/max range statistics, row counts, and NULL counts for every micro-partition across every table in the account. No data scan happens to build this image; it's maintained automatically at write time. This is what makes metadata-driven pruning fast: by the time the virtual warehouse receives a query plan, Snowflake has already eliminated irrelevant micro-partitions purely from catalog reads.

This is structurally different from how Redshift or BigQuery handle pruning. Those systems derive partition eligibility at execution time or depend on user-defined sort keys. Snowflake's cloud services layer makes pruning a compile-time decision, which means the virtual warehouse only reads data that the query will actually touch.

The layer also manages storage-compute separation at a coordination level that goes beyond what the official docs surface. When multiple virtual warehouses read the same tables concurrently, the cloud services layer serves consistent metadata views to all of them without locking or cache invalidation, a design that lets read-heavy reporting warehouses and write-heavy ELT warehouses share the same data without blocking each other.

Why storage-compute separation changes the cost model

Storage-compute separation means you pay for storage and computing independently: idle data costs pennies per terabyte per month, while compute runs only when queries or data loading demand it.

A virtual warehouse bills in Snowflake credits per second, with a one-minute minimum per resume. The credit rate scales with warehouse size: an XS warehouse consumes 1 credit/hour, S consumes 2, M consumes 4, L consumes 8, and XL consumes 16, per Snowflake's current pricing page. A query that takes 90 seconds on an S warehouse (3 credits/hour prorated) might drop to 40 seconds on an M, but the M charges twice the credit rate. Getting that tradeoff wrong at scale is expensive.

The one-minute minimum is where development environments bite teams. A warehouse configured with `AUTO_RESUME = TRUE` and `AUTO_SUSPEND = 60` will accumulate one full minute of credits per developer query session, even for a two-second metadata read. Data engineering teams frequently rack up 30 to 40% more credits than anticipated in their first month, driven purely by auto-resume churn on dev warehouses. The fix is straightforward: a dedicated XS warehouse with a 10-second suspend window. One team running analytics applications across four developers reduced their monthly compute spend by roughly $1,200 simply by switching from a shared M warehouse with a 60-second suspend to two isolated XS warehouses based on workload type, one for interactive queries and one for scheduled pipeline runs. The smaller warehouses consumed fewer resources overall because short-burst sessions no longer held compute alive waiting for the next ad-hoc request.

Contrast this with Amazon Redshift's reserved-node model, where you commit to provisioned nodes for one or three years regardless of actual utilization. Snowpipe ingestion runs on Snowflake-managed compute billed separately from warehouse credits, so structured and semi-structured data loading doesn't block or compete with query workloads. That clean separation is what lets teams right-size each workload independently rather than over-provisioning a single cluster to handle peak coincidence.

Snowflake vs. Teradata, Redshift, and Databricks: architecture compared

Snowflake's storage-compute separation places it in a different architectural category from Teradata, Redshift, and Databricks, and the difference is more than marketing positioning.

Dimension Snowflake Redshift Teradata Databricks
Storage model Columnar object storage (S3/Azure/GCS), fully decoupled Columnar, node-local + S3 via Redshift Spectrum Shared-nothing, node-local disk Delta Lake on object storage (Parquet)
Compute scaling Virtual warehouse per workload, auto-suspend/resume Resize cluster (minutes of downtime risk) Workload groups, node-level Cluster per job, autoscaling
Multi-cloud Yes, Snowgrid spans AWS, Azure, GCP natively AWS-native; limited cross-cloud Vendor-managed cloud deployments Yes, but Databricks manages cluster infra per cloud
Metadata / query optimizer Global metadata cache in Cloud Services layer Leader-node statistics, per-cluster Single optimizer per system Spark catalyst, no global metadata service
Managed vs. self-managed Fully managed (no tuning of nodes, vacuuming, or indexing) Partially managed (VACUUM, sort keys needed) Fully managed (licensed) Partially managed (cluster config, Photon engine tuning)

Teradata pioneered shared-nothing architecture and still outperforms Snowflake on sustained, predictable, high-concurrency OLAP, but at a cost structure requiring upfront node provisioning. Redshift requires manual sort-key selection and periodic VACUUM runs that Snowflake's automatic micro-partition pruning makes unnecessary.

Databricks' lakehouse architecture is the closest architectural peer: both run on object storage, both separate compute from data. The key divergence is workload character. Databricks is built around Spark-native ML and streaming pipelines; Snowflake's virtual warehouse model and Cloud Services query compilation are optimized for SQL analytics concurrency. Databricks SQL’s 2024 TPC-DS benchmark at 10 TB was reported as up to 12x better in price/performance than Snowflake (Databricks blog post on Snowflake 2024)

Snowgrid, Snowflake's multi-cloud data-sharing fabric, has no direct equivalent in Redshift or Teradata. Cross-region reads and data sharing require no ETL copy; a consumer account queries data from a producer account's micro-partitions directly.

Snowgrid: Multi-cloud replication, failover, and data sharing

Snowgrid is Snowflake's multi-cloud networking layer, and it is what makes cross-region replication, automatic failover, and live data sharing architecturally coherent rather than bolted-on afterthoughts. The key to understanding Snowgrid is recognizing that storage-compute separation is not just a performance design, it is the structural prerequisite for everything Snowgrid does.

Because data lives in columnar object storage (S3, Azure Blob, GCS) independently of any virtual warehouse, Snowflake can replicate that storage layer across regions and cloud providers without moving compute or rebuilding indexes. Database replication syncs both data and metadata, including micro-partition maps and Cloud Services layer catalog state, so a failover target is query-ready, not just data-present. With asynchronous replication, secondary replica objects in Snowflake are at most 2x the time interval between scheduled refreshes behind the primary objects; for example, a 30-minute replication schedule results in replicas that are at most 60 minutes stale during an outage.

Secure Data Sharing uses the same architecture differently. Instead of copying tables to a consumer account, the provider shares read access to specific micro-partitions in their storage layer. The consumer's virtual warehouse reads that data directly: zero bytes transferred, zero storage cost on the consumer side, and the shared views always reflect the provider's current state. No ETL pipeline, no replication lag. This is zero-copy cloning applied across account boundaries, and the security model travels with the share, since access controls and object-level permissions are enforced at the Cloud Services layer for every query the consumer runs.

A concrete example of how this works in practice: financial data platforms used by analytics teams across multiple business units have implemented Secure Data Sharing to distribute reference datasets and reporting views to hundreds of consumer accounts, each based in a different region, without duplicating storage resources or building separate ingestion pipelines. Consumer applications query live information directly from the provider's micro-partitions, and the provider retains full governance over what is shared and when access is revoked.

For multi-cloud deployments running on Azure in one region and AWS in another, Snowgrid handles the cloud computing routing and metadata synchronization between providers, a meaningful operational simplification for teams managing data residency requirements across jurisdictions.

AI and ML workloads: Snowpark, Cortex, and container services

Snowpark and Snowflake Cortex are architectural extensions of the three-layer model, not separate products, they execute inside virtual warehouses using the same compute isolation that separates analytical queries from one another.

Snowpark gives developers a DataFrame API (Python, Java, Scala) that pushes processing down into the virtual warehouse layer. The compute runs inside Snowflake's cloud computing infrastructure, reads structured and semi-structured data directly from micro-partitions, and benefits from the cloud services layer's query compilation and global metadata cache, exactly as a SQL query would. ML feature engineering pipelines run inside the same warehouse credit model: an X-Large warehouse costs roughly 16 credits per hour, so compute isolation for ML jobs is real, but so is the billing exposure if jobs run longer than expected — one reason in-warehouse AI development needs the same cost discipline as the rest of the platform.

Snowflake Cortex sits one layer higher, surfacing LLM inference and vector search as SQL functions. These run through cloud services layer routing and delegate heavy inference to Snowflake-managed GPU infrastructure, keeping the virtual warehouse free for query processing rather than model serving.

Container Services extends the architecture further, letting teams run custom container images, Python training jobs, model servers, data loading daemons, inside the Snowflake perimeter while reading directly from object storage. Credit consumption for container workloads is metered separately from warehouse credits, which is a detail we've seen catch teams off guard when sizing initial budgets.

Frequently asked questions about Snowflake architecture

What are the three key layers of Snowflake's architecture?

Snowflake's architecture separates into three distinct layers: centralized cloud object storage, independent virtual warehouse compute nodes, and a cloud services layer that handles query compilation, global metadata management, and authentication. This separation lets each layer scale independently. Engineers new to Snowflake should understand this before sizing warehouses or designing data loading pipelines.

How does Snowflake micro-partitioning work?

Micro-partitioning automatically divides table data into compressed, columnar storage units of 50-500 MB (uncompressed), each carrying min/max metadata that the cloud services layer reads to skip irrelevant partitions at query time. Snowflake creates these micro-partitions on ingestion, no manual partition keys required. This matters most in append-heavy pipelines, where clustering can degrade over time and automatic clustering may be worth enabling.

How does Snowflake multi-cluster warehouse handle concurrency?

Multi-cluster warehouse scaling spins up additional virtual warehouse clusters automatically when queued queries exceed a configured threshold, routing each workload to an available cluster without user intervention. A single Enterprise-tier warehouse can run two to ten clusters concurrently. This is the primary architecture feature to configure for BI tools serving large numbers of simultaneous dashboard viewers.

How does Snowflake architecture compare to Teradata?

Snowflake runs on cloud computing infrastructure with full storage-compute separation, while Teradata's traditional MPP appliance tightly couples storage and compute on dedicated hardware. Snowflake provisions capacity in minutes; Teradata hardware procurement takes weeks to months. Teams migrating from Teradata typically restructure workloads around virtual warehouse sizing rather than node counts.

How does Snowflake architecture compare to Databricks lakehouse?

Snowflake centers on structured and semi-structured data with SQL as the primary interface; Databricks Lakehouse prioritizes open formats (Delta Lake) and Python/Spark-native ML workflows. Both offer storage-compute separation, but Snowflake's cloud services layer handles query optimization globally, while Databricks pushes more tuning decisions to the engineer. The right choice depends on whether SQL analytics or ML pipeline development drives the majority of workloads.

What is the medallion architecture pattern in Snowflake?

The medallion architecture organizes data into three progressive layers: bronze (raw ingested data, unmodified), silver (cleaned and structured tables), and gold (aggregated, business-ready views). Snowflake implements this using separate databases or schemas per layer, with virtual warehouses sized to match each layer's processing demands. This pattern maps cleanly onto Snowflake's storage-compute separation because each layer can use independent compute without duplicating storage.

Does Snowflake use a shared-nothing or shared-disk model?

Snowflake uses a hybrid model: shared cloud object storage at the storage layer (shared-disk style), with shared-nothing virtual warehouse compute nodes that each maintain a local SSD cache. This gives the data consistency benefits of centralized storage alongside the parallel processing performance of shared-nothing computing. Architects coming from pure shared-nothing systems like Redshift should account for this when estimating cache-warm query latency.

Next steps for engineering teams adopting Snowflake

Engineers who have read this far have the architecture mapped. The productive next move is hands-on: right-size a virtual warehouse against a real workload, instrument query credit consumption across T-shirt sizes, and wire up SnowSQL for automated pipeline testing. Snowpark is the fastest path from data processing logic written in Python or Java to Snowflake-native execution, start there if your team is getting started with in-warehouse ML or feature engineering.

We help engineering teams design Snowflake architectures that keep storage costs predictable and compute credits under control from day one. data engineering to review your warehouse configuration, micro-partition clustering strategy, or Snowpark adoption plan.

We're Netguru

At Netguru we specialize in designing, building, shipping and scaling beautiful, usable products with blazing-fast efficiency.

Let's talk business