Snowflake Interview Questions

Reviewed by Mark Dickie · Last updated

Snowflake is a cloud-native data platform that separates compute, storage, and cloud services so each can scale on its own. For interviews, you need to understand virtual warehouses and their sizing, multi-cluster auto-scaling, micro-partition storage, time travel and Fail-safe, data sharing, and the differences between Snowflake's standard SQL and what you'd find in PostgreSQL or SQL Server. Expect questions on choosing the right warehouse size for a workload, explaining how cloning works, and troubleshooting query performance through the query profile.

How does Snowflake's architecture differ from a traditional data warehouse?

Snowflake splits its platform into three layers that run independently: storage (cloud blob storage holding micro-partitions), compute (virtual warehouses that process queries), and cloud services (authentication, metadata, optimization). Because compute and storage are decoupled, you can spin up multiple warehouses reading the same data without copying it, and shut them down when idle with no data movement.

LayerWhat it doesScales how
Cloud servicesMetadata, access control, query optimizationShared across the account
Compute (virtual warehouse)Runs queries, loads data, transformsIndependent clusters, auto-suspend/resume
StorageMicro-partitions in cloud object storageGrows with data, no provisioning

What should you know about virtual warehouses?

Virtual warehouses are the compute engines in Snowflake. Key things interviewers probe:

  1. Warehouse sizing: Sizes run from X-Small (1 credit/hour) through 6X-Large (512 credits/hour), each step doubling the compute. Picking the right size is a common interview scenario.
  2. Auto-suspend and auto-resume: Warehouses shut down after a configurable idle period and restart on the next query, so you only pay for active compute.
  3. Multi-cluster warehouses: A warehouse can run multiple clusters to handle concurrency. Scaling policy controls whether Snowflake adds clusters conservatively or aggressively.
  4. Local disk caching: Each warehouse caches data and results locally, so repeated queries on the same data run faster without hitting remote storage.
  5. Query acceleration service: Offloads parts of large scan-heavy queries to shared compute, reducing the warehouse size you need.

What are micro-partitions and why do they matter for performance?

Micro-partitions are Snowflake's storage unit — each holds 50–150 MB of compressed data and stores column-level statistics (min, max, null counts) that the optimizer uses for pruning. When you query with a filter, Snowflake skips micro-partitions whose min/max ranges don't overlap with the predicate, so the amount of data scanned drops sharply. Clustering keys let you control how data is ordered within micro-partitions, which improves pruning on columns that aren't naturally loaded in sorted order. Interviewers often ask you to read a query profile, identify a full table scan, and explain whether a clustering key or a warehouse resize would fix the bottleneck.

How do time travel and Fail-safe work?

Time travel lets you query, clone, or restore data as it existed at a past point — up to 1 day on standard editions and up to 90 days on Enterprise. The retention period is configurable per table and per schema. Fail-safe is a separate, non-configurable 7-day window after the Time Travel retention expires, during which Snowflake keeps the data for disaster recovery but you can't access it directly. Knowing the difference between these two windows, and how dropping a table interacts with them, comes up in interviews regularly.

Key facts

  • Tarmac has 101 Snowflake interview questions on this topic, 25 of them on this page, at difficulty 1–5 of 5.
  • Tarmac tracked 1,086 job postings asking for Snowflake in August 2026.
  • Roles asking for Snowflake advertise a median base salary of £79,500, across 195 job postings as of August 2026.
  • Tarmac last reviewed these Snowflake interview questions on 31 August 2026.

At a glance

Questions25 shown · 101 in the bank
Difficulty1–5 of 5
FormatsTrue / false, Ordering, Coding exercise, Code output, Fill in the blank, Multiple choice, Multiple answer, Flashcard, Find the bug, Short answer
Interactive2 run your code against tests, in the app

What you'll review

  1. micro partitions
  2. auto suspend resume
  3. multi cluster warehouses
  4. snowpipe
  5. variant type
  6. stages
  7. storage compute separation
  8. result cache
  9. copy into
  10. cloud services layer
  11. zero copy cloning
  12. flatten
  13. time travel
  14. virtual warehouses
  15. clustering keys
  16. streams

Practice questions

Try one before you open the answer. Pick an option and press Check; it's marked on the spot.

Snowflake/architecture/micro-partitions

In Snowflake, a micro-partition is an immutable unit of storage that contains data from only a single table and cannot be modified in place.#

Options

Show answer

True. Snowflake micro-partitions are immutable storage units that hold rows from a single table. Updates and deletes do not modify existing micro-partitions in place; instead, Snowflake writes new micro-partitions and marks the old ones as stale, which is central to how its time-travel and zero-copy cloning features work.

Why:

Snowflake micro-partitions are immutable storage units. Each micro-partition contains rows from a single table, and any update or delete creates new micro-partitions rather than modifying existing ones in place.

Snowflake/compute/auto-suspend-resume

In Snowflake, a warehouse with auto-suspend set to 60 seconds will stop consuming compute credits while it is suspended, and it will automatically restart (resume) when a new query is submitted to it.#

Options

Show answer

True. In Snowflake, auto-suspend stops a warehouse (and its credit consumption) after the configured idle period, while auto-resume automatically restarts that warehouse when a new query is submitted to it. Together these features allow compute resources to scale to zero when idle and start back up on demand.

Why:

Auto-suspend causes a warehouse to transition to a suspended state after the configured period of inactivity (default 60 seconds), at which point it stops consuming credits. Auto-resume means that when a query or other statement is submitted to a suspended warehouse, Snowflake automatically starts the warehouse again so the query can execute. Both behaviors are core to Snowflake's compute model and are enabled by default.

Snowflake/architecture/multi-cluster-warehouses

Order the events when a Snowflake multi-cluster warehouse in Auto-scale mode scales OUT (adds a cluster) to handle increasing concurrency.#

Put these in order

Show answer

The correct order is: (1) queries exceed the capacity of all active clusters, (2) the warehouse starts provisioning an additional cluster, (3) the new cluster acquires compute resources and becomes available, (4) queued and new queries are routed to the new cluster. A multi-cluster warehouse in Auto-scale mode adds clusters only when existing ones can't keep up, then routes queries once the new cluster is ready.

Why:

In Auto-scale mode, a multi-cluster warehouse scales out only after existing clusters can no longer keep up with incoming query load (a). Once that threshold is crossed, Snowflake provisions a new cluster (b), which then acquires compute resources and becomes available (c). Only after the new cluster is ready does Snowflake route queries to it (d). Each step strictly depends on the prior one.

Snowflake/data-loading/snowpipe

You are investigating failed Snowpipe loads in Snowflake. The table snowpipe_load_history has one row per ingested file with these columns:#

Starter code

SELECT file_name
FROM snowpipe_load_history
WHERE status = 'LOADED';

Your solution must pass

  • visible_basic

This one is written and run, not read. Solve it in the app and your code is executed against these tests and the hidden ones.

Snowflake/semi-structured/variant-type

Querying a VARIANT column with a path that does not exist in the JSON — what does this return?#

-- Table j has one row: v = PARSE_JSON('{"name": "Ada"}')
SELECT v:name::string AS name,
       v:age::int AS age
FROM j;

Options

Show answer
name = 'Ada', age = NULL — a missing path resolves to SQL NULL, not an error
Why:

Path access on a VARIANT is forgiving: v:name navigates into the JSON and returns the value if the key exists, or a JSON null / SQL NULL if it doesn't — it never raises an error for a missing key. So v:name::string yields 'Ada', and v:age::int yields NULL because the age key isn't present in the parsed object. This is why option b is wrong (no error) and option c is wrong (there is no implicit zero default — absence is NULL, not 0). Option d misstates the semantics: each path is evaluated independently, so a missing path on one column doesn't affect the other. This null-tolerant access is a deliberate feature for schema-on-read: semi-structured documents often have optional or evolving fields, and Snowflake lets you select them without guarding every path, surfacing absence as NULL. The casts (::string, ::int) convert the extracted VARIANT into typed SQL columns.

Snowflake/data-loading/stages

In a COPY INTO statement, you reference a named stage by prefixing its name with the _____ symbol, for example COPY INTO sales FROM _____my_stage. To load files from cloud storage you create an external stage, whereas a stage that Snowflake manages internally on your behalf is called an _____ stage.#

Show answer

In a COPY INTO statement, you reference a named stage by prefixing its name with the **@** symbol, for example COPY INTO sales FROM **@**my_stage. To load files from cloud storage you create an external stage, whereas a stage that Snowflake manages internally on your behalf is called an **internal** stage.

Why:

