What you will be able to do
- Choose between external tables, Iceberg tables and hybrid tables based on where data lives, who manages it and how it is accessed
- Configure external table partitioning and metadata refresh, including Delta Lake limitations
- Control Iceberg DML write behaviour with ICEBERG_MERGE_ON_READ_BEHAVIOR and explain Snowflake-managed versus external catalogs
- Federate a remote Iceberg REST catalog into Snowflake with a catalog-linked database, and tell this apart from external engines reading through Horizon Catalog
- Swap tables, enable automatic schema evolution on load, and unload partitioned files with COPY INTO <location>
Key concept
Storage and catalog ownership decide the table type — Each Snowflake table type answers two questions differently: where the data files live, and who keeps track of them. External tables keep data in cloud storage that you manage. Iceberg tables let you choose: Snowflake storage (EXTERNAL_VOLUME = SNOWFLAKE_MANAGED, with Fail-safe for permanent tables) or an external volume on storage you manage (no Fail-safe). Standard and hybrid tables keep data inside Snowflake. Most management choices in this lesson, such as refresh, DML, Fail-safe and constraints, follow from those two answers.
1.External tables: query files in place, read-only
An external table lets you query files in an external stage as if they were a Snowflake table. Snowflake stores only file-level metadata, such as filenames and version identifiers. The data stays in your cloud storage. External tables can read any format that COPY INTO <table> supports except XML. They are strictly read-only: you can query them, join them and build views on them, but you cannot run DML against them. Every external table has a VARIANT column called VALUE, which holds one row of the file, plus the pseudocolumns METADATA$FILENAME and METADATA$FILE_ROW_NUMBER. You don't need to know the schema up front. If you do know it, you can define typed virtual columns as expressions over VALUE.
Performance is the main thing to manage. Queries can be slower than on native tables, so Snowflake recommends materialized views over external tables. For Parquet, it suggests Iceberg tables instead. The recommended file sizes are 256–512 MB for Parquet files and 16–256 MB for other formats.
Partitioning is the other lever. Partition columns are expressions that parse METADATA$FILENAME, so the storage paths must encode something like a date or a country. You choose one of two methods when you create the table, and you can't change it later. With automatic partitions (the default), Snowflake computes partitions whenever the metadata refreshes. The refresh happens at creation, then either automatically on new-file events or manually with ALTER EXTERNAL TABLE … REFRESH. With user-specified partitions (PARTITION_TYPE = USER_SPECIFIED), you add partitions yourself. This is typically how you keep the table in sync with a metastore such as AWS Glue or Apache Hive.
ALTER EXTERNAL TABLE <name> ADD PARTITION ( <part_col_name> = '<string>' [ , <part_col_name> = '<string>' ] ) LOCATION '<path>'With TABLE_FORMAT = DELTA, a refresh parses the _delta_log transaction files to work out which Parquet files are current. Two limits apply: Delta external tables don't support deletion vectors, and they can't auto-refresh. The feature also carries a deprecation notice. The documented path forward is to migrate to an Iceberg table, which connects to the Delta files through an external volume and a catalog integration.
Checkpoint 1 of 10· Check yourself
An external table uses PARTITION_TYPE = USER_SPECIFIED. A new folder of files lands in the stage. What adds it to the table?
User-defined partitions are added manually with ADD PARTITION. Automatic refresh isn't supported for them, a manual refresh returns a user error, and you can't change the partitioning method after creation.
“Automatically refreshing an external table with user-defined partitions isn’t supported.”Source: docs.snowflake.com
Sources1
2.Iceberg tables: open format, two kinds of catalog
Iceberg tables follow the Apache Iceberg open table format and use Parquet data files. The format adds ACID transactions, schema evolution, hidden partitioning and snapshots on top of the files. You choose one of two storage options. With Snowflake storage (EXTERNAL_VOLUME = SNOWFLAKE_MANAGED), Snowflake stores and manages the files and bills you for the storage, and permanent tables are protected by Fail-safe. With an external volume, the files sit in your own S3, GCS or Azure storage, which Snowflake reaches through the volume. An external volume is an account-level object that holds an IAM entity for the storage location. One volume can serve many tables. With an external volume, you are responsible for data protection: Snowflake doesn't provide Fail-safe, and your cloud provider bills you for the storage.
The second decision is the catalog. With Snowflake as the catalog (a Snowflake-managed table), you get full platform support. That includes full DML (INSERT, MERGE, UPDATE, DELETE, TRUNCATE TABLE) and bulk loading with COPY INTO and Snowpipe. Snowflake also handles lifecycle maintenance such as compaction, though you can disable compaction for a table. With an external catalog such as AWS Glue or Open Catalog, Snowflake needs a catalog integration to read the metadata, and platform support is limited. Snowflake can still write to externally managed tables that use a remote Iceberg REST catalog. You can also convert an externally managed table to use Snowflake as the catalog.
INSERT INTO store_sales VALUES (-99);
UPDATE store_sales
SET cola = 1
WHERE cola = -99;For Snowflake-managed tables, Snowflake writes the Iceberg metadata to a metadata folder on the external volume. You can also call SYSTEM$GET_ICEBERG_TABLE_INFORMATION to generate metadata for recent changes. If a DML statement fails and rolls back, it can leave orphan Parquet files in your storage. If storage usage in your cloud doesn't match TABLE_STORAGE_METRICS, that is the symptom to look for.
UPDATE, DELETE and MERGE raise one more management question: should Snowflake rewrite whole data files (copy-on-write) or write small delete files that readers merge at query time (merge-on-read)? The ICEBERG_MERGE_ON_READ_BEHAVIOR parameter controls this choice. You can set it at the account, database, schema or table level, and the most specific setting wins.
| Iceberg format version | Snowflake-managed Iceberg table | Externally managed Iceberg table |
|---|---|---|
| v2 | Copy-on-write | Merge-on-read |
| v3 | Merge-on-read | Merge-on-read |
'ENABLED' forces merge-on-read regardless of version or management mode, and 'DISABLED' forces copy-on-write. Use 'DISABLED' when other engines can't read v3 deletion vectors. Even when merge-on-read applies, Snowflake decides file by file: it rewrites a file when about 5% or more of its rows are deleted. The parameter only governs DML that Snowflake itself issues. External engines follow their own write.delete.mode, write.update.mode and write.merge.mode table properties.
Checkpoint 2 of 10· Fill the gap
Force merge-on-read for one Snowflake-managed v2 table while the rest of the database stays on 'AUTO'. Which value completes the statement?
ALTER ICEBERG TABLE my_lake.public.events
SET ICEBERG_MERGE_ON_READ_BEHAVIOR = ' ? ';Under 'AUTO', Snowflake-managed v2 tables use copy-on-write. Setting 'ENABLED' on the table forces merge-on-read, and because the table-level value is the most specific, it overrides the database default.
Source: docs.snowflake.comCheckpoint 3 of 10· Exam question
A data engineering team is standing up a new fact table that must support full read and write access from Snowflake, automatic file compaction, and schema evolution managed entirely inside Snowflake, with no dependency on an external metastore. Which table creation approach meets these requirements?
Correct answer: A — Create the object with CREATE ICEBERG TABLE and omit any catalog integration, so Snowflake itself acts as the Iceberg catalog and owns writes, compaction, and schema changes.
- A. Creating the table without a catalog integration makes Snowflake the Iceberg catalog for the table, which is exactly the managed configuration that grants full write access plus automatic compaction and schema evolution handled by Snowflake.
- B. External tables are read-only, metadata-only objects layered over files in a stage; they never support writes or Snowflake-managed compaction, so this does not meet the stated requirement for write access.
- C. Attaching a catalog integration to an external catalog produces an unmanaged Iceberg table, which has limited platform integration and depends on periodic refreshes rather than Snowflake owning compaction and writes directly.
- D. A permanent table is not stored in the open Iceberg table format at all, so it cannot be read by external Iceberg-compatible engines and does not deliver the cross-engine interoperability the scenario is asking for.
Checkpoint 4 of 10· Exam question
An engineer wants to create a Snowflake-catalog Iceberg table but does not want to provision or manage a customer-owned cloud storage bucket for the underlying Parquet files. Which configuration lets Snowflake host the data files itself while the table stays a managed Iceberg table?
Correct answer: A — Set the table's external volume to Snowflake-managed storage so Snowflake stores and manages the underlying files instead of pointing at a customer bucket.
- A. Configuring the external volume with Snowflake-managed storage is the documented option that lets Snowflake host and manage the Parquet files on the team's behalf, avoiding the need to provision a customer-owned bucket.
- B. A customer-owned bucket with a storage integration is the common pattern, but it is not the only option; Snowflake-managed storage exists specifically to remove that provisioning requirement, so this does not satisfy the ask.
- C. Iceberg tables always require an external volume object referencing either Snowflake-managed or customer-owned storage; there is no default internal stage that substitutes for it.
- D. Hybrid tables serve OLTP-style row lookups and are not Iceberg-format tables at all, so switching table types would abandon the Iceberg interoperability the scenario depends on.
3.Federating external catalogs: catalog-linked databases and Horizon Catalog
Creating one externally managed Iceberg table per remote table doesn't scale when a Glue, Unity or Open Catalog deployment holds hundreds of tables. A catalog-linked database solves this. It is a Snowflake database connected to a remote Iceberg REST catalog. Snowflake polls the catalog (every 30 seconds by default, set with SYNC_INTERVAL_SECONDS), discovers namespaces and tables, and registers them automatically. Allowed namespaces appear as schemas, and their Iceberg tables appear inside them. You can query those tables, and you can also create schemas and Iceberg tables that are written back to the remote catalog.
You set up access first. If the remote catalog supports credential vending, a catalog integration with vended credentials is enough. If it doesn't, you need both an external volume and an Iceberg REST catalog integration.
CREATE DATABASE my_linked_db
LINKED_CATALOG = (
CATALOG = 'my_catalog_int'
);After you create the database, check its configuration with SYSTEM$GET_CATALOG_LINKED_DATABASE_CONFIG and its sync health with SYSTEM$CATALOG_LINK_STATUS. The status function also lists remote tables that failed to sync. A table can sync but still fail to refresh, for example because of a corrupted data file. In that case SHOW ICEBERG TABLES reports ICEBERG_TABLE_NOT_INITIALIZED in auto_refresh_status, and queries against the table return an error until you fix the file and turn automated refresh back on. Discovery and schema operations are billed as cloud services. Table creation is billed through auto refresh.
Where Horizon Catalog fits. Snowflake Horizon Catalog is the governance and interoperability layer for data inside and outside Snowflake. Catalog-linked databases are how it connects to your external Iceberg ecosystem, including AWS Glue and Azure OneLake. So the federation recipe is a catalog integration (with vended credentials, or with an external volume) plus a catalog-linked database.
Horizon also works in the other direction. It exposes the Horizon Iceberg REST Catalog API, so external engines such as Spark, Trino, DuckDB and PyIceberg, and catalogs such as AWS Glue and Apache Polaris, can read and write Snowflake-managed Iceberg tables. The two meet at one point: an external engine can reach externally managed tables in a catalog-linked database through the same Horizon endpoint, by passing the catalog-linked database name as the warehouse property. Snowflake RBAC policies apply either way. Externally managed Iceberg tables outside a catalog-linked database aren't accessible through the Horizon Iceberg REST Catalog API.
Checkpoint 5 of 10· Put it in order
Put the steps for federating a remote Iceberg REST catalog into Snowflake in order
- 1.Check the sync status with SYSTEM$CATALOG_LINK_STATUS
- 2.Configure access to the external catalog and table storage (a catalog integration, with vended credentials or an external volume)
- 3.Create the catalog-linked database with CREATE DATABASE … LINKED_CATALOG
- 4.Query the discovered tables, or write to the remote catalog
Access has to exist before you can link the database. You verify the sync before relying on the discovered schemas and tables.
“Before you create a catalog-linked database, you need to configure access to your external catalog and table storage.”Source: docs.snowflake.com
4.Hybrid tables: row store with enforced constraints
Hybrid tables solve a different problem from the other table types. They target transactional (Unistore) workloads: high-concurrency random writes and index-based point reads, such as an ingestion workflow's state table that thousands of parallel workers update. Writes go directly into a row store with row-level locking. Snowflake then copies the data asynchronously into object storage, so large analytical scans don't interfere with operational traffic. The optimizer decides which copy each query reads. Hybrid tables run in the same engine and warehouses as standard tables, so you can join the two types and run a single transaction across both without a two-phase commit. Expect a larger storage footprint, because row data compresses less well than columnar micro-partitions.
| Feature | Hybrid tables | Standard tables |
|---|---|---|
| Primary data layout | Row-oriented, with secondary columnar storage | Columnar micro-partitions |
| Locking | Row-level | Partition or table |
| PRIMARY KEY constraints | Required, enforced | Optional, not enforced |
| FOREIGN KEY constraints | Optional, enforced (referential integrity) | Optional, not enforced |
| UNIQUE constraints | Optional (except for PRIMARY KEY), enforced | Optional, not enforced |
| Indexes | Supported for performance; updated synchronously on writes | Search optimization service; batch updated/maintained asynchronously |
Two management points follow from the table. First, indexes are the performance tool for hybrid tables, and they are updated synchronously on every write, unlike the asynchronously maintained search optimization service on standard tables. Second, CHECK constraints can be defined only at table creation, so plan them up front. Snowflake also advises that you review the documented unsupported features and limitations before creating hybrid tables.
Checkpoint 6 of 10· Match them up
Match each constraint to how it behaves on a hybrid table
Tap a term, then the definition that fits it.
Hybrid tables enforce PRIMARY KEY, FOREIGN KEY and UNIQUE constraints, and you can't mark them NOT ENFORCED. PRIMARY KEY is the only required constraint.
“For hybrid tables, you cannot set the NOT ENFORCED property on PRIMARY KEY, FOREIGN KEY, and UNIQUE constraints.”Source: docs.snowflake.com
Sources8
5.General table management: columns, retention and swapping
Some management tasks apply to any table. You change structure with ALTER TABLE, for example adding columns. You can add several kinds of column in one go: with a NOT NULL constraint, a DEFAULT value or a collation. ADD COLUMN IF NOT EXISTS leaves an existing column untouched instead of failing.
ALTER TABLE t1 ADD COLUMN a2 NUMBER;The retention period controls recovery. DATA_RETENTION_TIME_IN_DAYS sets how long Time Travel actions (SELECT, CLONE and UNDROP) can reach historical data in a table. The default is 1. Standard Edition allows 0 or 1. Enterprise Edition allows 0 to 90 for permanent tables but only 0 or 1 for temporary and transient tables. A value of 0 effectively disables Time Travel. You can set a default at the schema level, and tables created there inherit it. UNDROP restores a dropped table. Temporary tables persist only for the duration of the session and are not visible to other users.
One common pattern is to rebuild a table under a staging name, validate it, and then exchange it with the live table using ALTER TABLE … SWAP WITH. In the documented example, DESC TABLE t1 after the swap shows t2's former column (B1), and t2 now holds t1's columns. The two tables exchange contents and definitions, so the name that consumers query never stops resolving. You also keep the old version under the staging name, which lets you swap back.
ALTER TABLE t1 SWAP WITH t2;Checkpoint 7 of 10· Check yourself
t1 has columns A1, A2, A3. t2 has column B1. After ALTER TABLE t1 SWAP WITH t2, what does DESC TABLE t1 show?
In the documented example, DESC TABLE t1 returns only B1 after the swap. Contents and structure move together.
“The following statement swaps table t1 with table t2:”Source: docs.snowflake.com
6.Schema evolution: letting tables follow their sources
Upstream systems add fields over time. For loads into Snowflake tables, Snowflake can evolve the table automatically in two ways: it adds new columns, and it drops NOT NULL from columns that are missing in new files. You switch this on with ENABLE_SCHEMA_EVOLUTION = TRUE, either in CREATE TABLE or with ALTER TABLE on an existing table. The parameter alone isn't enough, though. A load evolves the table only when all three of these conditions hold:
1. The table has ENABLE_SCHEMA_EVOLUTION set to TRUE. 2. The COPY INTO <table> statement uses MATCH_BY_COLUMN_NAME. 3. The loading role has the EVOLVE SCHEMA or OWNERSHIP privilege on the table.
For CSV files loaded with MATCH_BY_COLUMN_NAME and PARSE_HEADER, you must also set ERROR_ON_COLUMN_COUNT_MISMATCH to false. Schema evolution is a separate feature from schema detection, but the two combine well: a pipeline can create a table from a set of staged files and then keep it in step as the files change.
Know the limits. Automatic evolution is limited to COPY INTO <table> statements and Snowpipe loads. Snowpipe Streaming with the high-performance architecture also supports it, as does the Kafka connector with Snowpipe Streaming Classic. INSERT operations cannot evolve the target table schema, and tasks don't support schema evolution. By default one COPY operation can add at most 100 columns or evolve no more than 1 schema. Contact Snowflake Support to raise either limit. There is no limit on dropping NOT NULL constraints.
For Iceberg tables, the same usage notes apply to Snowflake-managed tables, and you can set ENABLE_SCHEMA_EVOLUTION with ALTER ICEBERG TABLE. Schema evolution is not supported for structured type fields in Iceberg tables. You can also change an Iceberg table's columns by hand: ALTER ICEBERG TABLE supports ADD COLUMN (several columns in one command, with IF NOT EXISTS) and RENAME COLUMN. For an externally managed Iceberg table, Snowflake uses the catalog integration to retrieve the table's metadata and schema from the external catalog, and refreshing the table metadata is part of maintaining such tables.
Checkpoint 8 of 10· Check yourself
A table has ENABLE_SCHEMA_EVOLUTION = TRUE. A COPY INTO loads Parquet files that contain a new field, but no column is added. The loading role has OWNERSHIP. What is the most likely cause?
MATCH_BY_COLUMN_NAME is one of the three required conditions. OWNERSHIP already satisfies the privilege condition, and the ERROR_ON_COLUMN_COUNT_MISMATCH requirement applies to CSV.
“The COPY INTO <table> statement uses the MATCH_BY_COLUMN_NAME option.”Source: docs.snowflake.com
Checkpoint 9 of 10· Exam question
A team maintains two Iceberg tables: one created with Snowflake as the catalog, and one created with a catalog integration against an external catalog where a Spark job owns the writes. A new column must be added to both tables. What is the correct way to apply this change to each table?
Correct answer: A — Run ALTER ICEBERG TABLE ADD COLUMN on the Snowflake-catalog table; for the externally-managed table, add the column via the owning external engine, then refresh it in Snowflake to sync metadata.
- A. For the Snowflake-catalog table, Snowflake owns the metadata so an in-place ALTER adds the column directly; for the externally-managed table, the owning external engine must make the change and Snowflake then refreshes to sync the updated schema, matching how ownership is split between the two catalog modes.
- B. Snowflake can only alter schema directly for tables where it is the catalog; for the externally-managed table the external engine owns writes, so an in-Snowflake ALTER would not be the authoritative path for that table.
- C. Iceberg's schema evolution is a core feature specifically so that columns can be added without rewriting existing data, so dropping and recreating either table is unnecessary and defeats the purpose of using Iceberg.
- D. Snowflake-catalog Iceberg tables accept direct ALTER statements because Snowflake owns their metadata; routing every schema change through Spark would ignore that ownership for the table Snowflake actually manages.
7.Unloading data with COPY INTO <location>
Unloading reverses the load: COPY INTO <location> writes the result of a table or query to a stage or a cloud URL. The source can be a SELECT, including joins across tables. The target can be an internal stage (user, table or named), where you download the files afterwards with GET, or an external stage or cloud URL. You can authenticate with a storage integration or with supplied credentials, and a file format controls how the output is written: TYPE = CSV, JSON or PARQUET, or a named file format. JSON can only be used to unload VARIANT columns.
COPY INTO 'gcs://mybucket/unload/' FROM mytable STORAGE_INTEGRATION = myint FILE_FORMAT = (FORMAT_NAME = my_csv_format);A few copy options shape the output:
- MAX_FILE_SIZE caps each file. The default is 16 MB (16777216 bytes), and the maximum is 5 GB on S3, GCS and Azure stages. - SINGLE = TRUE writes one file instead of many, at a possible cost in performance. The default is FALSE. - HEADER = TRUE includes column headings. The default is FALSE, and with multiple files every file gets the headings. - VALIDATION_MODE = RETURN_ROWS returns the query results instead of unloading them, so you can check the query first. It is the only supported validation option.
Account parameters can restrict unloading: PREVENT_UNLOAD_TO_INLINE_URL blocks ad hoc unloads to cloud storage URLs, and PREVENT_UNLOAD_TO_INTERNAL_STAGES blocks unloads to any internal stage.
To let downstream engines read only part of an export, add PARTITION BY. It takes any SQL expression that evaluates to a string and splits the unloaded rows into separate files by that value. The warehouse's parallelism and the data volume decide how many files Snowflake writes. Filenames start with data_ and include the partition values, and a UUID (the COPY statement's query ID) identifies each file. A NULL partition value produces a _NULL_ path. PARTITION BY can't be combined with OVERWRITE = TRUE, SINGLE = TRUE or INCLUDE_QUERY_ID = FALSE. The documentation's Parquet example partitions by a date column and an hour, with a 32 MB upper size limit per file.
Because partition values end up in file names, and file URLs appear in internal logs that might be processed outside your region, Snowflake recommends partitioning only on dates, timestamps and Booleans. Avoid sensitive strings or integers.
Checkpoint 10 of 10· Check yourself
Which PARTITION BY expression follows Snowflake's guidance for an unload that a downstream job will read one day at a time?
PARTITION BY accepts any expression that evaluates to a string. Snowflake recommends dates or timestamps over potentially sensitive strings or integers, because partition values are written into file names.
“Snowflake recommends partitioning your data on common data types such as dates or timestamps rather than potentially sensitive string or integer values.”Source: docs.snowflake.com
Exam traps
Each one states something that sounds right. Open it to see what is actually true.
1.An external table can take INSERT or UPDATE statements like a native table, as long as you have write access to the stage.Why is that wrong?
External tables are read-only. They support queries, joins and views, but no DML. To modify lake data from Snowflake, use a Snowflake-managed Iceberg table.
2.Every Iceberg table gets Fail-safe because Snowflake manages its metadata.Why is that wrong?
When the files are on an external volume that you manage, you are responsible for protection and recovery, and Snowflake doesn't provide Fail-safe. Fail-safe applies to permanent tables stored in Snowflake storage.
Covered in Iceberg tables: open format, two kinds of catalog
3.Primary keys on hybrid tables are informational, as they are on standard tables.Why is that wrong?
On hybrid tables, PRIMARY KEY is required and enforced, and FOREIGN KEY and UNIQUE constraints are also enforced. On standard tables, these constraints are not enforced.
Covered in Hybrid tables: row store with enforced constraints
4.Setting ENABLE_SCHEMA_EVOLUTION = TRUE on the table is enough for new columns to appear during loads.Why is that wrong?
The load must also use MATCH_BY_COLUMN_NAME, and the loading role needs the EVOLVE SCHEMA or OWNERSHIP privilege on the table.
Covered in Schema evolution: letting tables follow their sources
5.An INSERT ... SELECT into a table with ENABLE_SCHEMA_EVOLUTION = TRUE adds the new columns automatically.Why is that wrong?
Automatic evolution is limited to COPY INTO <table> and Snowpipe loads (plus streaming ingestion paths). INSERT cannot evolve the schema.
Covered in Schema evolution: letting tables follow their sources
6.You can combine PARTITION BY with SINGLE = TRUE to get one file per partition folder.Why is that wrong?
PARTITION BY is not supported together with OVERWRITE = TRUE, SINGLE = TRUE or INCLUDE_QUERY_ID = FALSE.
Covered in Unloading data with COPY INTO <location>
Sources
Every claim above is drawn from one of these pages, quoted as it was written on the date shown.
- 1.
“External tables can access data stored in any format that the COPY INTO <table> command supports, except XML.”
↩︎ External tables: query files in place, read-only“After an external table is created, the method by which partitions are added can’t be changed.”
↩︎ External tables: query files in place, read-only“You generally choose this option to synchronize external tables with other metastores (for example, AWS Glue or Apache Hive).”
↩︎ External tables: query files in place, read-only“You can’t perform data manipulation language (DML) operations on external tables.”
↩︎ Exam trap 1“Automated refreshes aren’t supported for this feature”
↩︎ Prediction“Automatically refreshing an external table with user-defined partitions isn’t supported.”
↩︎ Checkpoint - 2.
“An external volume is a named, account-level Snowflake object that you use to connect Snowflake to your external cloud storage for Iceberg tables.”
↩︎ Iceberg tables: open format, two kinds of catalog“Snowflake storage (EXTERNAL_VOLUME = SNOWFLAKE_MANAGED): Snowflake stores and manages the files for you. Permanent tables are protected by Fail-safe.”
↩︎ Iceberg tables: open format, two kinds of catalog“Snowflake handles all lifecycle maintenance, such as compaction, for the table. However, you can disable compaction for the table, if needed.”
↩︎ Iceberg tables: open format, two kinds of catalog“An Iceberg table that uses an external catalog provides limited Snowflake platform support.”
↩︎ Iceberg tables: open format, two kinds of catalog“With this table type, Snowflake uses a catalog integration to retrieve information about your Iceberg metadata and schema.”
↩︎ Schema evolution: letting tables follow their sources“Snowflake storage (EXTERNAL_VOLUME = SNOWFLAKE_MANAGED): Snowflake stores and manages the files for you. Permanent tables are protected by Fail-safe.”
↩︎ Key concept“Snowflake doesn’t provide Fail-safe for these tables, and your cloud provider bills you for storage.”
↩︎ Exam trap 2 - 3.
“Iceberg tables that use Snowflake as the catalog support full Data Manipulation Language (DML) commands, including the following:”
↩︎ Iceberg tables: open format, two kinds of catalog“The most specific setting wins: a value set on a table overrides values inherited from the schema, database, or account.”
↩︎ Iceberg tables: open format, two kinds of catalog“and uses copy-on-write for Snowflake-managed v2 tables”
↩︎ Prediction - 4.
“A catalog-linked database is a Snowflake database connected to an external Iceberg REST catalog.”
↩︎ Federating external catalogs: catalog-linked databases and Horizon Catalog“In the database, allowed namespaces from the remote catalog appear as schemas, and Iceberg tables appear under their respective schemas.”
↩︎ Federating external catalogs: catalog-linked databases and Horizon Catalog“Before you create a catalog-linked database, you need to configure access to your external catalog and table storage.”
↩︎ Checkpoint - 5.
“Connect to your Iceberg ecosystem, including AWS Glue and Azure OneLake, through catalog-linked databases.”
↩︎ Federating external catalogs: catalog-linked databases and Horizon Catalog - 6.https://docs.snowflake.com/en/user-guide/externally-managed-iceberg-tables-access-horizon-ircOfficial docs
“Use a single catalog endpoint to access both Snowflake-managed and externally managed Iceberg tables.”
↩︎ Federating external catalogs: catalog-linked databases and Horizon Catalog - 7.https://docs.snowflake.com/en/user-guide/tables-iceberg-access-using-external-query-engine-snowflake-horizonOfficial docs
“This integration enables access to Snowflake managed Iceberg tables through external systems.”
↩︎ Federating external catalogs: catalog-linked databases and Horizon Catalog - 8.
“When you write to a hybrid table, the data is written directly into the row store.”
↩︎ Hybrid tables: row store with enforced constraints“hybrid tables typically have a larger storage footprint than standard tables.”
↩︎ Hybrid tables: row store with enforced constraints“Hybrid tables also enforce unique and referential integrity constraints, which are critical for transactional workloads.”
↩︎ Exam trap 3“For hybrid tables, you cannot set the NOT ENFORCED property on PRIMARY KEY, FOREIGN KEY, and UNIQUE constraints.”
↩︎ Checkpoint - 9.
“The following statement swaps table t1 with table t2:”
↩︎ General table management: columns, retention and swapping“The following statement adds a column named a2 to this table:”
↩︎ General table management: columns, retention and swapping - 10.
“Time Travel actions (SELECT, CLONE, UNDROP) can be performed on historical data in the table.”
↩︎ General table management: columns, retention and swapping“A value of 0 effectively disables Time Travel for the table.”
↩︎ General table management: columns, retention and swapping - 11.
“Temporary tables persist only for the duration of the user session and is not visible to other users.”
↩︎ General table management: columns, retention and swapping - 12.
“Automatically adding new columns. Automatically dropping the NOT NULL constraint from columns that are missing in new data files.”
↩︎ Schema evolution: letting tables follow their sources“Additionally, for schema evolution with CSV, when used with MATCH_BY_COLUMN_NAME and PARSE_HEADER, ERROR_ON_COLUMN_COUNT_MISMATCH must be set to false.”
↩︎ Schema evolution: letting tables follow their sources“By default, this feature is limited to adding a maximum of 100 columns or evolving no more than 1 schema per COPY operation.”
↩︎ Schema evolution: letting tables follow their sources“Schema evolution is not supported for structured type fields in Iceberg tables.”
↩︎ Schema evolution: letting tables follow their sources“The role used to load the data has the EVOLVE SCHEMA or OWNERSHIP privilege on the table.”
↩︎ Exam trap 4“INSERT operations cannot evolve the target table schema automatically.”
↩︎ Exam trap 5“The COPY INTO <table> statement uses the MATCH_BY_COLUMN_NAME option.”
↩︎ Checkpoint - 13.
“You can perform ADD COLUMN operations on multiple columns in the same command.”
↩︎ Schema evolution: letting tables follow their sources - 14.
“Specifies an expression used to partition the unloaded table rows into separate files.”
↩︎ Unloading data with COPY INTO <location>“only include dates, timestamps, and Boolean data types in PARTITION BY expressions.”
↩︎ Unloading data with COPY INTO <location>“PREVENT_UNLOAD_TO_INTERNAL_STAGES prevents data unload operations to any internal stage, including user stages, table stages, or named internal stages.”
↩︎ Unloading data with COPY INTO <location>“The only supported validation option is RETURN_ROWS.”
↩︎ Unloading data with COPY INTO <location>“The following copy option values are not supported in combination with PARTITION BY: OVERWRITE = TRUE SINGLE = TRUE INCLUDE_QUERY_ID = FALSE”
↩︎ Exam trap 6“Snowflake recommends partitioning your data on common data types such as dates or timestamps rather than potentially sensitive string or integer values.”
↩︎ Checkpoint - 15.
“The default value is 16777216 (16 MB) but can be increased to accommodate larger files.”
↩︎ Unloading data with COPY INTO <location>