> Hullaballooing
← All 50 Days
Day 11 of 50
D1: Architecture & Features Week 2
DAY 11

Snowflake Table Types – Permanent, Transient, Temporary & External

Snowflake has four table types with nearly identical DDL but very different storage and recovery behaviour: permanent, transient, temporary, and external. The transient drop scenario is the trap that catches most COF-C03 candidates on the exam.

🗣️ Plain-English First
TermPlain meaning
Time TravelThe window during which you can query, clone, or UNDROP historical data. 1 to 90 days depending on edition and table type.
Fail-safeA fixed 7-day disaster-recovery copy that Snowflake holds after Time Travel ends. Only Snowflake Support can recover from it. You pay storage for it whether you use it or not.
Permanent tableThe default. Full Continuous Data Protection. Time Travel plus Fail-safe. Lives until you drop it.
Transient tableSame scope as permanent, but no Fail-safe. Cheaper to store. Time Travel capped at 1 day.
Temporary tableLives inside one session. Vanishes at session end. Invisible to every other session. No Fail-safe.
External tableFiles stay in S3, Azure Blob, or GCS. Snowflake only holds the metadata. Read-only by default.
SessionOne authenticated connection. Ends on logout, driver disconnect, or 4 hours of idle by default for programmatic clients.
📘

Today’s Concept

Micro-Concept 1: The Master Comparison Table

The matrix below answers most table-type questions on the exam. Read it row by row, and pay attention to the asymmetries between columns.

PropertyPermanentTransientTemporaryExternal
Default type?Yes (default)No (explicit)No (explicit)No (explicit)
Survives session end?YesYesNo (vanishes)Yes
Visible to other sessions?YesYesNoYes
Time Travel0–1 day Standard; 0–90 days Enterprise+0–1 day0–1 day (bounded by session)No Time Travel
Fail-safe7 days (always)No Fail-safeNo Fail-safeNo Fail-safe
Storage costHighest (active + TT + Fail-safe)Medium (active + TT only)Lowest (only while session lives)None inside Snowflake (you pay cloud-storage bills)
Writable?YesYesYesRead-only by default (Iceberg can write, see Day 12)
DDL keywordCREATE TABLECREATE TRANSIENT TABLECREATE TEMPORARY TABLECREATE EXTERNAL TABLE

Micro-Concept 2: Permanent, the Default

A plain CREATE TABLE with no qualifier produces a permanent table. You get the full Continuous Data Protection lifecycle: active storage flows into Time Travel when data changes, then into Fail-safe after Time Travel ends. You pay for all three tiers. Use permanent for anything where data loss would actually hurt the business (source-of-truth tables, curated layers, and anything downstream consumers rely on).

Retention nuances that the exam pokes at:

  • Standard edition is capped at 1 day of Time Travel.
  • Enterprise edition and above lets you set DATA_RETENTION_TIME_IN_DAYS anywhere from 0 to 90.
  • Fail-safe is fixed at 7 days for permanent tables. There is no parameter to change it, shorten it, or skip it.

Micro-Concept 3: Transient, Cheaper Storage with No Fail-safe Layer

Transient tables behave like permanent tables in every way that matters for SQL access. They survive sessions. Any role with the right grants can read them. The difference sits one layer below: no Fail-safe.

Once the Time Travel window (1 day maximum) closes, the data is purged the instant the retention clock ticks past zero. There is no second layer. No support ticket gets it back.

Where transient earns its place:

  • Staging and landing zones rebuilt from source on every load.
  • Work tables and scratch space inside long-running pipelines.
  • Large intermediate ETL tables where 7 days of Fail-safe on multi-TB data would be pure waste.

On a 5 TB nightly staging table, skipping 7 days of Fail-safe is a real number on the monthly storage line. On a recent client pipeline, every landing-layer table was transient for exactly this reason. The source of truth was the upstream system, and reloading was cheap.

One trap that costs people marks: a table’s type is fixed at creation. There is no ALTER TABLE ... SET TRANSIENT. To “convert” you clone or CTAS into a new table of the desired type and swap names. The lab walks through this.

