使用 dbt 的物化视图与表

Posted

技术标签:

【中文标题】使用 dbt 的物化视图与表【英文标题】:Materialized View vs Table Using dbt 【发布时间】:2021-02-05 21:57:25 【问题描述】:

我刚刚开始使用 dbt 并浏览了教程文档,我想知道将我的转换具体化为视图或表之间是否有区别?我使用雪花作为数据仓库。有一些文档here 显示了表和物化视图之间的差异,但如果我使用 dbt 定期更新表,它们或多或少会变成相同的东西吗?

谢谢!

【问题讨论】:

你指的是 dbt 中的物化参数吗? docs.getdbt.com/docs/building-a-dbt-project/building-models/… 还是雪花中的物化视图? 【参考方案1】:

据我所知,dbt 不支持物化视图,但正如 Felipe 评论的那样,有一个 open issue to discuss it。如果 可以在 Snowflake 上使用物化视图,那么您是对的,它们在某种程度上变成了相同的东西。即使您没有运行 dbt,物化视图也会更新。正如 Drew 在票证中提到的那样,在大多数用例中,有很多警告使得使用带有 dbt 的表更可取:“没有窗口函数、没有联合、有限的聚合、无法查询视图等等等等”。

也就是说,dbt 确实支持视图和表。

即使您使用 dbt,视图和表之间仍然存在差异。 dbt 始终需要刷新表才能进行更新。视图将始终与它所引用的基础表一样是最新的。

例如,假设您有一个名为 fct_orders 的 dbt 模型,它引用了由 Fivetran/Stitch 加载的名为 shopify.order 的表。如果您的模型具体化为视图,它将始终返回 Shopify 表中的最新数据。如果它被具体化为一个表,并且自您上次运行 dbt 以来新数据已到达 Shopify 表中,则该模型将是“陈旧的”。

也就是说,将其具体化为表的好处是它运行得更快,因为它不必每次都进行 SQL“转换”。

我经常看到的建议是这样的:

如果使用视图对您的最终用户来说不是太慢,请使用视图。 如果视图对最终用户来说太慢,请使用表格。 如果使用 dbt 建表太慢,请在 dbt 中使用增量模型。

【讨论】:

dbt 物化视图打开请求:github.com/fishtown-analytics/dbt/issues/1162 @dylanbaker 在 dbt 确实支持物化视图的情况下,我认为他们现在从 Felipe 的评论中支持,通过 dbt 将物化为表或视图之间有什么区别吗?我假设由于视图在物化时被缓存,所以没有任何实质性区别? 请注意,dbt 不支持物化视图(但人们在那个 gh 问题上要求它) @KyleCheung 刚刚更新了答案。简而言之,是的,它们有些相似,但我认为物化视图的缺点可能仍然使带有 dbt 的表更好。【参考方案2】:

如果您使用 DBT,则几乎不需要物化视图:物化视图实际上是一个基于查询的表 - 与“create table as select”相同。如果你有一个 DBT 模型,你可以实现为一个表,你会得到相同的结果。现在,表和物化视图之间的区别在于物化视图会自动更新,而表不会。但如果您使用 DBT,您可以通过调度 DBT 来调度表的刷新。

这只会在计划的 DBT 完成后为您提供更新的数据,如果基础表经常更改,这与物化视图不同,但大多数人会避免在频繁更改的表上使用物化视图,因为运行成本可能会失控。

Snowflake 中的物化视图只能查询一张表,而 DBT 有更多选项 - 例如连接两个表并物化为一个表会给你一些你不能用物化视图做的事情。

最后,如果你真的想用 DBT 部署物化视图,有两种方法:

    使用 pre-hook 或 post-hook,在运行 DBT 模型后执行任何一条 SQL。这可以工作,但维护不是很好。 有一种方法可以创建您自己的具体化 - 请参阅 https://docs.getdbt.com/docs/guides/creating-new-materializations - 这不是一件容易的事,但它会满足您的需求。还有一个名为 dbt-hack 的 GitHub 页面,它提供了有关非标准实现的有趣技术。

【讨论】:

以上是关于使用 dbt 的物化视图与表的主要内容,如果未能解决你的问题,请参考以下文章

创建表后更改“dbt”物化值

PG 物化视图

Oracle物化视图

视图 VS 物化视图

Oracle 物化视图

Postgres:更新与物化视图连接的表?错误:视图无法在物化视图中锁定行