何时应使用可刷新materialized view?
可刷新materialized view 可以运行批处理任务,执行诸如反规范化之类的操作。你还可以在可刷新materialized view 之间创建依赖关系,使一个视图依赖另一个视图的结果,并且仅在后者完成后才执行。这可以替代定时工作流或简单的 DAG,例如 dbt 作业。要了解如何在可刷新materialized view 之间设置依赖关系,请参阅 CREATE VIEW 的 Dependencies 部分。
如何刷新可刷新materialized view?
SYSTEM REFRESH VIEW 子句:
可刷新materialized view 最近一次刷新是在什么时候?
system.view_refreshes 系统表:
如何更改刷新频率?
ALTER TABLE...MODIFY REFRESH 语法。
使用 APPEND 添加新行
APPEND 功能可让你将新行追加到表末尾,而不是替换整个视图。
此功能的一个用途是获取某一时刻的值快照。例如,假设我们有一个 events 表,其中的数据来自 Kafka、Redpanda 或其他流式数据平台的消息流。
uuid 列中有 4096 个值。我们可以编写如下查询,找出总计数最高的那些值:
uuid 的计数,并将结果存储到一个名为 events_snapshot 的新表中。events_snapshot 的 schema 如下:
events_snapshot,以获取特定 uuid 的计数随时间变化的情况:
示例
Stack Overflow
votes、users、badges、posts 和 postlinks。
在该指南中,我们展示了如何使用以下查询将 postlinks 数据集反规范化到 posts 表中:
posts_with_links 表,但在生产系统中,我们通常希望定期执行此操作。
posts 和 postlinks 表都可能发生更新。因此,与其尝试用增量materialized view 来实现这个 join,不如直接将该查询设置为按固定时间间隔运行,例如每小时运行一次,并将结果存储到 post_with_links 表中。
这正是可刷新materialized view 的用武之地,我们可以使用以下查询创建一个:
此处的语法与增量materialized view 完全相同,只是我们添加了一个
REFRESH 子句:IMDb
actors、directors、genres、movie_directors、movies 和 roles。
随后,我们可以编写以下查询,汇总每位演员的信息,并按出演电影次数从高到低排序。