Named stages in Snowflake are referenced with the @ prefix — @my_stage, or @my_stage/path/ to scope to a subfolder — which is how COPY INTO, PUT, GET, and LIST know you mean a stage rather than a table. Stages come in two flavors: an external stage points at a location in your own cloud object storage (S3, GCS, or Azure Blob) using a storage integration or credentials, while an internal stage is storage Snowflake provisions and manages for you (named, user @~, or table @%table internal stages). The PUT command uploads local files into an internal stage; external stages are loaded by landing files in the underlying bucket. Knowing the @ reference syntax and the internal-vs-external distinction is fundamental to every data-loading workflow.

Snowflake/architecture/storage-compute-separation

Snowflake's architecture is divided into three layers: the _____ layer persists table data to cloud storage (e.g., AWS S3, Azure Blob, GCS), the _____ layer runs query processing inside virtual warehouses, and the _____ layer manages metadata, transactions, access control, and query optimization.#

Show answer

Snowflake's architecture is divided into three layers: the storage layer persists table data to cloud storage (e.g., AWS S3, Azure Blob, GCS), the compute layer runs query processing inside virtual warehouses, and the cloud services layer manages metadata, transactions, access control, and query optimization.

Why:

Snowflake's three-layer architecture separates persistent data storage (cloud storage), query execution (compute / virtual warehouses), and coordination (cloud services). The storage layer holds data in cloud-object stores; the compute layer runs virtual warehouses that process queries; the cloud services layer handles metadata, optimization, security, and transaction management.

Snowflake/architecture/storage-compute-separation

A team runs heavy ELT transforms and a separate BI dashboard workload against the same tables, and the two keep contending for resources. In Snowflake's architecture, what is the canonical way to stop them slowing each other down?#

Options

Show answer

Give each workload its own virtual warehouse. Snowflake separates storage from compute: data lives once in a shared storage layer, and multiple independent warehouses can read it at the same time. Putting the ELT job and the BI dashboard on separate warehouses isolates their compute completely, so neither steals the other's resources, while both still query the same single copy of the data with no duplication or sync lag.

Why:

Snowflake's defining design is the separation of storage and compute. Table data lives once in a shared, cloud-object-store-backed storage layer, and any number of independent virtual warehouses can read it concurrently. Because each warehouse is its own isolated compute cluster, assigning the ELT job and the BI dashboard to separate warehouses means neither competes for the other's CPU/memory — yet both still see the same single copy of the data with no duplication and no sync lag. Cloning (b) makes redundant logical copies and would require keeping them current. A clustering key (c) improves pruning within a query but does nothing about compute contention. Raising the credit quota (d) just permits more spend; it doesn't isolate the two workloads. Workload isolation via dedicated warehouses on shared storage is the textbook answer and the architectural reason Snowflake scales concurrent workloads cleanly.

Snowflake/query-performance/result-cache

You run a non-deterministic-free SELECT, then run the byte-for-byte identical query 10 minutes later with no DML in between. It returns instantly and uses zero warehouse compute. Which cache served it, and roughly how long is it valid?#

Options

Show answer

The result cache, which lives in Snowflake's cloud services layer and stores the full result set. An identical query reuses it for free — no warehouse compute, the warehouse need not even be running — provided the query text matches exactly, the data is unchanged, and the query has no non-deterministic functions. A cached result stays valid for 24 hours, and each reuse resets that window. This is distinct from the warehouse-local SSD cache, which still costs compute.

Why:

Snowflake's result cache lives in the cloud services layer and stores the actual result set of a query. A later query reuses it only if the query text matches exactly (after normalization), the role has access, the underlying data hasn't changed, and the query contains no non-deterministic or time-dependent functions. Reused results cost no warehouse compute at all — the warehouse need not even be running. The cache entry is valid for 24 hours from the last time it was used, and each reuse resets that 24-hour window (it can extend up to 31 days total before being purged). The warehouse-local SSD cache (b) is a different layer — it caches raw micro-partition data to speed up scans, but a query that hits it still consumes compute. There is no one-hour full-result metadata cache (c), and reused results genuinely bypass execution rather than just running fast (d).

Snowflake/architecture/micro-partitions

In Snowflake, micro-partitions are created and managed automatically as data is loaded — you do not manually define or maintain partitions the way you would with partitioned tables in a traditional warehouse.#

Options

Show answer

True. Snowflake automatically splits each table into immutable, columnar micro-partitions (~50–500 MB uncompressed) as data loads — there is no partition DDL and no manual upkeep. It keeps per-partition metadata like min/max value ranges so the optimizer can prune partitions that can't match a query's filters. This differs sharply from traditional warehouses where you define and maintain partitions yourself. You can optionally add a clustering key to improve how rows are co-located, but the partitioning itself is automatic.

