6

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

谢谢!

4

2 回答 2

15

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

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

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

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

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

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

  • 如果使用视图对您的最终用户来说不是太慢,请使用视图。
  • 如果视图对您的最终用户来说太慢,请使用表格。
  • 如果使用 dbt 建表太慢,请在 dbt 中使用增量模型。
于 2020-10-22T20:28:43.777 回答
2

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

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

Snowflake 中的物化视图只能查询一个表,而 DBT 有更多选项 - 例如,连接两个表并物化为一个表将为您提供物化视图无法做到的事情。

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

  1. 使用 pre-hook 或 post-hook,它们在运行 DBT 模型后执行任何一条 SQL。这可以工作,但维护不是很好。
  2. 有一种方法可以创建自己的物化 - 请参阅https://docs.getdbt.com/docs/guides/creating-new-materializations - 这不是一件容易的事,但它会给你想要的。还有一个名为 dbt-hack 的 GitHub 页面,它提供了有关非标准实现的有趣技术。
于 2021-10-20T06:36:20.280 回答