从 2025 年 11 月 1 日起,Amazon Redshift 将不再支持创建新的 Python UDF。如果您想要使用 Python UDF,请在该日期之前创建 UDF。现有的 Python UDF 将继续正常运行。有关更多信息,请参阅博客文章
刷新实体化视图
本主题介绍如何从基础表中刷新实体化视图中的数据。
创建实体化视图时,其内容反映当时底层数据库关系(表或其它实体化视图)的状态。实体化视图中的数据将保持不变,即使应用程序更改基础表中的数据也是如此。要更新实体化视图中的数据,您可以随时使用 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 查询。
嵌套实体化视图
一个实体化视图可以建立在其它实体化视图之上。要刷新这样的实体化视图,必须在最顶端的实体化视图刷新时显式使用 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.
以下示例显示如何以编程方式为实体化视图创建完全刷新计划。要刷新实体化视图 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)
限制
Amazon Redshift 不支持对基于以下来源之外的实体化视图进行级联刷新:
-
本地表
-
本地 MV
-
流式传输 MV
Amazon Redshift 不支持使用以下 SQL 元素通过查询定义的实体化视图的递增刷新:
-
OUTER JOIN(RIGHT、LEFT 或 FULL)。
-
集操作 UNION、INTERSECT、EXCEPT 和 MINUS。
-
聚合函数 MEDIAN、PERCENTILE_CONT、LISTAGG、STDDEV_SAMP、STDDEV_POP、APPROXIMATE COUNT、APPROXIMATE PERCENTILE 以及按位聚合函数。
注意
支持 COUNT、SUM 和 AVG 聚合函数。
-
DISTINCT 聚合函数,如 DISTINCT COUNT、DISTINCT SUM 等等。
窗口函数。
使用临时表进行查询优化的查询,例如优化常用的子表达式。
子查询。
-
在定义实体化视图的查询中引用以下格式的外部表。
-
Delta Lake
-
Hudi
对于使用上述格式以外的格式定义的实体化视图,支持增量刷新。有关更多信息,请参阅 Amazon Redshift Spectrum 中外部数据湖表的实体化视图。
-
自动刷新实体化视图
当使用自动刷新选项创建实体化视图或将其更改为具有自动刷新选项时,Amazon Redshift 可以使用其基表中的最新数据自动刷新实体化视图。Amazon Redshift 会在基表更改后尽快自动刷新实体化视图。
为了完成最重要的实体化视图的刷新,同时最大限度地减少对集群中的活动工作负载的影响,Amazon Redshift 会考虑多个因素。这些因素包括当前系统负载、刷新所需的资源、可用集群资源以及实体化视图的使用频率。
Amazon Redshift 会优先考虑您的工作负载而不是自动刷新,并可能会停止自动刷新以保持用户工作负载的性能。此方法可能会延迟某些实体化视图的刷新。在某些情况下,您的实体化视图可能需要更具确定性的刷新行为。如果是这样,请考虑使用 REFRESH MATERIALIZED VIEW 中所述的手动刷新,或使用 Amazon Redshift 调度程序 API 操作或控制台计划刷新。
您可以使用 CREATE MATERIALIZED VIEW 为实体化视图设置自动刷新。还可以使用 AUTO REFRESH 子句自动刷新实体化视图。有关创建实体化视图的更多信息,请参阅CREATE MATERIALIZED VIEW。您可以使用 ALTER MATERIALIZED VIEW 为当前实体化视图开启自动刷新。
刷新实体化视图时,请注意以下事项:
即使尚未为实体化视图启用自动刷新,仍可使用 REFRESH MATERIALIZED VIEW 命令显式刷新实体化视图。
在数据共享表和 Iceberg 表上定义的实体化视图支持 Amazon Redshift。
对于刷新状态,您可以选中 SVL_MV_REFRESH_STATUS,这将记录用户启动或自动刷新的查询。
要在仅重新计算的实体化视图上运行 REFRESH,请确保您对 Schema 具有 CREATE 权限。有关更多信息,请参阅 GRANT。