View a markdown version of this page

CREATE MATERIALIZED VIEW - Amazon Redshift

Amazon Redshift 將不再支援在 2026 年 6 月 30 日之後使用 Python UDFs。我們將開始分階段強制執行。如需 Python 生命週期結束和遷移選項的詳細資訊,請參閱 2025 年 6 月 30 日發佈的部落格文章。

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

CREATE MATERIALIZED VIEW

根據一個或多個 Amazon Redshift 資料表建立具體化視觀表。您也可以讓具體化視觀表以使用 Spectrum 或聯合查詢建立的外部資料表為依據。如需 Spectrum 的詳細資訊,請參閱Amazon Redshift Spectrum。如需聯合查詢的詳細資訊,請參閱 使用 Amazon Redshift 中的聯合查詢來查詢資料。

語法

CREATE MATERIALIZED VIEW mv_name
[ BACKUP { YES | NO } ]
[ table_attributes ]
[ AUTO REFRESH { YES | NO } ]
AS query 

下列語法會建立具體化檢視,將其資料儲存為 Apache Iceberg 資料表。如需詳細資訊,請參閱存放為 Apache Iceberg 資料表的具體化檢視。

CREATE MATERIALIZED VIEW mv_name
USING ICEBERG
[LOCATION 's3://bucket/path/']
[PARTITIONED BY (partition_transform [, ...])]
[TABLE PROPERTIES ('property_name' = 'property_value' [, ...])]
AS query

其中 partition_transform 為:

    column_name |
    YEAR( column_name ) |
    MONTH( column_name ) |
    DAY( column_name ) |
    HOUR( column_name ) |
    BUCKET( integer, column_name ) |
    TRUNCATE( integer, column_name )

Parameters

BACKUP

此子句會指定具體化視觀表是否應包含在自動化和手動叢集快照中。

若是未包含重要資料的具體化視觀表,指定 BACKUP NO 可以在建立快照以及從快照還原時節省處理時間,並減少 Amazon Simple Storage Service 上的儲存空間。BACKUP NO 設定對於將資料自動複寫到叢集內其他節點的操作並無影響,因此指定了 BACKUP NO 的具體化視觀表會在節點發生故障時還原。預設值為 BACKUP YES。

table_attributes

此子句指定如何分配具體化檢視中的資料,其中包括:

  • 具體化檢視的分佈樣式,其格式為 DISTSTYLE { EVEN | ALL | KEY }。如果您省略此子句,則分佈樣式為 EVEN。如需詳細資訊,請參閱分佈樣式。

  • 具體化檢視的分佈索引鍵,其格式為 DISTKEY ( distkey_identifier )。如需詳細資訊,請參閱指定分佈樣式。

  • 具體化檢視的排序索引鍵,其格式為 SORTKEY ( column_name [, ...] )。如需詳細資訊,請參閱排序索引鍵。

AS query

定義具體化視觀表及其內容的有效 SELECT 陳述式。查詢的結果集會定義具體化檢視的資料行與資料列。如需有關建立具體化檢視時有何限制的資訊,請參閱限制。

此外,查詢中使用的特定 SQL 語言建構會決定具體化檢視是否可以增量或完全重新整理。如需重新整理方法的相關資訊,請參閱REFRESH MATERIALIZED VIEW。如需增量重新整理之限制的相關資訊,請參閱增量重新整理的限制。

如果查詢包含不支援增量重新整理的 SQL 命令,則 Amazon Redshift 會顯示訊息,指出具體化視觀表將使用完整重新整理。不一定會顯示訊息,視 SQL 用戶端應用程式而定。檢查 STV_MV_INFO 的 state 資料欄,以查看具體化檢視所使用的重新整理類型。

AUTO REFRESH

該子句會定義是否應使用基本資料表中的最新變更自動重新整理具體化視觀表。預設值為 NO。如需詳細資訊,請參閱重新整理具體化視觀表。

使用 ICEBERG

指定具體化檢視將其資料儲存為 Amazon S3 中的 Apache Iceberg 資料表。當您指定使用 ICEBERG 時,具體化視觀表資料會以 Iceberg 格式寫入 Parquet 檔案,並在 中註冊 AWS Glue Data Catalog。如需詳細資訊,請參閱存放為 Apache Iceberg 資料表的具體化檢視。

