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

Amazon Redshift can store a materialized view’s query results as an Apache Iceberg table in Amazon S3 or an S3 Table Bucket. Redshift writes the data as Parquet and registers the Iceberg table in AWS Glue Data Catalog, where Iceberg-compatible engines such as Athena, Spark, and Trino can read it. You refresh the view manually; depending on its SQL and the source snapshots available, Redshift applies eligible changes incrementally or recomputes the result.

What is an Iceberg materialized view in Redshift?

It is a stored query result that Redshift manages as an Iceberg table, rather than as a materialized view kept in Redshift-managed storage. The underlying result is written to S3 as Parquet and registered in AWS Glue Data Catalog. This makes the output available to other engines that can read Iceberg tables, while Redshift remains responsible for refreshing and dropping the Redshift-created view. See AWS’s guide to materialized views stored as Apache Iceberg tables.

Because the result is physically stored, a reader can query the materialized output without rerunning the defining query against its source tables for every read. That can suit repeated analytical queries, but AWS’s feature documentation does not establish a particular performance improvement; results depend on the workload and should be measured in your environment.

How does Redshift create and refresh one?

  1. Define the view: Write a query over supported Iceberg source tables and create the materialized view with USING ICEBERG. The target database must exist in Glue Data Catalog.
  2. Store the result: Redshift executes the query and writes the result as Parquet data in S3 or an S3 Table Bucket, then registers the Iceberg table in Glue.
  3. Refresh after source changes: Run REFRESH MATERIALIZED VIEW. Redshift compares source Iceberg snapshots with those recorded at the preceding refresh and uses incremental processing when the definition and available snapshots qualify. Otherwise, it recomputes the result.
  4. Query the output: Use Redshift or another Iceberg-compatible engine, such as Athena, Spark, or Trino, to read the resulting table.

To inspect refresh history for the local cluster, query SVL_MV_REFRESH_STATUS; its records indicate whether a refresh was incremental or full. Each cluster keeps its own history. Use SHOW TABLES to locate Iceberg materialized views in supported catalog paths.

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

How is an Iceberg-stored view different from a view on an Iceberg source?

The distinction is where the materialized result is stored. A conventional Redshift materialized view is stored in Redshift-managed storage. An Iceberg-stored view uses USING ICEBERG and writes its result to S3 as an Iceberg table. A third, different arrangement is an ordinary Redshift materialized view whose query reads an Iceberg source table.

Implementation Where the result is stored Refresh behavior relevant to this feature Who can read the result
Ordinary Redshift materialized view Redshift-managed storage Uses Redshift materialized-view refresh options; behavior depends on the view and configuration. Redshift users and workloads.
Redshift materialized view defined on an Iceberg source Redshift-managed storage General Redshift refresh guidance can include autorefresh for views defined on Iceberg tables. Redshift users and workloads.
Redshift materialized view stored as Iceberg (USING ICEBERG) Parquet data in S3 or an S3 Table Bucket, registered in Glue Data Catalog Manual refresh; eligible definitions may refresh incrementally, while others require a full refresh. Redshift and other Iceberg-compatible engines.

For the Iceberg-stored case, AWS explicitly says autorefresh is unsupported. Do not apply guidance about autorefresh for views defined on Iceberg sources to a view whose own output is stored as Iceberg. The feature-specific rules are in AWS’s CREATE MATERIALIZED VIEW documentation and REFRESH MATERIALIZED VIEW documentation.

Which queries can refresh incrementally?

Incremental refresh is limited to supported SQL shapes. AWS documents eligible patterns that include SELECT queries with FROM, WHERE, and GROUP BY using COUNT and SUM, as well as inner joins between Iceberg sources. Eligibility depends on the complete view definition, not just whether it contains one supported function.

The following constructs make a view ineligible for incremental refresh under the documented rules, so refresh requires full recomputation:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  • Outer joins: LEFT, RIGHT, and FULL.
  • Set operations: UNION, UNION ALL, INTERSECT, EXCEPT, and MINUS.
  • Aggregates other than COUNT and SUM, including distinct aggregates such as COUNT(DISTINCT) and SUM(DISTINCT).
  • Window functions, subqueries, or DISTINCT.
  • GROUPING SETS, ROLLUP, or CUBE.

Even a definition that supports incremental refresh may need a full refresh if the source snapshots from its previous refresh have expired. A change to the materialized-view data made by an external engine or tool also forces full recomputation at the next refresh. Check the refresh status rather than assuming that each refresh was incremental.

What must be in place before creating one?

Supported source tables and Redshift deployment

  • Every source must be an Apache Iceberg table in format version 2 or earlier. Native Redshift tables and other non-Iceberg sources are not allowed in an Iceberg-stored view. AWS says these materialized views cannot be created on Iceberg v3 tables; see its Iceberg v3 guidance.
  • Sources must be in the same AWS account and Region as the materialized view.
  • AWS documents support for Redshift Serverless and provisioned clusters using RG instance types. RA3 and DC2 instance types are not supported for this feature.

Glue, IAM, and refresh permissions

  • The target Glue Data Catalog database must already exist, and the creator needs permission to create tables in it.
  • The IAM role recorded as the view definer needs SELECT permission on every source table.
  • The caller who runs a refresh needs ALTER permission on the materialized view, and the definer role must retain its source-table SELECT permissions.

Identifiers and unsupported features

  • Table names, column names, aliases, and all other identifiers in the definition must be lowercase. Case-sensitive identifiers must be disabled both when creating and refreshing the view: enable_case_sensitive_identifier = false.
  • The feature does not support BACKUP, DISTSTYLE, DISTKEY, or SORTKEY options.
  • Temporary or system tables, user-defined functions, and mutable functions are not supported.

These gates are specific to the Iceberg-stored feature. Confirm the table format, deployment type, identifier setting, and role permissions before building the view definition.

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

What operational issues affect refreshes?

Manual scheduling and freshness

Since USING ICEBERG views do not autorefresh, choose a schedule or invoke refreshes based on how current downstream consumers need the data to be. The time between refreshes is also the period during which readers may see an older materialized result.

Snapshots, compaction, and external writes

Incremental refresh relies on source snapshot history. If the snapshot captured at the last refresh is expired, Redshift cannot calculate the delta from it and performs a full recomputation. For general-purpose S3 storage, AWS recommends regular compaction with an external tool and management of snapshot expiration. S3 Table Buckets handle compaction and file optimization automatically. Avoid modifying the materialized-view data through another engine or tool if you want to preserve incremental refresh eligibility.

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

Concurrent refresh attempts

More than one cluster can attempt a refresh. Redshift uses optimistic concurrency through Glue: one refresh can succeed, while another attempt may abort if a competing refresh has already completed. Design orchestration to handle a failed concurrent attempt rather than treating every abort as evidence of a broken view.

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.