Why:

True. Snowflake automatically divides every table into micro-partitions — contiguous units of roughly 50–500 MB of uncompressed data (smaller compressed) — as rows are ingested, with no DDL to declare partitions and no manual maintenance. Each micro-partition is columnar and immutable, and Snowflake stores per-partition metadata (min/max value ranges, distinct counts, etc.) that the optimizer uses for pruning: it skips any micro-partition whose value range can't satisfy a query's filters, so scans touch only relevant data. This is fundamentally different from classic warehouses where you hand-pick partition keys and manage partition maintenance. The one knob you can add on top is a clustering key, which influences how rows are co-located across micro-partitions to make pruning more effective on large tables — but the partitions themselves are always created and managed automatically.

Snowflake/data-loading/copy-into

Order the steps to bulk-load a batch of CSV files from cloud storage into a Snowflake table using a named stage and COPY INTO, from first to last.#

Put these in order

Show answer

First create a FILE FORMAT so Snowflake can parse the CSV (delimiter, headers, compression). Then create a STAGE pointing at the files and referencing that format. Next stage the files — PUT to an internal stage, or land them in the bucket for an external stage. Then run COPY INTO <table> FROM @stage to load the data, which also tracks already-loaded files. Finally inspect the COPY result and COPY_HISTORY to confirm row counts and handle any rejected files.

Why:

Bulk loading in Snowflake follows a stable pipeline. First define a FILE FORMAT so Snowflake knows how to parse the files (field delimiter, header lines, compression, null handling). Next create a STAGE — a named pointer to where the files live (an internal stage Snowflake manages, or an external stage over your own S3/GCS/Azure bucket) — typically referencing that file format. Then get the files into the stage: PUT uploads local files to an internal stage, while for an external stage the files simply need to be present in the bucket. With files staged, COPY INTO <table> FROM @stage performs the actual load, parsing and inserting rows (and recording per-file load metadata so already-loaded files are skipped on re-runs). Finally, verify the load — the COPY result set and COPY_HISTORY / VALIDATE show how many rows loaded and surface any rejected files for reprocessing. Doing COPY before the stage or file format exists would simply fail.

Snowflake/architecture/cloud-services-layer

Snowflake's architecture separates concerns into three layers: Cloud Services, Query Processing (virtual warehouses), and Database Storage. Which of the following responsibilities belong to the Cloud Services layer? (Select all that apply.)#

Options

Pick every one that applies.

Show answer

The Cloud Services layer is responsible for query parsing and optimization, authentication and access control, and maintaining the global metadata catalog (databases, tables, micro-partition statistics). Storing table data in micro-partitions belongs to the Database Storage layer, and executing SQL on compute nodes belongs to the Query Processing (virtual warehouse) layer — neither is part of Cloud Services.

Why:

Snowflake's Cloud Services layer is a set of globally shared, multi-tenant services that coordinate all activity. It houses the query optimizer (parsing and plan generation), the authentication and access-control subsystem, and the metadata catalog that tracks databases, tables, and micro-partition-level statistics. Option (d) describes the Database Storage layer, where data is persisted as compressed, encrypted micro-partitions in cloud object storage. Option (e) describes the Query Processing layer, where virtual warehouses — independent compute clusters — execute the plan produced by the Cloud Services optimizer. Neither data persistence nor query execution lives in the Cloud Services layer, so only (a), (b), and (c) are correct.

Snowflake/platform-features/zero-copy-cloning

In Snowflake, zero-copy cloning creates a clone that shares all existing micro-partitions with its source table. Only micro-partitions unique to the clone (those with a partition_id not present in the source) consume additional storage.#

Starter code

SELECT SUM(p.size_bytes) AS additional_storage_bytes
FROM partitions p
JOIN clones c ON p.table_name = c.clone_table
-- TODO: Exclude micro-partitions shared with the source table

Your solution must pass

  • basic_clone_shared_and_unique

This one is written and run, not read. Solve it in the app and your code is executed against these tests and the hidden ones.

Snowflake/architecture/multi-cluster-warehouses

At 9am, hundreds of analysts fire short dashboard queries at once and many queue. Individual queries are small and fast. Do you resize the warehouse larger, or switch it to multi-cluster — and why?#

Options

Show answer

