

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 Python UDF 將繼續正常運作至 2026 年 6 月 30 日。如需詳細資訊，請參閱[部落格文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

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

# CREATE MATERIALIZED VIEW
<a name="materialized-view-create-sql-command"></a>

根據一個或多個 Amazon Redshift 資料表建立具體化視觀表。您也可以讓具體化視觀表以使用 Spectrum 或聯合查詢建立的外部資料表為依據。如需 Spectrum 的詳細資訊，請參閱[Amazon Redshift Spectrum](c-using-spectrum.md)。如需聯合查詢的詳細資訊，請參閱 [使用 Amazon Redshift 中的聯合查詢來查詢資料](federated-overview.md)。

## 語法
<a name="mv_CREATE_MATERIALIZED_VIEW-synopsis"></a>

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

## Parameters
<a name="mv_CREATE_MATERIALIZED_VIEW-parameters"></a>

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

 *table\$1attributes*   
此子句指定如何分配具體化檢視中的資料，其中包括：  
+  具體化檢視的分佈樣式，其格式為 `DISTSTYLE { EVEN | ALL | KEY }`。如果您省略此子句，則分佈樣式為 `EVEN`。如需詳細資訊，請參閱[分佈樣式](c_choosing_dist_sort.md)。
+ 具體化檢視的分佈索引鍵，其格式為 `DISTKEY ( distkey_identifier )`。如需詳細資訊，請參閱[指定分佈樣式](t_designating_distribution_styles.md)。
+ 具體化檢視的排序索引鍵，其格式為 `SORTKEY ( column_name [, ...] )`。如需詳細資訊，請參閱[排序索引鍵](t_Sorting_data.md)。

AS *query*  
定義具體化視觀表及其內容的有效 `SELECT` 陳述式。查詢的結果集會定義具體化檢視的資料行與資料列。如需有關建立具體化檢視時有何限制的資訊，請參閱[限制](#mv_CREATE_MATERIALIZED_VIEW-limitations)。  
此外，查詢中使用的特定 SQL 語言建構會決定具體化檢視是否可以增量或完全重新整理。如需重新整理方法的相關資訊，請參閱[REFRESH MATERIALIZED VIEW](materialized-view-refresh-sql-command.md)。如需增量重新整理之限制的相關資訊，請參閱[增量重新整理的限制](materialized-view-refresh-sql-command.md#mv_REFRESH_MARTERIALIZED_VIEW_limitations)。  
如果查詢包含不支援增量重新整理的 SQL 命令，則 Amazon Redshift 會顯示訊息，指出具體化視觀表將使用完整重新整理。不一定會顯示訊息，視 SQL 用戶端應用程式而定。檢查 [STV\$1MV\$1INFO](r_STV_MV_INFO.md) 的 `state` 資料欄，以查看具體化檢視所使用的重新整理類型。

AUTO REFRESH  
該子句會定義是否應使用基本資料表中的最新變更自動重新整理具體化視觀表。預設值為 `NO`。如需詳細資訊，請參閱[重新整理具體化視觀表](materialized-view-refresh.md)。

## 使用須知
<a name="mv_CREATE_MARTERIALIZED_VIEW_usage"></a>

若要建立具體化檢視，您必須具有下列權限：
+ 結構描述的 CREATE 權限。
+ 在基礎資料表上建立具體化視觀表的資料表層級或資料欄層級 SELECT 權限。如果您擁有特定資料欄層級的權限，就可以僅針對這些資料欄建立具體化視觀表。

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

## 資料共用中具體化視觀表的累加式重新整理
<a name="mv_CREATE_MARTERIALIZED_VIEW_datashare"></a>

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

利用具體化視觀表進行累加式重新整理時，需要注意幾項限制：
+ 具體化視觀表必須只參考一個資料庫，無論是本機或遠端。
+ 累加式重新整理僅適用於新的具體化視觀表。因此，您必須捨棄現有的具體化視觀表，並重新建立視觀表，才能執行累加式重新整理。

如需在資料共用中建立具體化視觀表的詳細資訊，請參閱[在 Amazon Redshift 資料共用中使用檢視](https://docs.aws.amazon.com/redshift/latest/dg/datashare-views)，其中包含數個查詢範例。

## 具體化檢視或基礎資料表的 DDL 更新
<a name="materialized-view-ddl"></a>

在 Amazon Redshift 中使用具體化視觀表時，請遵循下列對具體化檢視或基礎資料表進行資料定義語言 (DDL) 更新時的使用注意事項。
+ 您可以將資料欄新增到基礎資料表，而不影響任何參考該基礎資料表的具體化視觀表。
+ 某些操作也可能使具體化檢視進入完全無法重新整理的狀態。例如：重新命名或卸除資料欄、變更資料欄類型，以及變更結構描述名稱等操作。這類具體化檢視可以進行查詢，但無法重新整理。在此情況下，您必須卸除並重新建立具體化檢視。
+ 一般而言，您無法修改具體化檢視的定義 (其 SQL 陳述式)。
+ 您無法將具體化檢視重新命名。

## 限制
<a name="mv_CREATE_MATERIALIZED_VIEW-limitations"></a>

您無法定義參考或包含以下任何一項的具體化檢視：
+ 標準檢視，或系統資料表和檢視。
+ 暫存資料表。
+ 使用者定義的函數。
+ ORDER BY、LIMIT 或 OFFSET 子句。
+ 對基礎資料表的近期繫結參考。換句話說，定義具體化檢視的 SQL 查詢中所參考的任何基底資料表或相關資料行都必須存在，且必須有效。
+ 僅限領導節點的函數：CURRENT\$1SCHEMA、CURRENT\$1SCHEMAS、HAS\$1DATABASE\$1PRIVILEGE、HAS\$1SCHEMA\$1PRIVILEGE、HAS\$1TABLE\$1PRIVILEGE。
+ 具體化視觀表定義包含可變函數或外部結構描述時，您無法使用 AUTO REFRESH YES 選項。當您在另一個具體化視觀表上定義具體化視觀表時，也無法使用此選項。
+ 您不需要在具體化視觀表上手動執行 [ANALYZE](r_ANALYZE.md)。目前這種情況只會透過 AUTO ANALYZE 發生。如需詳細資訊，請參閱[分析資料表](t_Analyzing_tables.md)。
+ 受 RLS 保護或 DDM 保護的資料表。
+ 從遠端資料共用叢集建立具體化檢視不支援對其他具體化檢視、Spectrum 資料表、不同 Redshift 叢集和 UDFs 中定義的資料表進行參考。這些支援從本機 （生產者） 叢集建立具體化檢視。

## 範例
<a name="mv_CREATE_MARTERIALIZED_VIEW_examples"></a>

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

```
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](r_CREATE_EXTERNAL_TABLE.md)。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](r_CREATE_EXTERNAL_SCHEMA.md)。

```
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\$1baseball 具體化視觀表。若要檢查具體化視觀表是否已開啟 AUTO REFRESH，請參閱 [STV\$1MV\$1INFO](r_STV_MV_INFO.md)。

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

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

查詢您建立的具體化視觀表。查詢會擷取其原始來源為 database\$1A 中 *cities* 資料表的記錄：

```
select * from cities_mv;
```

當您執行 SELECT 陳述式時，*cities\$1mv* 會傳回記錄。只有在執行 REFRESH 陳述式時，才會從來源資料表重新整理記錄。此外，請注意，您無法直接在具體化視觀表中更新記錄。如需有關重新整理具體化視觀表中資料的資訊，請參閱 [REFRESH MATERIALIZED VIEW](materialized-view-refresh-sql-command.md)。

如需有關具體化檢視概觀，以及用來重新整理和捨棄具體化檢視之 SQL 命令的詳細資訊，請參閱下列主題：
+ [Amazon Redshift 中的具體化視觀表](materialized-view-overview.md)
+ [REFRESH MATERIALIZED VIEW](materialized-view-refresh-sql-command.md)
+ [DROP MATERIALIZED VIEW](materialized-view-drop-sql-command.md)