自 2025 年 11 月 1 日起,Amazon Redshift 將不再支援建立新的 Python UDFs。如果您想要使用 Python UDFs,請在該日期之前建立 UDFs。現有的 Python UDFs將繼續如常運作。如需詳細資訊,請參閱部落格文章
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
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
參數
- BACKUP
-
子句,指定具體化視觀表是否應包含在自動化和手動叢集快照中。
對於不包含關鍵資料的具體化視觀表,請指定 BACKUP NO 以在建立快照並從快照還原時節省處理時間,並減少 Amazon Simple Storage Service 上的儲存空間。BACKUP NO 設定不會影響資料自動複寫至叢集內其他節點,因此在節點故障時,會還原具有指定 BACKUP NO 的具體化視觀表。預設值為 BACKUP YES。
- table_attributes
-
此子句指定如何分配具體化檢視中的資料,其中包括:
- AS query
-
定義具體化視觀表及其內容的有效
SELECT
陳述式。查詢的結果集會定義具體化檢視的資料行與資料列。如需有關建立具體化檢視時有何限制的資訊,請參閱限制。此外,查詢中使用的特定 SQL 語言建構會決定具體化檢視是否可以增量或完全重新整理。如需重新整理方法的相關資訊,請參閱REFRESH MATERIALIZED VIEW。如需增量重新整理之限制的相關資訊,請參閱增量重新整理的限制。
如果查詢包含不支援增量重新整理的 SQL 命令,則 Amazon Redshift 會顯示訊息,指出具體化視觀表將使用完整重新整理。不一定會顯示訊息,視 SQL 用戶端應用程式而定。檢查 STV_MV_INFO 的
state
資料欄,以查看具體化檢視所使用的重新整理類型。 - AUTO REFRESH
-
該子句會定義是否應使用基本資料表中的最新變更自動重新整理具體化視觀表。預設值為
NO
。如需詳細資訊,請參閱重新整理具體化視觀表。
使用須知
若要建立具體化檢視,您必須具有下列權限:
-
結構描述的 CREATE 權限。
-
在基礎資料表上建立具體化視觀表的資料表層級或資料欄層級 SELECT 權限。如果您擁有特定資料欄層級的權限,就可以僅針對這些資料欄建立具體化視觀表。
資料共用中具體化視觀表的增量重新整理
共用基礎資料表時,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 保護的資料表。
範例
下列範例會從三個加入和彙總的基礎資料表建立具體化視觀表。每一列代表具有售票數的類別。查詢 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 命令的詳細資訊,請參閱下列主題: