

 从补丁 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/)。

# 刷新实体化视图
<a name="materialized-view-refresh"></a>

本主题介绍如何从基础表中刷新实体化视图中的数据。

创建实体化视图时，其内容反映当时底层数据库关系（表或其它实体化视图）的状态。实体化视图中的数据将保持不变，即使应用程序更改基础表中的数据也是如此。要更新实体化视图中的数据，您可以随时使用 `REFRESH MATERIALIZED VIEW` 语句手动刷新实体化视图。使用此语句时，Amazon Redshift 会标识已在基本关系中发生的更改，然后将这些更改应用于实体化视图。

Amazon Redshift 有两种刷新实体化视图的策略：
+ 在许多情况下，Amazon Redshift 可以执行递增刷新。在*递增刷新*中，Amazon Redshift 快速识别自上次刷新以来对基本关系中的数据所做的更改，并更新实体化视图中的数据。在定义实体化视图时，对查询中使用的以下 SQL 结构支持递增刷新：
  + 包含子句 SELECT、FROM、[INNER] JOIN、WHERE、GROUP BY 或 HAVING 的构造。
  + 包含聚合（例如 SUM、MIN、MAX、AVG 和 COUNT）的构造。
  + 大多数内置 SQL 函数（尤其是那些不可变的 SQL 函数），假定它们具有相同的输入参数并始终产生相同的输出。

  基于数据共享表或实体化视图的实体化视图也支持增量刷新。
+ 如果无法执行递增刷新，Amazon Redshift 将执行完全刷新。*完全刷新* 将重新运行基础 SQL 语句，并替换实体化视图中的所有数据。
+ Amazon Redshift 自动为实体化视图选择刷新方法，具体取决于用于定义实体化视图的 SELECT 查询。

## 嵌套实体化视图
<a name="materialized-view-refresh-nested"></a>

一个实体化视图可以建立在其它实体化视图之上。要刷新这样的实体化视图，必须在最顶端的实体化视图刷新时显式使用 `CASCADE` 关键字。例如，假设以下嵌套实体化视图结构：

```
CREATE TABLE t(a INT);
CREATE MATERIALIZED VIEW u AS SELECT * FROM t;
CREATE MATERIALIZED VIEW v AS SELECT * FROM u;
CREATE MATERIALIZED VIEW w AS SELECT * FROM v;

-- w -> v -> u -> t

INSERT INTO t VALUES (1);
```

要使 w 全面保持最新状态，您有两种选择：
+ （建议）使用 `REFRESH MATERIALIZED VIEW w CASCADE` 命令刷新 w。此命令在单个事务中执行所有实体化视图的刷新。
+ 按相关性顺序（首先是 u，然后是 v，接着是 w），作为单独的命令刷新 u、v 和 w。

如果未显式使用 `CASCADE` 关键字，则将在 `RESTRICT` 模式下刷新实体化视图，仅刷新当前的实体化视图。以下示例显示在依赖于过期的实体化视图的实体化视图上运行 `REFRESH MATERIALIZED VIEW` 时的信息性消息。

```
REFRESH MATERIALIZED VIEW w;
INFO:  Materialized view w is already up to date.  However, it depends on another materialized view that is not up to date.

REFRESH MATERIALIZED VIEW w CASCADE;
INFO:  Materialized view w was incrementally updated successfully.
```

```
REFRESH MATERIALIZED VIEW v;
INFO: Materialized view v is already up to date. However, it depends on another materialized view that is not up to date.

REFRESH MATERIALIZED VIEW v CASCADE;
INFO: Materialized view v was incrementally updated successfully.
```

在上面使用级联刷新选项的示例中，首先刷新实体化视图 u，接下来刷新实体化视图 v，但不刷新实例化视图 w。

以下示例显示如何以编程方式为实体化视图创建完全刷新计划。要刷新实体化视图 v，请首先刷新实体化视图 u。要刷新实体化视图 w，请首先刷新实体化视图 u，然后再刷新实体化视图 v。

```
WITH RECURSIVE recursive_deps (mv_tgt, lvl, mv_dep) AS
( SELECT trim(name) as mv_tgt, 0 as lvl, trim(ref_name) as mv_dep
  FROM stv_mv_deps
  UNION ALL
  SELECT R.mv_tgt, R.lvl+1 as lvl, trim(S.ref_name) as mv_dep
  FROM stv_mv_deps S, recursive_deps R
  WHERE R.mv_dep = S.name
)

SELECT mv_tgt, mv_dep from recursive_deps
ORDER BY mv_tgt, lvl DESC;

 mv_tgt | mv_dep
--------+--------
 v      | u
 w      | u
 w      | v
(3 rows)
```