Micro-Concept 4: Temporary, Session-Scoped

A temporary table lives only as long as the session that created it. The properties that show up on the exam:

  • Auto-dropped when the session ends. Explicit DROP works too but is not required.
  • Invisible to every other session. Two users can each create my_temp in the same schema at the same time with different columns. There is no collision, because neither sees the other’s table.
  • Can shadow a permanent table of the same name. Inside the session that created the temp, the temp wins for that name. Outside that session, the permanent table is still visible and unchanged. When the session ends, the permanent re-emerges. This is a favourite exam trap.
  • Time Travel up to 1 day, but always bounded by the session itself. Whichever ends first wins.

Micro-Concept 5: External Tables, Metadata in Snowflake, Data Outside

An external table points Snowflake at files sitting in S3, Azure Blob, or GCS via a stage. The schema definition and partition metadata live in Snowflake. The actual data files never do.

  • Read-only by default. Standard external tables reject DML. Iceberg tables, covered tomorrow, allow writes.
  • No Time Travel. No Fail-safe. There is no Snowflake-managed history of data that Snowflake does not store.
  • Used heavily in data lake patterns where the same files need to be queryable by Snowflake and by Spark, Athena, or other engines.
  • Performance leans on a partition column defined against the file layout on object storage. Without it, every query scans all files.

Micro-Concept 6: The Drop + UNDROP Lifecycle by Type

This is the verbatim Q37 scenario from the SnowPro practice review, and it catches a lot of candidates. What happens at DROP, and where the recovery window ends, is different for every type:

TypeRecoverable within Time TravelRecoverable via Fail-safeEnd state after retention
PermanentYes. UNDROP within Time Travel window (up to 90d Enterprise+)Yes. Snowflake Support, 7 daysUp to 97 days protected, then gone
TransientYes. UNDROP within max 1 dayNoGone after 1 day max. Support cannot recover.
TemporaryWithin the session, up to retention settingNoGone at session end. Always.
ExternalUNDROP recreates the metadata if within retention; the data in S3/Azure/GCS was never inside Snowflake anywayNoMetadata gone after retention; cloud data is untouched (you control that)

Micro-Concept 7: Naming Conflicts

Naming rules across types are exam-favourite trivia, and the asymmetry catches people:

  • A permanent and a transient table cannot share a name in the same schema. The second CREATE errors out.
  • A temporary table CAN share a name with a permanent or transient table in the same schema. Inside the creating session the temp wins and the underlying table is hidden (not dropped). When the session ends, the original becomes visible again.

Cheat Sheet

ConceptWhat to remember
Default typePermanent.
Fail-safePermanent only. 7 days. Snowflake Support recovers. Transient, temporary, external = none.
Time Travel maxPermanent: 1 day Standard, 90 days Enterprise+. Transient + Temporary: 1 day max. External: no Time Travel.
Survives sessionPermanent, transient, external = yes. Temporary = no.
Cross-session visibilityTemporary = no (invisible to other sessions). All others = yes.
Transient droppedUNDROP within 1 day; after that, gone forever (no Fail-safe).
Temporary dropped or session endsGone forever. Not recoverable.
Type conversionNot allowed. Use clone or CTAS, then swap names.
Name shadowingTemp can shadow a permanent table within its session. Original re-emerges when session ends.
External writesRead-only by default. (Iceberg = exception, Day 12.)
Storage cost rankingPermanent > Transient > Temporary > External (Snowflake-internal)
🎯 Exam Tip

Three traps appear on this topic across most mock tests. (1) “Transient tables have a 7-day Fail-safe period”: FALSE. Zero days. That is the defining property of the transient type. (2) “Snowflake Support can recover a dropped transient table after Time Travel expires”: FALSE. No Fail-safe means Support has nothing to recover from. Once the Time Travel window closes (1 day maximum) the data is purged immediately. If “ask Snowflake Support” appears as an option on a transient-table question, it is the distractor. (3) “Temporary tables become visible across sessions when you grant SELECT”: FALSE. Session scope is absolute. No GRANT, no role escalation, no ACCOUNTADMIN trick changes it. When a question describes another session looking at a temp table, the answer is “object does not exist” every single time.