mv_name

當您使用 ICEBERG 時,具體化視觀表名稱必須使用符合目錄的標記法。您可以使用三段式表示法 (awsdatacatalog.database.mv_name)、Amazon S3 Tables 表示法 ("bucket@s3tablescatalog".database.mv_name) 或兩段式表示法搭配外部結構描述 (external_schema.mv_name)。目標資料庫必須存在於 中 AWS Glue Data Catalog。

LOCATION

存放 Iceberg 資料和中繼資料檔案的 Amazon S3 路徑。路徑必須指向空的位置。Amazon S3 儲存貯體必須與 Amazon Redshift 叢集或工作群組位於相同的 AWS 區域 中。使用 Amazon S3 Table 儲存貯體時省略此參數,因為 Amazon S3 Tables 會自動管理儲存位置。對於使用外部結構描述或awsdatacatalog根目錄建立的資料表,需要 LOCATION。

PARTITIONED BY (partition_transform 【、...】)

指定具體化視觀表的一或多個 Iceberg 分割區轉換。Amazon Redshift 支援除 以外的所有 Iceberg v2 分割區轉換void。單一資料欄無法出現在多個轉換中。

TABLE PROPERTIES ('property_name' = 'property_value' 【, ...】)

指定 Iceberg 資料表屬性。例如,使用 'write.parquet.compression-codec' = 'zstd' 設定 Parquet 壓縮轉碼器。

使用須知

若要建立具體化檢視,您必須具有下列權限:

  • 結構描述的 CREATE 權限。

  • 在基礎資料表上建立具體化視觀表的資料表層級或資料欄層級 SELECT 權限。如果您擁有特定資料欄層級的權限,就可以僅針對這些資料欄建立具體化視觀表。

您可以在 提供外部資料庫名稱,從遠端資料共用叢集建立具體化檢視mv_name。

Iceberg 具體化視觀表

若要建立 Iceberg 具體化檢視,您必須在目標 AWS Glue Data Catalog 資料庫中具有 CREATE TABLE 許可。與外部結構描述相關聯的 IAM 角色 (MV 定義者角色) 必須具有查詢中參考的所有來源資料表的 SELECT 許可。

具體化檢視定義中的所有識別符 (資料表名稱、資料欄名稱、別名) 必須小寫。為了 Hive 相容性, AWS Glue Data Catalog 會以小寫儲存識別符。Amazon Redshift 拒絕 CREATE MATERIALIZED VIEW 陳述式使用包含大寫識別符的 ICEBERG。

當 enable_case_sensitive_identifier 設定為 時,不支援建立或重新整理 Iceberg 具體化視觀表true。此限制存在,因為 AWS Glue Data Catalog 不支援區分大小寫的識別符。如果您的叢集或工作群組enable_case_sensitive_identifier已啟用,請在建立或重新整理 Iceberg 具體化檢視之前,將其設定為工作階段false的 :

SET enable_case_sensitive_identifier TO false;

來源資料表必須是 Apache Iceberg 格式第 2 版或更低版本。非 Iceberg 資料表不能用作 Iceberg 具體化視觀表的來源資料表。

您無法將下列項目與 Iceberg 具體化視觀表搭配使用:

  • BACKUP 子句

  • DISTSTYLE、DISTKEY 或 SORTKEY 子句

  • Amazon Redshift 原生資料表、暫存資料表或系統資料表的參考

  • AUTO REFRESH (不支援自動重新整理;手動重新整理 Iceberg 具體化檢視)

如需 Iceberg 具體化檢視功能和限制的詳細資訊,請參閱存放為 Apache Iceberg 資料表的具體化檢視。

資料共用中具體化視觀表的累加式重新整理

共用基礎資料表時,Amazon Redshift 支援取用者資料共用中具體化視觀表的自動和累加式重新整理。累加式重新整理是一項操作,Amazon Redshift 會藉此識別基礎資料表自上一次重新整理後發生的變更,並且僅更新具體化視觀表中對應的記錄。這樣的執行速度會比完整重新整理更快,並可改善工作負載效能。您不需要變更具體化視觀表定義,即可利用累加式重新整理。

