刷新具体化视图 - Amazon Redshift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

刷新具体化视图

创建具体化视图时,其内容将反映当时基础数据库表的状态。具体化视图中的数据将保持不变,即使应用程序更改基础表中的数据也是如此。要更新具体化视图中的数据,您可以随时使用 REFRESH MATERIALIZED VIEW 语句手动刷新具体化视图。使用此语句时,Amazon Redshift 会标识已在一个或多个基表中进行的更改,然后将这些更改应用于具体化视图。

Amazon Redshift 有两种刷新具体化视图的策略:

  • 在许多情况下,Amazon Redshift 可以执行递增刷新。在递增刷新中,Amazon Redshift 将快速识别自上次刷新以来对基表中的数据所做的更改,并更新具体化视图中的数据。在定义具体化视图时,对查询中使用的以下 SQL 结构支持递增刷新:

    • 包含子句 SELECT、FROM、[INNER] JOIN、WHERE、GROUP BY 或 HAVING 的构造。

    • 包含聚合(例如 SUM 和 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。

  • 聚合函数:AVG、MEDIAN、PERCENTILE_CONT、LISTAGG、STDDEV_SAMP、STDDEV_POP、APPROXIMATE COUNT、APPROXIMATE PERCENTILE 以及按位聚合函数。

    注意

    支持 COUNT 和 SUM 聚合函数。

  • DISTINCT 聚合函数,如 DISTINCT COUNT、DISTINCT SUM 等等。

  • 窗口函数。

  • 使用临时表进行查询优化的查询,例如优化常用的子表达式。

  • 在 FROM 子句以外的任何位置的子查询。

  • 在定义具体化视图的查询中作为基表引用的外部表。

自动刷新具体化视图

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