Is Your dbt Run Quietly Driving Up Warehouse Compute?
dbt executes everything in the warehouse, so a full refresh where an incremental would do, or a table materialization that rebuilds every night, shows up as credits, not as an error. Incremental logic is optional in dbt. In a generated Data Vault it is the only way loads are written.
Does this sound familiar?
- The nightly run works, and the Snowflake or BigQuery bill for it is larger every quarter without any new model being added.
- Half the project is materialized as tables that rebuild in full because incremental logic was never written for them.
- A small upstream change triggers a run across the whole DAG, and nobody is sure which part actually needed to run.
- Finance asks why compute went up, and the honest answer is a list of models nobody has profiled.
dbt, now one company with Fivetran, runs every model in the warehouse. That is the right architecture. It also means that inefficiency has no error state: a model that rebuilds a year of history every night succeeds, and the cost shows up somewhere else.
Why compute creeps
- Full rebuilds are the default. A
tablematerialization drops and recreates on every run. Making it incremental is extra work per model, and that work is easy to postpone. - Incremental logic is bespoke. Unique keys, lookback windows and merge strategies are decided per model, by whoever wrote it, and across developers they drift.
- The DAG runs wider than the change. One changed input can trigger a run across many downstream models, most of which produce the same output as yesterday.
- Nobody profiles what works. A green run is the finish line. Compute per model is visible in the warehouse console, not in the pipeline.
None of this is a dbt fault. Hand-written transformation logic is as efficient as the person who wrote it had time to make it.
Where efficiency belongs
- Delta loading should be the only kind. If the load pattern is generated, incremental is not a choice a developer makes under deadline. It is how every load is written.
- History should be isolated in one place. Satellites hold change over time, so the mart layer never has to recompute history to answer a question about now.
- Set based SQL for the engine you run. Generated code can be tuned per platform once, rather than per model by whoever wrote it.
What changes with Datavault Builder
Datavault Builder generates set based delta loads for hubs, links and satellites, tuned to the target engine, so the expensive part of the pipeline only ever touches what changed.
- Every load is a delta by construction. New and changed rows are detected against what is already historized. Nothing is dropped and recreated.
- History lives in satellites. As-was questions are answered from stored change, not by rebuilding the past on every run. Bi-temporal loads and point in time tables are patterns the platform offers out of the box, not something to build from macros.
- The run scope follows the model. Dependencies are derived, so a change loads what it touches and nothing beyond it.
- dbt State and Fusion still help if dbt stays. Datavault Builder can generate the dbt models for teams that keep operations there, and those benefit from skipped unchanged models. The generated layers underneath never needed skipping, because they were never doing the full work.
- Compute is predictable. The load cost tracks how much the sources changed, not the total size of the warehouse, and that is a number you can watch.
What to decide
Take the ten most expensive models from the last month of warehouse query history. If most of them are staging or history models rebuilt in full, that is the generated layer waiting to exist.
See It Running on One of Your Sources
Book a free demo and bring the connector that costs you the most, in money or in time.
Three Steps to a Pipeline You Control
-
Find the full rebuilds
Sort models by compute per run. Table materializations of large sources are usually the top of the list.
-
Generate the delta loads
Hubs, links and satellites in Datavault Builder are loaded by comparing against what is already historized. Only changes move.
-
Run the rest on top
Marts and metrics compute from a vault that only changed where the source did.
How Datavault Builder Takes the Friction Out of Ingestion
-
Ingestion is built in
Batch, delta and CDC loads from databases, files, REST APIs, NoSQL and Python sources, with streams such as Kafka arriving as micro-batches. Same platform that generates the warehouse, no second invoice.
-
Your schema, not the vendor's
Source tables are mapped to a Data Vault 2.0 model you designed. A new column or a renamed table changes a mapping, not a chain of post-load scripts.
-
Only deltas move
Hubs, links and satellites load what changed. Full reloads stay in staging instead of being reprocessed downstream every night.
-
History is kept by design
Every change is retained as it arrives, so as-was reporting works even where the source overwrites its own rows.
-
Code you never hand-write
Loading, historization and lineage are generated from the model in real time and run natively on Snowflake, Databricks, BigQuery, SQL Server, Fabric, Oracle or PostgreSQL.
-
One platform, up to nine tools fewer
Modeling, ETL, CI/CD, documentation and lineage in one place. That is what makes 14.7 minutes from requirement to production possible.
Meet Our Expert
Twenty minutes with our Sales Director, and an honest answer on whether this fits your stack.
Matt Collett
Sales Director
Great, pick a time that works for you:
Other Problems This Series Covers
-
The dbt Trade-Off: Code Sprawl, Hidden TCO, and the Case for Automated Modeling
dbt brought software engineering to SQL, and teams are right to want that. The trade is a transformation layer that grows in code, in cost and in compute, on top of an ingestion tool that is still a separate product. A generated Data Vault takes that whole layer off the code base. It does not need dbt, but it can be combined with it.
-
Does dbt Still Leave You to Land the Data Yourself?
dbt is a transformation tool by design. It assumes the raw data is already in the warehouse, so the landing step is a second product with a second bill, even now that Fivetran and dbt Labs are one company. A warehouse platform that ingests and models in one place closes the gap without a second contract.
-
Does Your dbt Project Have More Models Than Anyone Can Explain?
ref() makes a new model a one line decision, and a project of hundreds of loosely governed SQL files is the result. Changing a business key upstream then means finding every model that inherited it. The fix is not more tests. It is a model that generates the structure instead of accumulating it.
Questions and Answers
- Because they are optional and hand-written per model, with a unique key, a filter and often a merge strategy to get right. In practice many models stay as full table rebuilds because the incremental version was never finished. A generated satellite load is incremental by construction.
- dbt State, introduced with the Fusion engine, skips models whose inputs have not changed, and dbt Labs reports meaningful compute savings from it. It decides whether to run a model. It does not change what the model does when it runs, so a full rebuild that is triggered still rebuilds in full.
- The loads are set based delta operations generated for the target engine. They touch what changed, which on a typical night is a small fraction of the source.