利用具體化視觀表進行累加式重新整理時,需要注意幾項限制:

  • 具體化視觀表必須只參考一個資料庫,無論是本機或遠端。

  • 累加式重新整理僅適用於新的具體化視觀表。因此,您必須捨棄現有的具體化視觀表,並重新建立視觀表,才能執行累加式重新整理。

如需在資料共用中建立具體化視觀表的詳細資訊,請參閱在 Amazon Redshift 資料共用中使用檢視,其中包含數個查詢範例。

具體化檢視或基礎資料表的 DDL 更新

在 Amazon Redshift 中使用具體化視觀表時,請遵循下列對具體化檢視或基礎資料表進行資料定義語言 (DDL) 更新時的使用注意事項。

  • 您可以將資料欄新增到基礎資料表,而不影響任何參考該基礎資料表的具體化視觀表。

  • 某些操作也可能使具體化檢視進入完全無法重新整理的狀態。例如:重新命名或卸除資料欄、變更資料欄類型,以及變更結構描述名稱等操作。這類具體化檢視可以進行查詢,但無法重新整理。在此情況下,您必須卸除並重新建立具體化檢視。

  • 一般而言,您無法修改具體化檢視的定義 (其 SQL 陳述式)。

  • 您無法將具體化檢視重新命名。

限制

您無法定義參考或包含以下任何一項的具體化檢視:

  • 標準檢視,或系統資料表和檢視。

  • 暫存資料表。

  • 使用者定義的函數。

  • ORDER BY、LIMIT 或 OFFSET 子句。

  • 對基礎資料表的近期繫結參考。換句話說,定義具體化檢視的 SQL 查詢中所參考的任何基底資料表或相關資料行都必須存在,且必須有效。

  • 僅限領導節點的函數:CURRENT_SCHEMA、CURRENT_SCHEMAS、HAS_DATABASE_PRIVILEGE、HAS_SCHEMA_PRIVILEGE、HAS_TABLE_PRIVILEGE。

  • 具體化視觀表定義包含可變函數或外部結構描述時,您無法使用 AUTO REFRESH YES 選項。當您在另一個具體化視觀表上定義具體化視觀表時,也無法使用此選項。

  • 您不需要在具體化視觀表上手動執行 ANALYZE。目前只有使用 AUTO ANALYZE 才會發生這種情況。如需詳細資訊,請參閱分析資料表。

  • 受 RLS 保護或 DDM 保護的資料表。

  • 從遠端資料共用叢集建立具體化檢視不支援對其他具體化檢視、Spectrum 資料表、不同 Redshift 叢集和 UDFs 中定義的資料表進行參考。這些支援從本機 (生產者) 叢集建立具體化檢視。

對於使用 ICEBERG 建立的 Iceberg 具體化視觀表,適用下列其他限制:

  • 來源資料表必須是 Apache Iceberg 格式。

  • 所有識別符都必須是小寫。

  • 不允許使用者定義的函數和可變函數。

  • 來源資料表必須與具體化視觀表位於相同的 AWS 區域 和 帳戶。

  • AWS Lake Formation 篩選 (FGAC) 資料表無法用作來源資料表。

範例

下列範例會從三個加入和彙總的基礎資料表建立具體化視觀表。每一列代表具有售票數的類別。查詢 tickets_mv 具體化檢視時,您可以直接存取 tickets_mv 具體化檢視中的預先計算資料。

CREATE MATERIALIZED VIEW tickets_mv AS select catgroup, sum(qtysold) as sold from category c, event e, sales s where c.catid = e.catid and e.eventid = s.eventid group by catgroup;

下列範例會建立類似上述範例的具體化視觀表,並使用彙總函數 MAX()。

CREATE MATERIALIZED VIEW tickets_mv_max AS select catgroup, max(qtysold) as sold from category c, event e, sales s where c.catid = e.catid and e.eventid = s.eventid group by catgroup; SELECT name, state FROM STV_MV_INFO;

下列範例使用 UNION ALL 子句加入 Amazon Redshift public_sales 資料表與 Redshift Spectrum spectrum.sales 資料表來建立具體化視觀表 mv_sales_vw。如需 Amazon Redshift Spectrum 的 CREATE EXTERNAL TABLE 命令的詳細資訊,請參閱 CREATE EXTERNAL TABLE。Redshift Spectrum 外部資料表會參考 Amazon S3 上的資料。