🛠️

Hands-On Lab

Type: LAB (guided)  |  Time: ~10 minutes  |  Credits: ~0.05  |  Prerequisite: lab_xs + day10_orders from Day 10.  |  Lab needs TWO worksheets for step 4.
1

Create one table of each type and inspect them. The metadata in SHOW TABLES is where the three types declare themselves.

SQL
USE ROLE SYSADMIN;
USE WAREHOUSE lab_xs;
ALTER WAREHOUSE lab_xs RESUME IF SUSPENDED;

-- Permanent (default)
CREATE OR REPLACE TABLE perm_t  (id INT, val STRING);

-- Transient
CREATE OR REPLACE TRANSIENT TABLE trans_t (id INT, val STRING);

-- Temporary (session-scoped)
CREATE OR REPLACE TEMPORARY TABLE temp_t (id INT, val STRING);

SHOW TABLES LIKE '%_t';
-- Inspect: kind column, retention_time column, is_temporary, is_transient
👀 Observe: The kind column reads TABLE, TRANSIENT, or TEMPORARY. Retention defaults to 1 day on all three. The is_transient and is_temporary flags are mutually exclusive. A row never has both set true.
2

Verify storage-tier differences via TABLE_STORAGE_METRICS. Load some rows first so there is something to measure.

SQL
INSERT INTO perm_t  SELECT seq4(), 'val_' || seq4() FROM TABLE(GENERATOR(ROWCOUNT => 100000));
INSERT INTO trans_t SELECT seq4(), 'val_' || seq4() FROM TABLE(GENERATOR(ROWCOUNT => 100000));
INSERT INTO temp_t  SELECT seq4(), 'val_' || seq4() FROM TABLE(GENERATOR(ROWCOUNT => 100000));

-- TABLE_STORAGE_METRICS shows ACTIVE / TIME_TRAVEL / FAILSAFE bytes per table
SELECT
  TABLE_NAME, IS_TRANSIENT,
  ACTIVE_BYTES, TIME_TRAVEL_BYTES, FAILSAFE_BYTES,
  RETENTION_TIME
FROM SNOWFLAKE.ACCOUNT_USAGE.TABLE_STORAGE_METRICS
WHERE TABLE_NAME IN ('PERM_T','TRANS_T','TEMP_T')
ORDER BY TABLE_NAME;
-- (May lag a few minutes due to ACCOUNT_USAGE latency.)
👀 Observe: Once ACCOUNT_USAGE catches up, only PERM_T can show non-zero FAILSAFE_BYTES. TRANS_T and TEMP_T read zero in that column today, and they will still read zero a year from now. That column is the storage-cost difference between the types, made visible.
3

Confirm temp_t is visible inside its own session. Stay in this worksheet; the SELECT will work.

SQL
SELECT COUNT(*) FROM temp_t;  -- works (same session)
👀 Observe: Returns 100,000. Open a brand-new Snowsight worksheet in a new tab. That opens a fresh session. Run step 4 there.
4

From the second worksheet, try to read temp_t. Seeing the error message makes session scope concrete in a way that reading about it does not.

SQL
-- In a NEW worksheet (new session):
SHOW TABLES LIKE 'temp_t';     -- empty result
SELECT * FROM temp_t;          -- ERROR: object does not exist

-- But trans_t and perm_t are visible:
SELECT COUNT(*) FROM trans_t;  -- works
SELECT COUNT(*) FROM perm_t;   -- works
👀 Observe: The second session sees perm_t and trans_t fine but cannot even list temp_t. No grant fixes this. There is nothing to grant on. The temp table does not exist for any session other than the one that created it. This property is what makes temp tables safe for per-user scratch state inside stored procedures and notebooks.
5

Test the transient drop and UNDROP window, the Q37 scenario in code. Back in worksheet 1.

SQL
DROP TABLE trans_t;
UNDROP TABLE trans_t;   -- works within Time Travel window (≤ 1 day for transient)

SELECT COUNT(*) FROM trans_t;
-- 100,000 rows restored

