One of Snowflake's most distinctive features is zero-copy cloning: the ability to make an instant copy of a table, schema, or entire database without duplicating the underlying storage. A clone of a multi-terabyte table is created in seconds and, at the moment of creation, costs nothing extra in storage. It's the feature that makes spinning up a full production-like environment for development or testing practical instead of prohibitively expensive.
How zero-copy works
Snowflake stores data in immutable micro-partitions. A clone doesn't copy those partitions - it creates new metadata that points at the same existing ones. The clone and its source share storage until one of them changes. When you modify the clone, Snowflake writes new micro-partitions only for the changed data, and the clone starts diverging from the source one partition at a time. You pay for storage only on what actually changes, which is why a fresh clone of a huge table is effectively free.
-- Clone a whole database for a test environment
CREATE DATABASE analytics_test CLONE analytics;
-- Clone a single table
CREATE TABLE orders_sandbox CLONE prod.public.orders;
What you can clone, and what comes along
Cloning works at the table, schema, and database level. Cloning a database clones all the schemas and objects inside it; cloning a schema clones its tables, views, and other objects. The clone is fully independent after creation - writing to it never affects the source, and vice versa. A few things to know: clones include the data and structure but get their own privileges (grants aren't automatically copied to a cloned database unless you ask), and external named stages and pipes have specific cloning behavior worth checking for ingestion-heavy schemas.
Cloning plus Time Travel
Cloning combines with Time Travel to clone data as it was at a past point - invaluable for recovering from a bad load or reproducing a historical state. You can clone from a timestamp or an offset, producing an independent copy of yesterday's table to investigate without touching production:
CREATE TABLE orders_yesterday CLONE prod.public.orders
AT (OFFSET => -60*60*24); -- as it was 24 hours ago
Where it pays off
The practical wins are dev and test environments (a real copy of production data without the storage bill or the hours-long copy), safe experimentation (clone, run a risky migration, throw the clone away), and point-in-time recovery (clone from before an incident and compare). The one caution is that "free" applies at creation - as a long-lived clone diverges from its source, it accumulates its own storage, so short-lived clones for testing are the cheapest pattern and stale clones are worth dropping.
Frequently asked questions
Why is cloning instant and free? A clone copies metadata pointing at the source's existing micro-partitions rather than copying the data; storage is only consumed as the clone diverges from the source.
Does writing to a clone affect the original? No. After creation the clone is fully independent - changes to either side don't affect the other.
Can I clone data as it was in the past? Yes, by combining cloning with Time Travel using AT or BEFORE with a timestamp or offset.
Do clones stay free forever? No - the clone starts free, but as you modify it, Snowflake writes new micro-partitions and the clone accrues its own storage cost. Drop stale clones to avoid paying for divergence.