Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Create an Iceberg materialized view in Amazon Redshift with CREATE MATERIALIZED VIEW … USING ICEBERG, then keep it current by running REFRESH MATERIALIZED VIEW after source changes. Redshift stores the result as an Iceberg table in Amazon S3 or an S3 Table Bucket and registers it in AWS Glue Data Catalog. The procedure requires Iceberg v2 or earlier source tables, the right Glue and source-table permissions, and a query definition that fits Redshift’s refresh rules.

Check prerequisites before creating the view

  • Source format and version: Every source table must be an Apache Iceberg table in the same AWS account and Region as the materialized view, and must use Iceberg format version 2 or earlier. Redshift does not support creating these views over Iceberg v3 tables. See AWS CREATE MATERIALIZED VIEW documentation and AWS Iceberg materialized-view overview.
  • Identifier casing: Use lowercase identifiers in the definition. Creation and refresh are unsupported when enable_case_sensitive_identifier is true; if necessary, disable it for the session before running the statements. The setting is session-specific.
  • Creation permissions: The user creating the view needs CREATE TABLE permission in the target AWS Glue Data Catalog database. The IAM role associated with the external schema—the materialized-view definer role—needs SELECT permission on every source table in the query.
  • Supported sources and expressions: Native Redshift tables, temporary tables, system tables, user-defined functions, mutable functions, and Lake Formation filtered (FGAC) tables cannot be used as sources.

Create an Iceberg materialized view

Use a catalog-qualified name and include USING ICEBERG. Replace the example identifiers and query with your Glue catalog, database, view name, and source tables:

CREATE MATERIALIZED VIEW glue_catalog.database_name.view_name
USING ICEBERG
[LOCATION 's3://bucket/path/']
[PARTITIONED BY (partition_transform [, ...])]
[TABLE PROPERTIES ('property_name' = 'property_value' [, ...])]
AS
SELECT ...;

The optional location lets you choose the S3 storage path; partition transforms let you shape the stored layout for your workload. The result is written as Parquet in Iceberg format and registered in AWS Glue Data Catalog. Compatible Iceberg engines, including Apache Spark, Amazon Athena, and Trino, can access the table.

Do not add Redshift table clauses that are unsupported for this statement, including BACKUP, DISTSTYLE, DISTKEY, or SORTKEY. Iceberg materialized views also do not support AUTO REFRESH.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Refresh the view after source changes

Refresh an Iceberg materialized view explicitly after changes to its source data:

REFRESH MATERIALIZED VIEW glue_catalog.database_name.view_name;

The caller needs ALTER permission on the materialized view, and the definer role must continue to have SELECT permission on all referenced source tables. Do not append CASCADE or RESTRICT; those options are unsupported for Iceberg materialized views. Because automatic refresh is unavailable, schedule or trigger this command through your own workflow.

Understand incremental and full refreshes

Redshift chooses whether to apply eligible changes incrementally or recompute the defining query. Incremental refresh processes changes since the previous refresh; a full refresh reruns the defining query and replaces the stored contents. AWS states: “When incremental refresh is not supported, Amazon Redshift automatically performs a full refresh.” See the REFRESH MATERIALIZED VIEW documentation.

Definitions that can support incremental refresh

For Iceberg materialized views, only COUNT and SUM aggregate functions support incremental refresh. Eligibility also depends on the rest of the defining query and on Redshift having the source-table change history it needs.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Definitions that require a full refresh

Incremental refresh is unavailable for definitions that use constructs such as outer joins, set operations, distinct aggregates, window functions, subqueries, grouping sets, ROLLUP, CUBE, or DISTINCT. A full refresh can require more work because Redshift reruns the query rather than applying only eligible changes.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Why a refresh may recompute or fail

Source snapshots have expired

If the Iceberg snapshots recorded at the previous refresh are no longer available, Redshift may be unable to identify the changes to apply and perform a full recomputation. Set source snapshot retention with your refresh cadence and recovery needs in mind.

The materialized-view data was changed outside Redshift

If an external engine or tool modifies the materialized view’s Iceberg data, Redshift performs a full recomputation on the next refresh.

Another cluster refreshed the same view first

Multiple Redshift clusters can attempt to refresh one Iceberg materialized view. Redshift uses optimistic concurrency control through Glue: only one concurrent refresh succeeds, and an attempt loses if another cluster completes first. Coordinate a single refresh owner where practical; otherwise, retry a losing refresh after the successful one completes.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

A source data file exceeds the deleted-position limit

For Iceberg external-table materialized-view refreshes, AWS documents a limit of up to 4 million deleted positions in a single data file. After reaching that limit, compact the base Iceberg table before continuing to refresh. This is a documented product limit, not a refresh-speed estimate; see AWS Iceberg materialized-view documentation.

Concurrency scaling is involved

Concurrency scaling is not supported for creating or refreshing materialized views on Iceberg tables. Run these operations outside that execution path.

Operational checklist

  1. Confirm source tables are Iceberg v2 or earlier, in the same account and Region, and accessible to the external-schema IAM role.
  2. Use lowercase identifiers and ensure enable_case_sensitive_identifier is false for the session.
  3. Verify the creator has Glue database CREATE TABLE permission and the definer role has source-table SELECT.
  4. Create the view with a catalog-qualified name and USING ICEBERG; omit unsupported clauses and automatic refresh.
  5. Run REFRESH MATERIALIZED VIEW after source changes, ensuring the caller has view ALTER permission.
  6. For refresh issues, check query eligibility, snapshot retention, external edits, concurrent refreshes, and the deleted-position limit.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.