## 限制
<a name="materialized-view-refresh-limitations"></a>

Amazon Redshift 不支持对基于以下来源之外的实体化视图进行级联刷新：
+ 本地表
+ 本地 MV
+ 流式传输 MV

Amazon Redshift 不支持使用以下 SQL 元素通过查询定义的实体化视图的递增刷新：
+ OUTER JOIN（RIGHT、LEFT 或 FULL）。
+ 集操作 UNION、INTERSECT、EXCEPT 和 MINUS。
+ 聚合函数 MEDIAN、PERCENTILE\$1CONT、LISTAGG、STDDEV\$1SAMP、STDDEV\$1POP、APPROXIMATE COUNT、APPROXIMATE PERCENTILE 以及按位聚合函数。
**注意**  
支持 COUNT、SUM 和 AVG 聚合函数。
+ DISTINCT 聚合函数，如 DISTINCT COUNT、DISTINCT SUM 等等。
+ 窗口函数。
+ 使用临时表进行查询优化的查询，例如优化常用的子表达式。
+ 子查询。
+ 在定义实体化视图的查询中引用以下格式的外部表。
  +  Delta Lake 
  +  Hudi 

  对于使用上述格式以外的格式定义的实体化视图，支持增量刷新。有关更多信息，请参阅 [Amazon Redshift Spectrum 中外部数据湖表的实体化视图外部数据湖表的实体化视图](materialized-view-external-table.md)。

## 自动刷新实体化视图
<a name="materialized-view-auto-refresh"></a>

当使用自动刷新选项创建实体化视图或将其更改为具有自动刷新选项时，Amazon Redshift 可以使用其基表中的最新数据自动刷新实体化视图。Amazon Redshift 会在基表更改后尽快自动刷新实体化视图。

为了完成最重要的实体化视图的刷新，同时最大限度地减少对集群中的活动工作负载的影响，Amazon Redshift 会考虑多个因素。这些因素包括当前系统负载、刷新所需的资源、可用集群资源以及实体化视图的使用频率。

Amazon Redshift 会优先考虑您的工作负载而不是自动刷新，并可能会停止自动刷新以保持用户工作负载的性能。此方法可能会延迟某些实体化视图的刷新。在某些情况下，您的实体化视图可能需要更具确定性的刷新行为。如果是这样，请考虑使用 [REFRESH MATERIALIZED VIEW](materialized-view-refresh-sql-command.md) 中所述的手动刷新，或使用 Amazon Redshift 调度程序 API 操作或控制台计划刷新。

您可以使用 CREATE MATERIALIZED VIEW 为实体化视图设置自动刷新。还可以使用 AUTO REFRESH 子句自动刷新实体化视图。有关创建实体化视图的更多信息，请参阅[CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md)。您可以使用 [ALTER MATERIALIZED VIEW](r_ALTER_MATERIALIZED_VIEW.md) 为当前实体化视图开启自动刷新。

刷新实体化视图时，请注意以下事项：
+ 即使尚未为实体化视图启用自动刷新，仍可使用 REFRESH MATERIALIZED VIEW 命令显式刷新实体化视图。
+ 在数据共享表或 Iceberg 表上定义的实体化视图支持自动刷新，但这两种表的组合不支持此功能。
+ 对于刷新状态，您可以选中 SVL\$1MV\$1REFRESH\$1STATUS，这将记录用户启动或自动刷新的查询。
+ 要在仅重新计算的实体化视图上运行 REFRESH，请确保您对 Schema 具有 CREATE 权限。有关更多信息，请参阅 [GRANT](r_GRANT.md)。

 从 2026 年 2 月 27 日起，Amazon Redshift 实体化视图的自动 REFRESH 查询将作为用户查询而不是后台自主进程执行。因此，自动 REFRESH 查询现在的运行优先级与其它用户查询相同。

 与之前的行为相比，此更改提高了启用自动 REFRESH 功能的实体化视图的新鲜度，有助于它们更及时地了解对基表的最新更改。

 注意：MV 自动 REFRESH 行为更改功能仅适用于补丁版本 P198 及更高版本的当前跟踪版本上的 Amazon Redshift 预置集群。它目前在无服务器上处于禁用状态。