雪花在自我加入时创建物化视图

Posted

技术标签:

【中文标题】雪花在自我加入时创建物化视图【英文标题】:Snowflake Create Materilaized view on self Join 【发布时间】:2021-05-21 00:10:48 【问题描述】:

我正在尝试在具有最新数据的表上创建一个物化视图。 查询看起来像这样

Create Materialized view t1_latest as
select c1,c2,dt from t1
join
(select max(dt) maxdt from t1) t2
ON t1.dt = t2.maxdt

dt 是日期字段。

现在我们知道物化视图不允许子查询或窗口函数。有没有办法重写查询以创建具有最新日期的物化视图。不能将最新日期视为 current_date 或硬编码。

另一种方法是使用连接创建视图,然后在其之上创建物化视图。但问题是我们将失去物化视图预先计算的优势。

任何建议。

【问题讨论】:

物化视图在 Snowflake 中非常基本。您必须使用常规视图。 @GordonLinoff 如果我不使用视图,它会在每次调用视图时处理整个查询。 【参考方案1】:

如果您的表由dt 聚集,并且您只需使用与上述相同的逻辑对其进行标准视图,您实际上将获得完全相同的性能增益。这将以与创建物化视图相同的方式修剪表。

如果表已经聚集在其他东西上,那么使用 dt 作为集群键创建一个简单的物化视图将提供相同的好处,而且还具有能够简单地查询基表并具有查询优化器帮助选择最佳修剪选项:

https://docs.snowflake.com/en/user-guide/views-materialized.html#how-the-query-optimizer-uses-materialized-views

根据评论编辑: 不知道我理解为什么你不能使用任务/流,但是如果你对任务和流做了一些不同的事情怎么办。

    创建一个流...当流中有数据时,您可以执行一个执行存储过程的任务。 存储过程将评估表以查看是否存在 dt 的不同值超过 1 个。如果有,它会从表中删除旧数据。

在 Snowflake 中,删除基本上只是一个元数据操作,因为所有微分区都将包含相同的日期,具体取决于您描述正在加载的数据的方式。

【讨论】:

我同意,但是我们的客户要求是有一个只包含最新数据的表。不使用任何 etl 工具。所以基本上 t1 表是使用雪管创建的,计划是将物化视图放在表的顶部。我们不能使用任务和流,因为我们不知道文件进入 s3 的确切时间 @danD 我已经根据您已阐明的“表格要求”编辑了第二个选项。它有点在盒子外面。此外,您可能想向客户解释,在聚簇表上的视图性能与仅包含 1 个数据日期的 MV 相同。他们可能不明白事情是如何运作的。

以上是关于雪花在自我加入时创建物化视图的主要内容,如果未能解决你的问题,请参考以下文章

雪花物化视图可以包含半结构化数据的展平吗?

PG 物化视图

如何获得oracle物化视图 定时刷新时 刷新所用的时间 或者是监控 物化视图在jobs中建立的job任务的执行时间

Oracle物化视图

Oracle物化视图梳理

使用 dbt 的物化视图与表