Switch it to multi-cluster. Resizing scales up — a bigger warehouse makes each individual query faster but a single cluster still has a fixed concurrency limit, so a flood of small queries keeps queuing. Multi-cluster scales out: when queries queue, Snowflake automatically starts more clusters of the same size and load-balances across them, then shuts them down as demand drops. A burst of many small, fast queries is the canonical multi-cluster scenario, not a resize one.

Why:

These are two orthogonal scaling axes. Resizing a warehouse (XS -> S -> M ...) scales up: each step roughly doubles the compute per cluster, making an individual heavy query faster, but a single cluster still has a fixed concurrency ceiling, so a flood of small queries will still queue. Multi-cluster warehouses scale out: when queries start queuing, Snowflake automatically starts additional clusters of the same size (up to a configured max) and load-balances across them, then shuts them down when demand falls. The symptom here — many small, fast queries queuing due to a concurrency spike — is the textbook multi-cluster case, so (a) is correct. Resizing (b) addresses query latency, not concurrency, and would be the wrong (and costlier-per-query) lever. Size and cluster count are not the same knob (c). Auto-suspend (d) controls idle shutdown, not queueing under load.

Snowflake/platform-features/zero-copy-cloning

You run CREATE TABLE sales_clone CLONE sales; on a large table. Which statements about the resulting zero-copy clone are true? Select all that apply.#

Options

Pick every one that applies.

Show answer

A zero-copy clone is an independent, writable snapshot that initially shares the source's existing micro-partitions by metadata, so it costs almost no storage at creation and is near-instant. After cloning, the two objects are isolated — changing one never changes the other — and storage only grows as either diverges, when changed micro-partitions are written (copy-on-write). It is not a live view, so later inserts into the source do not appear in the clone, and no bulk row copy ever happens.

Why:

Zero-copy cloning creates a new, independent object that initially references the source's existing immutable micro-partitions by metadata only — so creation is near-instant and adds essentially no storage (a). The clone is a full, writable snapshot taken at clone time, not a live view: it and the source then evolve separately, so a later INSERT into sales does not appear in sales_clone (d is wrong) and edits to either are isolated (b). Because Snowflake's micro-partitions are immutable, storage only grows when either object changes data, at which point the modified partitions are written and no longer shared — this copy-on-write divergence is the 'zero-copy' economics (c). Nothing is bulk-copied up front, so there is no transient 2x storage spike (e is wrong). This is why cloning is the standard cheap, instant way to spin up dev/test or pre-deploy snapshots of production data.

Snowflake/semi-structured/flatten

Given a single VARIANT column holding a JSON array of tags, what does this query return?#

-- Table t has one row: v = PARSE_JSON('{"tags": ["a", "b", "c"]}')
SELECT f.value::string AS tag
FROM t,
LATERAL FLATTEN(input => t.v:tags) AS f
ORDER BY tag;

Options

Show answer
Three rows: 'a', 'b', 'c'
Why:

LATERAL FLATTEN expands a semi-structured value into one row per element. Here t.v:tags uses the colon path operator to pull the tags array out of the VARIANT, and FLATTEN produces three rows, one per array element, exposing each element through the VALUE column of the flatten output. Casting f.value::string strips the VARIANT's JSON quoting and yields the plain strings a, b, c — so option c (which keeps them quoted) is wrong because of the explicit ::string cast. FLATTEN works on arrays and objects (and nested structures), so option d is wrong. Option b describes not flattening at all. ORDER BY then sorts them alphabetically, giving rows a, b, c. This array-to-rows pattern via LATERAL FLATTEN is the canonical way to shred JSON arrays into relational rows in Snowflake.

Snowflake/platform-features/time-travel

A table accounts has 100 rows. Someone runs DELETE FROM accounts; (Statement A), which Snowflake assigns query id 'Q123'. What does the final SELECT return?#

-- Statement A (query id Q123): DELETE FROM accounts;  -- removes all 100 rows
SELECT COUNT(*)
FROM accounts BEFORE (STATEMENT => 'Q123');

Options

Show answer
100 — BEFORE (STATEMENT => 'Q123') reads the table as it was just before the DELETE ran
Why:

Time Travel lets you query historical versions of data within the retention window. The BEFORE (STATEMENT => 'Q123') clause asks for the table's state immediately prior to the execution of statement Q123 — i.e., before the DELETE took effect — so all 100 rows are still visible and COUNT(*) returns 100. Option b is the trap: even though the DELETE committed, that's precisely what Time Travel is for — reconstructing the pre-change state from retained micro-partitions. Snowflake supports three Time Travel anchors — OFFSET (seconds back), TIMESTAMP, and STATEMENT (a query id) — so option c is wrong; STATEMENT is valid. The AT vs BEFORE distinction (option d) is real but here BEFORE is exactly right: AT (STATEMENT => 'Q123') would include the effects up to and including Q123 (0 rows), whereas BEFORE excludes it (100 rows). This is the standard 'oops, undo that DELETE' recovery pattern.

