

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 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
```

## 参数
<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 客户端应用程序。选中 `state` 的 [STV\$1MV\$1INFO](r_STV_MV_INFO.md) 列可查看实体化视图使用的刷新类型。

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。
+ 当实体化视图定义包含可变函数或外部 schema 时，不能使用 AUTO REFRESH YES 选项。在一个实体化视图上定义另一个实体化视图时，也不能使用它。
+ 您不必在实体化视图上手动运行 [ANALYZE](r_ANALYZE.md)。该分析目前只通过 AUTO ANALYZE 发生。有关更多信息，请参阅 [分析表](t_Analyzing_tables.md)。
+ 受 RLS 保护或受 DDM 保护的表。
+ 从远程数据共享集群创建实体化视图，不支持对其它实体化视图、Spectrum 表、在不同 Redshift 集群中定义的表以及 UDF 的引用。从本地（生产者）集群创建实体化视图支持这些引用。

## 示例
<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)