-- After 1 day max, that UNDROP would fail with a not-found error.
-- And Snowflake Support cannot recover it — no Fail-safe.
👀 Observe: Time Travel is the only recovery window for a transient table. Drop a transient table at end-of-day Friday with default 1-day retention. Leave for the weekend. Monday morning the data is unrecoverable. This is exactly the scenario behind the verbatim Q37 in the Practice Questions section below.
5b

Prove the “type is fixed at creation” rule using clone and swap. The only way to “change” a table’s type is to create a new table of the desired type with the same data, then rename.

SQL
-- Direct ALTER to change type? Not a thing — there is no ALTER TABLE ... SET TRANSIENT.
-- Pattern: CLONE into the new type, then ALTER ... SWAP WITH to rename atomically.

CREATE TRANSIENT TABLE perm_t_new CLONE perm_t;   -- new table, new type, zero-copy data
ALTER TABLE perm_t SWAP WITH perm_t_new;          -- atomic name swap
DROP TABLE perm_t_new;                            -- old permanent table, now under the _new name

-- Verify the kind flipped:
SHOW TABLES LIKE 'perm_t';
-- kind column now reads TRANSIENT
👀 Observe: CLONE plus SWAP WITH is the standard “convert” pattern. The clone is zero-copy: no data is moved, only metadata is created. The swap is metadata-only and atomic. A downstream query running against perm_t at the swap moment sees either the old version or the new version, with no gap in between. One thing to call out: the Fail-safe history of the original permanent table does not survive the conversion. The new transient has no Fail-safe by definition. Anything in the old permanent’s Fail-safe layer is lost once the dropped permanent ages out.
6

Cleanup. Keep day10_orders. The lab dependency map needs it through Day 39.

SQL
DROP TABLE IF EXISTS perm_t;
DROP TABLE IF EXISTS perm_t_new;   -- swapped-out original from step 5b, if you ran it
DROP TABLE IF EXISTS trans_t;
-- temp_t auto-drops on session end (or DROP if you want to be explicit)
DROP TABLE IF EXISTS temp_t;

ALTER WAREHOUSE lab_xs SUSPEND;
-- KEEP day10_orders — needed for Days 13, 26, 31, 32, 35, 39
💡 Pro tip: In production, the pattern that holds up across most pipelines I have built is straightforward. Use TRANSIENT for staging and landing. Use PERMANENT for curated and serving layers. Use TEMPORARY for in-session intermediates inside a stored procedure or notebook. Match the table type to the recovery tolerance of the data, not to a default habit.
❄️

Snowflake Documentation

🔗

External References

Practice Questions

Options:

A. The table is no longer available for use.
B. The table can be undropped using Fail-safe.
C. The table can be recovered for 1 day only and after that it is no longer available.
D. The table can be recovered only with the assistance of Snowflake Support.

✅ Answer: C

Why C: Transient tables get a maximum 1-day Time Travel window and no Fail-safe layer behind it. UNDROP works as long as the drop happened inside that window. After 1 day the data is purged and no further recovery path exists.

Why not A: Too absolute. The table is recoverable for up to a day after the drop. That is the whole point of the question.

Why not B: Fail-safe does not exist for transient tables. This is the single most-tested distinction in the table-types syllabus.

Why not D: Without Fail-safe there is nothing for Snowflake Support to recover from. Any answer option that routes a transient-table recovery through Support is the distractor.

Options:

A. The query returns the row count from the original creator’s temp table
B. The query errors because temporary tables are visible only to the session that created them
C. The query waits until the original session ends, then returns the row count
D. The query returns 0 rows but the table is visible

✅ Answer: B

Why B: Session scope on temporary tables is absolute. No grant, no role escalation, no USE SECONDARY ROLES ALL trick makes a temp table visible in another session. The second session’s query errors with object-does-not-exist.

Why not A: There is no cross-session visibility at all. Even if the second user had ACCOUNTADMIN, the result would not change.

Why not C: Snowflake does not queue queries waiting for someone else’s session to end. The distractor sounds plausible but does not match how the platform works.

Why not D: The object is not visible. There is no row of metadata to return zero rows from. The query fails before execution.

Options:

A. Permanent only
B. Permanent and transient
C. Permanent, transient, and temporary
D. All four types including external

✅ Answer: A

Why A: Fail-safe is exclusive to permanent tables, fixed at 7 days, and not configurable. Every other type is explicitly designed without it.

Why not B: Transient tables skipping Fail-safe is the defining feature of the type. That is exactly how they reduce storage cost.

Why not C: Temporary tables also have no Fail-safe. They cannot, because they do not survive the session that created them.

Why not D: External tables hold zero data inside Snowflake. There is no internal storage layer for Fail-safe to apply to.

Options:

A. Only the metadata lives in Snowflake; the actual data files remain in S3, Azure Blob, or GCS
B. Standard external tables are read-only by default
C. External tables support up to 90 days of Time Travel on Enterprise Edition
D. External tables are stored inside Snowflake’s micro-partition system
E. External tables have a 7-day Fail-safe period

✅ Answer: A, B

Why A: The defining property of an external table is that the schema and partition metadata sit in Snowflake. The files stay in cloud object storage. That is what makes the data-lake pattern work.

Why B: Standard external tables reject DML. Iceberg tables, a different feature covered on Day 12, change this. The question asks about external tables in general.

Why not C: External tables have no Time Travel. The data is not in Snowflake, so Snowflake cannot version it.

Why not D: External tables do not live in Snowflake’s storage layer. That is precisely the architectural choice the type exists to enable.

Why not E: No Fail-safe, for the same reason as no Time Travel. Snowflake protects what Snowflake stores.

Options:

A. Permanent: strongest protection
B. Transient: same scope as permanent but no Fail-safe storage cost
C. Temporary: auto-cleanup is free
D. External: no Snowflake storage at all

✅ Answer: B

Why B: The defining clue is “rebuilt every night from the upstream system.” The data is reproducible, so paying for Fail-safe to protect it is wasted spend. Transient gives the same multi-session SQL access as permanent while skipping the Fail-safe storage line entirely.

Why not A: Permanent on 5 TB pays for 7 days of Fail-safe storage on a table that is overwritten every 24 hours. The Fail-safe layer protects data that is already reproducible from source. That is pure waste.

Why not C: Staging tables in real pipelines need to be readable by orchestration tools, monitoring dashboards, and downstream loads. All of those run in different sessions. Temporary vanishes at the creator’s session end, which breaks every one of those consumers.

Why not D: External tables require the source files to already be sitting in cloud object storage and are read-only. The scenario here is data landing into Snowflake, not querying files in place.

📝 Recap

Today you learned: Four table types, separated by scope and protection. Permanent is the default, with full Time Travel (up to 90 days on Enterprise+) and a fixed 7-day Fail-safe period. Transient has the same multi-session scope as permanent but caps Time Travel at 1 day and has no Fail-safe. Temporary is session-scoped, vanishes when the session ends, and is invisible to every other session. External holds nothing in Snowflake storage. The data sits in S3, Azure, or GCS, and the type is read-only by default with no Time Travel and no Fail-safe. Type is fixed at creation; clone or CTAS plus a name swap is the only way to “convert.”

Key takeaway: Match the table type to the recovery tolerance of the data. Reproducible data is transient. Per-session scratch is temporary. Source-of-truth and curated layers are permanent. Lake-style files queried in place are external.

Tomorrow (Day 12): Apache Iceberg & Dynamic Tables, two newer C03 table types. Iceberg is the open table format Snowflake reads and writes via a catalog, extending external-table semantics with full DML. Dynamic Tables are declarative pipelines that refresh on a TARGET_LAG instead of streams and tasks wired up by hand.

Abhay Krishnan

Abhay Krishnan

Senior Data & AI Consultant
Connect on LinkedIn

With over five years of data engineering experience at EY and Infosys, Abhay Krishnan specializes in building scalable data pipelines and cloud warehousing solutions. He is a certified SnowPro Core professional, alongside credentials in AWS and Azure. Abhay created this 50-day track to solve a problem he faced firsthand: the lack of a structured, free resource for Snowflake certification prep. Follow him on LinkedIn for more data engineering insights.