Snowflake/architecture/cloud-services-layer

What is the cloud services layer in Snowflake's three-layer architecture, and what does it do?#

Show answer

Snowflake has three layers: (1) the database storage layer, where table data lives as compressed, columnar micro-partitions in cloud object storage; (2) the query processing / compute layer of virtual warehouses; and (3) the cloud services layer, the 'brain' that coordinates everything. The cloud services layer handles authentication and access control (RBAC), the query optimizer and query parsing/compilation, transaction and metadata management (including the metadata that powers pruning and INFORMATION_SCHEMA), infrastructure management, and the result cache. It runs on Snowflake-managed compute that you don't provision, and most of its usage is free — you're only billed for cloud services compute when it exceeds about 10% of your daily warehouse (compute) credits. Because metadata-only operations (like many COUNT(*), MIN/MAX, or SHOW/DDL queries) can be answered entirely by this layer, they can return without resuming a warehouse at all.

Why:

The cloud services layer is the coordination tier that ties the storage and compute layers together. The interview-critical points: it owns authentication/RBAC, the optimizer, transaction and metadata management, and the result cache; it runs on Snowflake-managed compute so you never size it; and it's effectively free unless it exceeds ~10% of daily warehouse credits. A sharp follow-up is why metadata-only queries cost no warehouse compute — because this layer can answer them from metadata without starting a warehouse. Knowing the three layers (storage / compute / cloud services) and that this is the 'services'/brain layer is a foundational Snowflake architecture answer.

Snowflake/architecture/micro-partitions

In Snowflake's storage architecture, what is a micro-partition, and what are its key structural and operational characteristics?#

Show answer

A micro-partition is an immutable, columnar storage unit that Snowflake writes when loading data into a table. Each micro-partition typically contains 50–500 MB of compressed data (uncompressed range ~16 MB) and can hold rows from multiple table columns. Key characteristics:

  1. Columnar: Each micro-partition stores data in a columnar format, so queries reading a subset of columns only scan those columns within the partition.
  2. Immutable: Once written, a micro-partition is never modified in place. UPDATEs, DELETEs, and MERGEs create new micro-partitions and mark old ones for removal.
  3. Self-describing: Each micro-partition maintains metadata—min/max values, null counts, and distinct-value counts per column—enabling data pruning without scanning the partition data itself.
  4. Pruning granularity: Because metadata is at the micro-partition level (not block or extent level), Snowflake can skip irrelevant micro-partitions during query compilation, dramatically reducing I/O.
  5. Cloud-storage backed: Micro-partitions are stored as files in cloud object storage (S3, Azure Blob, GCS) and are cached in the virtual warehouse's local SSD cache on repeated access.
Why:

This flashcard tests senior-level understanding of the fundamental storage unit in Snowflake, including its immutability, columnar nature, self-describing metadata, and role in data pruning.

Snowflake/architecture/virtual-warehouses

A Snowflake account uses a multi-cluster virtual warehouse. Consider the following statements about virtual warehouse architecture, caching, scaling, and billing. Select ALL that are TRUE.#

Options

Pick every one that applies.

Show answer

Statements a, b, and e are true. Each cluster in a multi-cluster warehouse has its own independent local SSD cache (a). The result cache is a service-layer, account-wide cache that persists for 24 hours and works across sessions and warehouses as long as the underlying data is unchanged (b). A multi-cluster warehouse with MIN_CLUSTER_COUNT = 0 starts with zero clusters and provisions them only when queries arrive (e). Statement c is false because cache preservation after suspend/resume is best-effort, never guaranteed. Statement d is false because resizing a running warehouse does not require suspension and in-progress queries are not migrated.

Why:

Statements a, b, and e are true.

(a) TRUE: In Snowflake's multi-cluster architecture, each cluster is an independent set of compute resources with its own local SSD cache. A query running on cluster 2 cannot benefit from data cached on cluster 1's local SSD.

(b) TRUE: Snowflake's result cache is maintained at the service layer (not per-warehouse) and persists for 24 hours. The same query re-issued from any session on any warehouse in the account returns the cached result without re-execution, as long as the underlying data hasn't changed and the result is still in cache.

