Snowflake Storage for Apache Iceberg™ Tables

This preview introduces support for Snowflake Storage for Apache Iceberg™ Tables.

Just like standard Snowflake tables, this feature lets you to create Snowflake-managed Iceberg tables in Snowflake. With this option, Snowflake stores and manages the Iceberg table files for you by using Snowflake (internal) storage, so you don’t need to set up access to external cloud storage.

This feature works with the Snowflake Horizon Catalog, so you can use an external query engine to connect to an Iceberg table that uses Snowflake storage. For more information, see Access Apache Iceberg™ tables with an external engine through Snowflake Horizon Catalog. In addition, you can query these same tables in Snowflake.

Note

This feature is currently available only for accounts hosted on Amazon Web Services (AWS) or Azure.

Billing for Snowflake Storage for Iceberg Tables

Snowflake bills your account for the following usage:

Storage cost

  • Snowflake charges for every byte stored in Snowflake.

    During the preview period, Snowflake aggregates the storage usage for Iceberg tables that use Snowflake storage in the STORAGE_BYTES column of the STORAGE_USAGE view, together with storage usage for non-Iceberg tables. Only files that are committed to the catalog are included in STORAGE_BYTES. Snowflake doesn’t bill for abandoned commits.

    The cost for this storage cost usage is described in Table (a) of the Snowflake service consumption table on the Snowflake website.

Request cost

Note

Any time you use a query engine through Horizon Catalog to access Iceberg tables that are stored in Snowflake, the query engine is considered an external query engine. When you use an external query engine to access these tables, Snowflake bills your account for this access.

The following list describes some cases where external query engines access Iceberg tables that are stored in Snowflake:

  • Snowflake engines that access the table through Horizon Catalog from another Snowflake account. For example, if a table is managed by Snowflake account A but you access the table from the Snowflake engine in account B through Horizon Catalog, you are charged for this access. You are charged for this access because the Snowflake engine in account B is an external query engine.

  • Third-party query engines that you deploy within the Snowflake network by using Snowflake Container Services. When you use these engines through Horizon Catalog to access the table, the engine is external and their requests are billed in the same way as other third-party query engines.

  • Third-party query engines that you deploy outside of Snowflake that you use to connect to the table through Horizon Catalog.

Snowflake doesn’t bill your account when you use the Snowflake query engine to directly access Iceberg these Iceberg tables, which means you don’t access them through Horizon Catalog. For example, if a table is managed by account A and you use the Snowflake engine in account A to access the table, you aren’t charged for this access.

  • When you use an external query engine through Snowflake Horizon Catalog to access Iceberg tables that use Snowflake storage, Snowflake bills your account a per-request fee for each HTTP request sent to the underlying storage system. The rate depends on the request type:

    • PUT, COPY, POST, PATCH and LIST operations, which are billed as “class 1”.

    • GET and SELECT operations, which are billed as “class 2”.

    To view the request counts for these operation types, use the STORAGE_REQUEST_HISTORY Account Usage view. This usage is billed under the STORAGE_REQUEST-1 and STORAGE_REQUEST-2 SKUs on the billing report.

    This rate is described in Table 3(g) of the Snowflake service consumption table.

Data transfer cost

  • When you use an external query engine through Horizon Catalog to access the table from a different region or with another cloud provider, a standard data transfer charge is billed on a per-byte basis.

    This data transfer charge is described in Tables 4(a), 4(b), and 4(c) of the Snowflake service consumption table.

    For more information, see Understanding data transfer cost.

Create an Iceberg table with Snowflake storage

  • Create an Iceberg table that uses Snowflake storage:

    CREATE ICEBERG TABLE my_iceberg_table_internal (col1 int)
      CATALOG = SNOWFLAKE
      EXTERNAL_VOLUME = SNOWFLAKE_MANAGED;
    
    • The CATALOG must be SNOWFLAKE. However, the default catalog at the account level is set to SNOWFLAKE, so you can omit the CATALOG parameter if you haven’t changed this default. For more information on setting a default catalog, see Set a default catalog at the account, database, or schema level.

    • The EXTERNAL_VOLUME must be SNOWFLAKE_MANAGED. SNOWFLAKE_MANAGED is a reserved external volume name that tells Snowflake to use Snowflake Storage for the Iceberg table. However, the default external volume at the account level is set to SNOWFLAKE_MANAGED, so you can omit the EXTERNAL_VOLUME parameter if you haven’t changed this default. For more information on setting a default external volume, see Set a default external volume at the account, database, or schema level.

    Warning

    The Iceberg table that you create uses catalog-vended credentials. When you clone an Iceberg table that uses catalog-vended credentials, the cloned table shares the same base location as the source table. The same credentials can be used to access the shared base location, so the cloned table has write access to the source table.

Considerations

Consider the following when you work with Iceberg tables that use Snowflake storage:

  • This feature is currently available only for accounts hosted on Amazon Web Services (AWS) or Azure.