CREATE MATERIALIZED VIEW mv_sales_vw as select salesid, qtysold, pricepaid, commission, saletime from public.sales union all select salesid, qtysold, pricepaid, commission, saletime from spectrum.sales

下列範例會根據聯合查詢外部資料表建立具體化檢視 mv_fq。如需聯合查詢的詳細資訊,請參閱 CREATE EXTERNAL SCHEMA。

CREATE MATERIALIZED VIEW mv_fq as select firstname, lastname from apg.mv_fq_example; select firstname, lastname from mv_fq; firstname | lastname -----------+---------- John | Day Jane | Doe (2 rows)

下列範例顯示具體化檢視的定義。

SELECT pg_catalog.pg_get_viewdef('mv_sales_vw'::regclass::oid, true); pg_get_viewdef --------------------------------------------------- create materialized view mv_sales_vw as select a from t;

下列範例顯示如何在具體化視觀表定義中設定 AUTO REFRESH,以及如何指定 DISTSTYLE。首先,建立一個簡單的基底資料表。

CREATE TABLE baseball_table (ball int, bat int);

然後建立具體化視觀表。

CREATE MATERIALIZED VIEW mv_baseball DISTSTYLE ALL AUTO REFRESH YES AS SELECT ball AS baseball FROM baseball_table;

現在您可以查詢 mv_baseball 具體化視觀表。若要檢查具體化視觀表是否已開啟 AUTO REFRESH,請參閱 STV_MV_INFO。

下列範例會建立參照另一個資料庫中來源資料表的具體化視觀表。假設包含來源資料表的資料庫 database_A 與您在 database_B 中建立的具體化視觀表位於相同叢集或工作群組中。(您可以將範例取代為自己的資料庫。) 首先,在 database_A 中建立一個名為 cities 的資料表,其中包含 cityname 資料欄。使資料欄的資料類型成為 VARCHAR。建立來源資料表之後,在 database_B 中執行下列命令,以建立其來源為 cities 資料表的具體化視觀表。確實在 FROM 子句中指定來源資料表的資料庫和結構描述:

CREATE MATERIALIZED VIEW cities_mv AS SELECT  cityname FROM    database_A.public.cities;

查詢您建立的具體化視觀表。查詢會擷取其原始來源為 database_A 中 cities 資料表的記錄:

select * from cities_mv;

當您執行 SELECT 陳述式時,cities_mv 會傳回記錄。只有在執行 REFRESH 陳述式時,才會從來源資料表重新整理記錄。此外,請注意,您無法直接在具體化視觀表中更新記錄。如需有關重新整理具體化視觀表中資料的資訊,請參閱 REFRESH MATERIALIZED VIEW。

如需有關具體化檢視概觀,以及用來重新整理和捨棄具體化檢視之 SQL 命令的詳細資訊,請參閱下列主題:

下列範例會在具有分割的 Amazon S3 資料表儲存貯體中建立 Iceberg 具體化檢視。

CREATE MATERIALIZED VIEW "my-bucket@s3tablescatalog".analytics.sales_by_region USING ICEBERG PARTITIONED BY (region) AS SELECT region, count(*) as order_count, sum(amount) as total_sales FROM "my-bucket@s3tablescatalog".production.orders GROUP BY region;

下列範例會在一般用途的 Amazon S3 儲存貯體中建立 Iceberg 具體化檢視,並指定分割區轉換和壓縮。

CREATE MATERIALIZED VIEW awsdatacatalog.mydb.daily_revenue USING ICEBERG LOCATION 's3://my-analytics-bucket/mvs/daily_revenue/' PARTITIONED BY (day(order_date)) TABLE PROPERTIES ('write.parquet.compression-codec' = 'zstd') AS SELECT order_date, sum(amount) as revenue, count(*) as num_orders FROM awsdatacatalog.mydb.orders GROUP BY order_date;

以下範例使用具有兩部分表示法的外部結構描述建立 Iceberg 具體化視觀表。

CREATE MATERIALIZED VIEW my_ext_schema.customer_totals USING ICEBERG LOCATION 's3://my-analytics-bucket/mvs/customer_totals/' AS SELECT customer_id, count(*) as order_count, sum(amount) as total_spent FROM my_ext_schema.orders GROUP BY customer_id;