Reputation: 101
I found out a way to handle the temp tables in DBT, write all those in pre-hook and call the final temp table in the outside of the pre-hook, tested and is working fine, able to reduce the code running time from more than 20 mins to 1 min. But I see one problem that we can't see the lineage graph in the DBT documents. Is there any way to handle the temp tables other than pre-hook and with lineage in Docs?
Upvotes: 8
Views: 13744
Reputation: 759
You're right in thinking that dbt does not support temporary tables. That's because temporary tables only persist in a single session, and dbt opens one connection/session per thread. Therefore any temporary tables created on one thread would not be visible to a model running on a different thread.
It sounds like CTEs are a performance drag for you though — out of interest, which warehouse are you using?
You've identified two workarounds, and there's another one worth discussing:
Option 1: Materialize your model as CTEs using the ephemeral
materialization (docs)
Pros:
ref
-ing themCons:
Option 2: Use pre-hooks to create temp tables
I would generally recommend against this — you can't test or document your models, and they won't be in the lineage graph (as you've noted).
Option 3: Materialize these models as tables in a separate schema, and drop the schema at the end of a run
I think Michael's suggestion is a good one! I'd tweak it just a little bit:
{{ config(
materialized='table',
schema='my_temporary_schema'
) }}
on-run-end
hook (docs) to drop that schema — in your dbt_project.yml
:on-run-end: "drop schema my_temporary_schema cascade"
Pros:
Cons:
drop cascade
command! This introduces fragility into your project!Upvotes: 14
Reputation: 264
Two solutions:
These should both show up on the lineage graphs.
Upvotes: 0
Reputation: 1
I think there are two ways you could get the same result while preserving lineage in the documentation:
select * from YOUR_TEMP_TABLE_NAME
.on-run-end
of your dbt_project.yml
.Upvotes: 0