(c) FALSE: When a warehouse auto-suspends, its compute resources are released. On resume, Snowflake makes a best-effort attempt to reassign the same compute resources (which would preserve the local SSD cache), but this is never guaranteed regardless of how quickly the warehouse resumes. A different set of compute resources means a cold cache.

(d) FALSE: Snowflake allows resizing a running warehouse without suspending it. The resize takes effect for new queries; in-progress queries continue executing on the original compute resources and are NOT migrated to the new size.

(e) TRUE: A multi-cluster warehouse with MIN_CLUSTER_COUNT = 0 starts with no running clusters. Clusters are provisioned on demand when queries arrive, up to MAX_CLUSTER_COUNT, and are automatically shut down when idle (subject to AUTO_SUSPEND).

Snowflake/compute/auto-suspend-resume

This warehouse definition is producing surprisingly large bills even though it is only used for a few short queries each hour. What is the cost bug?#

CREATE WAREHOUSE etl_wh
  WAREHOUSE_SIZE = 'XLARGE'
  AUTO_SUSPEND = 0
  AUTO_RESUME = TRUE
  INITIALLY_SUSPENDED = TRUE;

Options

Show answer

AUTO_SUSPEND = 0 disables auto-suspend, so once a query resumes the warehouse it runs (and bills) continuously until manually suspended — it never idles down between the hourly bursts

Why:

AUTO_SUSPEND is the number of seconds of inactivity after which Snowflake automatically suspends (stops billing) the warehouse. Setting it to 0 disables auto-suspend entirely: once any query auto-resumes the warehouse, it stays running indefinitely and accrues credits every second until someone manually suspends it — so a warehouse used for a few short bursts per hour effectively bills 24/7. That's the bug (a). The fix is a small positive value (e.g. AUTO_SUSPEND = 60) so it idles down quickly after each burst, especially painful at XLARGE where the per-second credit rate is high. Option b is wrong: INITIALLY_SUSPENDED = TRUE is correct and harmless — it just means the warehouse starts suspended and resumes on first use. Option c misreads AUTO_RESUME, which only governs starting on demand, not staying on. Option d is wrong — 'XLARGE' is valid. Pairing AUTO_RESUME with a sensible AUTO_SUSPEND is the standard cost-control idiom.

Snowflake/query-performance/clustering-keys

When does adding a clustering key to a Snowflake table actually help, and why is it not something you should add to every large table by default?#

Show answer

A clustering key co-locates rows that share the key's values into the same micro-partitions, which tightens each partition's min/max metadata and improves partition pruning — so queries that frequently filter or join on that key scan far fewer micro-partitions. It pays off mainly on very large tables (often hundreds of GB to TB+) that are queried with selective predicates on a stable, high-but-not-extreme cardinality column, and where natural load order doesn't already cluster the data well. It is not a free default because Snowflake maintains clustering with automatic reclustering, which consumes serverless compute credits, and DML that disturbs the order triggers more reclustering work — so on small tables, tables already well-ordered by load, or tables with the wrong key choice, the maintenance cost outweighs the pruning benefit. You should check the current clustering with SYSTEM$CLUSTERING_INFORMATION and verify queries actually prune before and after, rather than adding keys speculatively.

Why:

Clustering keys are a pruning optimization, not a magic speedup. By physically co-locating rows with similar key values, they narrow each micro-partition's value range so the optimizer can skip more partitions when a query filters on that key. The strong-answer nuance is the cost side: Snowflake's automatic reclustering runs as a background serverless service that burns credits to keep the table organized, and churny DML keeps it working — so the feature only earns its keep on big tables with selective, frequent predicates on a well-chosen column that isn't already ordered by load. A senior candidate will mention measuring with SYSTEM$CLUSTERING_INFORMATION and confirming real pruning gains, and will avoid clustering small tables or picking a near-unique or extremely low-cardinality key.

Snowflake/platform-features/streams

What is a Snowflake Stream, and how does consuming one in a DML statement affect its offset?#

Show answer

A Stream is a change-data-capture object that tracks the changes (inserts, updates, deletes) made to a source table since a given point, without storing a copy of the data itself. It works by maintaining an offset — a pointer to a transactional version of the table — and exposing the delta between that offset and the current table version, along with metadata columns like METADATA$ACTION, METADATA$ISUPDATE, and METADATA$ROW_ID. When you read the stream inside a DML statement (for example INSERT/MERGE INTO a target SELECT ... FROM stream) and that transaction commits, the stream's offset advances to the table version as of the start of that transaction, so the consumed changes are no longer returned and the next read sees only newer changes. A plain SELECT against the stream does not advance the offset. This is the standard building block, usually paired with a Task, for incremental ELT and keeping downstream tables in sync.

