使用DBT的物化视图与表

6 人关注

我刚刚开始接触dbt,在看了教程文档后,我想知道将我的转换物化为视图或表是否有区别?我正在使用 Snowflake 作为数据仓库。 这里 有一些文档显示了表和物化视图之间的区别,但如果我使用 dbt 定期更新表,它们或多或少会成为同一件事吗?

1 个评论
你指的是dbt中的物化参数吗? docs.getdbt.com/docs/building-a-dbt-project/building-models/ ...还是snowflake中的物化视图?
snowflake-cloud-data-platform
dbt
Kyle Cheung
Kyle Cheung
发布于 2020-10-23
2 个回答
dylanbaker
dylanbaker
发布于 2021-10-20
已采纳
0 人赞同

据我所知,dbt不支持物化视图,但正如Felipe所评论的,有一个 开放的问题可以讨论 。如果 可能在Snowflake上使用物化视图,你是对的,他们 有点 成为同一件事。即使你还没有运行 dbt,物化视图也会更新。正如 Drew 在票据中提到的,有很多注意事项,使得在大多数使用情况下,使用表和 dbt 更为可取。"没有窗口函数,没有联合,有限的聚合,不能查询视图,等等等等"。

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

即使你使用dbt,视图和表之间仍然有区别。一个表总是需要被dbt刷新才能被更新。视图总是和它所引用的底层表一样是最新的。

例如,假设你有一个名为 fct_orders 的dbt模型,它引用一个由Fivetran/Stitch加载的名为 shopify.order 的表。如果你的模型被物化为一个视图,它将总是返回Shopify表中的最新数据。如果它被物化为一个表,并且在你上次运行dbt之后,Shopify表中出现了新的数据,那么这个模型将是 "过时的"。

也就是说,将其具体化为一个表的好处是它会运行得更快,因为它不需要每次都进行SQL "转换"。

我最常看到的建议是这样的。

  • 如果使用视图对你的终端用户来说不是太慢,就使用视图。
  • 如果视图对你的终端用户来说太慢,就使用表。
  • 如果用dbt建立表格太慢,就用dbt中的增量模型。
  • @dylanbaker 在dbt支持物化视图的情况下,从Felipe的评论中我认为他们现在支持物化视图,通过dbt物化为表或视图有什么区别吗?我想,既然视图在物化时被缓存了,那么就没有任何实质性的区别了?
    注意,DBT不支持物化视图(但人们在那个Gh问题上要求它)。
    @KyleCheung 刚刚更新了答案。简而言之,是的,它们有些类似,但在我看来,物化视图的缺点可能还是让带dbt的表更好。
    JeromeE
    JeromeE
    发布于 2021-10-20
    0 人赞同

    如果你使用DBT,就没有必要使用物化视图:物化视图实际上是一个基于查询的表--与 "创建表为选择 "相同。如果你有一个DBT模型,你可以把它作为一个表来物化,你会得到同样的结果。现在,表和物化视图的区别在于,物化视图会自动更新,而表则不会。但是如果你使用DBT,你可以通过调度DBT来安排表的刷新。

    这只会在你安排的DBT将完成后给你更新的数据,如果底层表经常变化,这与物化视图不一样,但大多数人避免在经常变化的表上面使用物化视图,因为运行成本会失控。

    Snowflake 中的物化视图只能查询一个表,而 DBT 有更多的选择--例如,连接两个表和物化为一个表会给你带来物化视图做不到的东西。