

In a Relational Database Management Systems (RDBMS), a view is virtualization applied to tables : it is a virtual table representing the result of a database query. There's also a GitHub page called dbt-hack which gives interesting techniques on non-standard materializations.At AWS, we take pride in building state of the art virtualization technologies to simplify the management and access to cloud services such as networks, computing resources or object storage. There is a way to create your own materialization - see - this is not an easy task, but that will give you want you want.That can work but the maintenance is not great. Use the pre-hook or the post-hook, which executes any piece of SQL after running the DBT model.join two tables and materialize as a table will give you something you can't do with a materialized view.įinally, if you really want to deploy materialized views with DBT there are two ways: Materialized views in Snowflake can only query one table, while with DBT there are more options - e.g. This will only give you updated data after your scheduled DBT will complete, which is not the same as a materialized view if the underlying table changes frequently, but most people refrain from using materialized views on top of tables that change frequently because the running cost can get out of control. But if you're using DBT you can schedule a refresh of the table by scheduling DBT. Now the difference between a table and a materialized view is the fact that the materialized view automatically updates, while the table does not. If you have a DBT model you can materialize as a table and you'll get the same result. If you use DBT there's little need for materialized views: a materialized view is in fact a table which is based on a query - same as "create table as select". If building a table with dbt gets too slow, use incremental models in dbt.If a view gets too slow for your end-users, use a table.If using a view isn't too slow for your end-users, use a view.The advice I have seen given most often is something like this: That said, the benefit of materializing it as a table is that it will run more quickly, given it's not having to do the SQL 'transformation' each time.


If it is materialized as a table, and new data has arrived in the Shopify table since you last run dbt, the model will be 'stale'. If your model is materialized as a view, it will always return the most up-to-date data in the Shopify table. A view will always be as up-to-date as the underlying tables it is referencing.įor example, let's say you have a dbt model called fct_orders which references a table that is loaded by Fivetran/Stitch called shopify.order. A table will always need to be refreshed by dbt in order to be updated. That said, dbt does support views and tables.Įven when you're using dbt, there's still a difference between a view and a table. As Drew mentions in the ticket though, there are a lot of caveats that make using tables with dbt preferable in most use cases: "no window functions, no unions, limited aggregates, can't query views, etc etc etc".
#REDSHIFT MATERIALIZED VIEWS UPDATE#
The materialized view would update even if you haven't run dbt. If it were possible to use materialized views on Snowflake, you're right that they somewhat become the same thing. Dbt doesn't support materialized views, as far as I'm aware, but as Felipe commented, there is an open issue to discuss it.
