物化视图与 Table 使用 dbt

Materialized View vs Table Using dbt

我刚刚开始使用 dbt 并阅读了教程文档 我想知道将我的转换具体化为视图或 tables 之间是否有区别?我正在使用 Snowflake 作为数据仓库。有一些文档 here 显示了 table 和物化视图之间的差异,但是如果我使用 dbt 定期更新 tables,它们或多或少会变成同一件事?

谢谢!

dbt 不支持物化视图,据我所知,但正如 Felipe 评论的那样,有一个 open issue to discuss it。如果 可以 在 Snowflake 上使用物化视图,那么它们 有点 就变成了同一件事。即使您没有 运行 dbt,物化视图也会更新。正如 Drew 在票证中提到的那样,在大多数用例中使用 tables 和 dbt 时有很多警告:“没有 window 函数,没有联合,有限的聚合,不能查询意见,等等等等。。

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

即使在使用 dbt 时,视图和 table 之间仍然存在差异。 A table 将始终需要由 dbt 刷新才能更新。视图将始终与它引用的基础 table 一样 up-to-date。

例如,假设您有一个名为 fct_orders 的 dbt 模型,它引用了一个由 Fivetran/Stitch 加载的名为 shopify.order 的 table。如果您的模型被具体化为视图,它将始终 return Shopify table 中最多的 up-to-date 数据。如果它具体化为 table,并且自上次 运行 dbt 以来新数据已到达 Shopify table,则模型将为 'stale'.

也就是说,将其具体化为 table 的好处是它会 运行 更快,因为它不必每次都执行 SQL 'transformation'时间.

我看到的最常给出的建议是这样的:

  • 如果使用视图对您的 end-users 来说不是太慢,请使用视图。
  • 如果视图对于您的 end-users 而言太慢,请使用 table。
  • 如果使用 dbt 构建 table 太慢,请在 dbt 中使用增量模型。

如果您使用 DBT,则几乎不需要实体化视图:实体化视图实际上是基于查询的 table - 与“create table as select 相同”。如果您有 DBT 模型,您可以具体化为 table,并且您会得到相同的结果。 table 和实体化视图的区别在于实体化视图会自动更新,而 table 不会。但是,如果您使用的是 DBT,则可以通过安排 DBT 来安排 table 的刷新。

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

Snowflake 中的物化视图只能查询一个 table,而使用 DBT 则有更多选项 - 例如加入两个 table 并实现 table 会给你一些物化视图无法做到的事情。

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

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