刷新实体化视图 - Amazon Redshift

刷新实体化视图

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

创建具体化视图时,其内容将反映当时基础数据库表的状态。实体化视图中的数据将保持不变,即使应用程序更改基础表中的数据也是如此。要更新实体化视图中的数据,您可以随时使用 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 查询。

在实体化视图上刷新实体化视图不是级联过程。换句话说,假设您具有依赖于实体化视图 B 的实体化视图 A。在这种情况下,当调用 REFRESH MATERIALIZED VIEW 时,将使用当前版本的 B 刷新 A,即使 B 已过期。要使 A 完全更新,请在刷新 A 之前,首先在单独的事务中刷新 B。

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

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; 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)

以下示例显示了在依赖于过期的实体化视图的实体化视图上运行 REFRESH MATERIALIZED VIEW 时的信息性消息。

create table a(a int);
create materialized view b as select * from a;
create materialized view c as select * from b;
insert into a values (1);
refresh materialized view c; INFO: Materialized view c is already up to date. However, it depends on another materialized view that is not up to date.
REFRESH MATERIALIZED VIEW b; INFO: Materialized view b was incrementally updated successfully.
REFRESH MATERIALIZED VIEW c; INFO: Materialized view c was incrementally updated successfully.

Amazon Redshift 当前对实体化视图的递增刷新具有以下限制。

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 管理指南》中的创建预览版集群。有关设置预览工作组的信息,请参阅《Amazon Redshift 管理指南》中的创建预览工作组

自动刷新实体化视图

当使用自动刷新选项创建实体化视图或将其更改为具有自动刷新选项时,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 命令显式刷新实体化视图。

  • Amazon Redshift 不会自动刷新外部表中定义的实体化视图。

  • 对于刷新状态,您可以选中 SVL_MV_REFRESH_STATUS,这将记录用户启动或自动刷新的查询。

  • 要在仅重新计算的实体化视图上运行 REFRESH,请确保您对 Schema 具有 CREATE 权限。有关更多信息,请参阅 GRANT