Why:

A Stream is Snowflake's CDC primitive: it records what changed on a source table since an offset, not a data copy, and surfaces inserts/updates/deletes plus metadata columns describing each change. The offset mechanics are the crux of the answer — when a stream is consumed by a committing DML statement, its offset moves forward to the transaction's start version, so each change is processed exactly once and subsequent reads see only newer deltas; a bare SELECT is a non-consuming peek that leaves the offset untouched. The canonical pattern is Stream + Task: a scheduled Task wakes up, checks SYSTEM$STREAM_HAS_DATA, and MERGEs the stream's changes into a target, giving incremental, idempotent ELT. Mentioning the consume-on-commit semantics and the Stream+Task pairing signals real operational understanding.

Snowflake/architecture/multi-cluster-warehouses

The following CREATE WAREHOUSE statement is intended to create a multi-cluster warehouse whose incoming queries start executing immediately under increasing load (preferring extra clusters over queuing). Which line contains the bug, and what is wrong?#

-- Create a multi-cluster warehouse that scales between 1 and 4 clusters.
-- Incoming queries should start executing immediately under increasing load
-- rather than queuing, even if that means consuming more credits.
CREATE WAREHOUSE realtime_wh
  WAREHOUSE_SIZE = 'X-LARGE'
  MIN_CLUSTER_COUNT = 1
  MAX_CLUSTER_COUNT = 4
  SCALING_POLICY = 'ECONOMY'
  AUTO_SUSPEND = 60
  AUTO_RESUME = TRUE;

Options

Show answer

SCALING_POLICY should be 'STANDARD' because 'ECONOMY' conserves credits by queuing queries before scaling out, contradicting the requirement for immediate execution

Why:

The ECONOMY scaling policy is designed to conserve credits by queuing queries rather than aggressively scaling out to additional clusters. This directly contradicts the requirement that queries start executing immediately without queuing. The STANDARD policy scales out more readily to minimize query queuing. Option a is wrong because MIN_CLUSTER_COUNT = 1 does not prevent full warehouse suspension (AUTO_SUSPEND still applies). Option c is wrong because AUTO_SUSPEND only triggers after inactivity, not during load spikes, and AUTO_RESUME = TRUE handles restart. Option d is wrong because each cluster in a multi-cluster warehouse runs at the full WAREHOUSE_SIZE — the size is not divided across clusters.

Snowflake/architecture/multi-cluster-warehouses

The following query is intended to find the peak number of concurrently running clusters for a multi-cluster warehouse over the last 7 days. Identify the buggy line number.#

-- Find the peak number of concurrently running clusters for
-- multi-cluster warehouse 'reporting_wh' over the last 7 days.
SELECT
  WAREHOUSE_NAME,
  MAX(AVG_RUNNING) AS peak_clusters
FROM SNOWFLAKE.ACCOUNT_USAGE.WAREHOUSE_LOAD_HISTORY
WHERE WAREHOUSE_NAME = 'REPORTING_WH'
  AND START_TIME >= DATEADD('DAY', -7, CURRENT_TIMESTAMP())
GROUP BY WAREHOUSE_NAME;
Show answer

The bug is on line 5.

Why:

Line 5 uses MAX(AVG_RUNNING) and aliases it as peak_clusters, but the AVG_RUNNING column in WAREHOUSE_LOAD_HISTORY represents the average number of running queries per interval — not the number of running clusters. The query will execute successfully but returns peak concurrent queries, not peak clusters. To compute the number of running clusters, one must query WAREHOUSE_EVENTS_HISTORY for RESUMED and SUSPENDED events, tracking CLUSTER_NUMBER over time to determine how many clusters were active at each point.

Related interview questions

Job market

See snowflake salaries and hiring demand from live job postings.

The other 76 questions

This page shows 25 and marks what you pick. That's as far as a page can go. A free account opens the other 76 and keeps every answer. What you miss comes back until it's right: after a day, then at longer gaps.

Start with this topic

Free · the whole bank · 100 marked answers per 30 days · written feedback on the paid plan

What moved, monthly

One email a month when the bulletin comes out: what moved in the markets we track, and the new question topics we published. Confirm your address to join. Unsubscribe any time.