我刚刚开始接触dbt,在看了教程文档后,我想知道将我的转换物化为视图或表是否有区别?我正在使用 Snowflake 作为数据仓库。 这里 有一些文档显示了表和物化视图之间的区别,但如果我使用 dbt 定期更新表,它们或多或少会成为同一件事吗?
使用DBT的物化视图与表
据我所知,dbt不支持物化视图,但正如Felipe所评论的,有一个 开放的问题可以讨论 。如果 有 可能在Snowflake上使用物化视图,你是对的,他们 有点 成为同一件事。即使你还没有运行 dbt,物化视图也会更新。正如 Drew 在票据中提到的,有很多注意事项,使得在大多数使用情况下,使用表和 dbt 更为可取。"没有窗口函数,没有联合,有限的聚合,不能查询视图,等等等等"。
这就是说,dbt确实支持视图和表。
即使你使用dbt,视图和表之间仍然有区别。一个表总是需要被dbt刷新才能被更新。视图总是和它所引用的底层表一样是最新的。
例如,假设你有一个名为
fct_orders
的dbt模型,它引用一个由Fivetran/Stitch加载的名为
shopify.order
的表。如果你的模型被物化为一个视图,它将总是返回Shopify表中的最新数据。如果它被物化为一个表,并且在你上次运行dbt之后,Shopify表中出现了新的数据,那么这个模型将是 "过时的"。
也就是说,将其具体化为一个表的好处是它会运行得更快,因为它不需要每次都进行SQL "转换"。
我最常看到的建议是这样的。
如果你使用DBT,就没有必要使用物化视图:物化视图实际上是一个基于查询的表--与 "创建表为选择 "相同。如果你有一个DBT模型,你可以把它作为一个表来物化,你会得到同样的结果。现在,表和物化视图的区别在于,物化视图会自动更新,而表则不会。但是如果你使用DBT,你可以通过调度DBT来安排表的刷新。
这只会在你安排的DBT将完成后给你更新的数据,如果底层表经常变化,这与物化视图不一样,但大多数人避免在经常变化的表上面使用物化视图,因为运行成本会失控。
Snowflake 中的物化视图只能查询一个表,而 DBT 有更多的选择--例如,连接两个表和物化为一个表会给你带来物化视图做不到的东西。