Scope & vantage. Assessed mid-2026, after the Fivetran / dbt Labs merger completed on 1 June 2026 (an all-stock deal first announced 13 October 2025) and the debut of dbt Core v2.0 — currently alpha — which open-sources the Rust-based Fusion engine runtime under Apache 2.0. The alpha status matters: do not read "open-sourced" as "settled". Target use case: the SQL transformation layer of a warehouse-centric platform — modeling, testing, lineage, and CI for an analytics-engineering team. Axes are re-cut for the transformation layer and are not comparable with my analytics-platform assessments. "Warehouse-native" means Snowflake Dynamic Tables, Databricks DLT, and equivalents.
1. Executive summary
Adopt dbt. It is still the right answer, and for the first time in years the reason to think twice is not technical.
The technical news is good, and better than I expected. The Fusion engine is a full rewrite of dbt's core in Rust as a real SQL compiler — it parses up to 30× faster than dbt Core on large projects (the 10,000-model kind), validates SQL without a warehouse round-trip, and enables state-aware orchestration that skips work it can prove is unnecessary. That last one is not a speed feature, it is a cost feature, and on a big project it is the difference between a dev loop of seconds and one of coffee breaks. dbt Core v2.0 open-sources the runtime under Apache 2.0 — though v2.0 is still alpha, and I would not put an alpha on the critical path of a platform this year.
The non-technical news is the assessment. On 1 June 2026 Fivetran and dbt Labs completed an all-stock merger. Before it, Fivetran had acquired SQLMesh — the most credible open-source alternative to dbt — and subsequently donated SQLMesh to the Linux Foundation. Read that sequence twice. One company now controls dbt Core, the Fusion engine, dbt Cloud's pricing, and the leading open-source rival to all three. Nobody has done anything wrong, and the Linux Foundation donation is a genuinely meaningful governance commitment. But "there is a credible alternative if this goes badly" was load-bearing in every dbt recommendation I have made for six years, and it is now doing much less work than it used to.
Verdict
dbt (Core + Fusion) — Adopt. Still the default transformation layer, and Fusion makes it materially better rather than merely newer. The ecosystem and hiring pool are unmatched; the dev loop on large projects is transformed.
Main risk — vendor concentration, scored 3.0 and the weakest axis on the board. One entity owns dbt Core, Fusion, dbt Cloud and SQLMesh. The mitigation is not to avoid dbt; it is to stay on Core, keep your models portable, and treat dbt Cloud as a convenience rather than a foundation.
SQLMesh — Trial, and specifically if incremental correctness is causing you real pain. Its column-level lineage and virtual data environments are better engineering than dbt's equivalents. Linux Foundation governance is now a genuine point in its favour — with the caveat about who donated it.
Warehouse-native — Narrow Use. Fine for a handful of pipelines, structurally weak on testing and CI. Hand-rolled SQL — Hold. Not a strategy.
2. Positioning
dbt's actual insight was never technical. It was that SQL transformations are software, and should therefore have version control, tests, code review, documentation, and CI — the things every other engineering discipline had settled decades earlier. Templated SQL was the delivery mechanism for that argument, not the point of it. This matters for the assessment because it explains why "dbt but faster" is not a competitor and why hand-rolled SQL scores so badly: the competition is not about generating SQL, it is about whether your transformation layer is engineered or merely written.
| Dimension | dbt (Core + Fusion) | SQLMesh | Warehouse-native | Hand-rolled SQL |
|---|---|---|---|---|
| Core idea | SQL is software | SQL is software, with a real compiler | The warehouse orchestrates itself | — |
| SQL understanding | Jinja templating; Fusion adds true compilation | Full SQL parsing from day one | Native | None |
| Column-level lineage | Improving via Fusion | Native | Vendor-dependent | No |
| Dev environments | Separate schema per developer | Virtual environments — no recompute | Clone the warehouse | Hope |
| Incremental | You write the strategy | The engine reasons about it | Declarative, engine-managed | You and your regrets |
| Governance | Open source (Core), one vendor | Linux Foundation — donated by that same vendor | Your warehouse vendor | You |
| Hiring | Enormous | Small | Warehouse-specific | n/a |
SQLMesh's differentiator is worth understanding rather than dismissing, because it is real engineering and not marketing. Because it parses SQL properly instead of templating strings, it can tell whether a change to a model is breaking or non-breaking, and therefore whether downstream tables need rebuilding at all. Its virtual data environments give each developer a view over shared physical tables instead of a full recompute per person. If you have ever watched a dbt developer wait forty minutes to rebuild a dev schema in order to change a CASE statement, you understand exactly what problem that solves. Fusion moves dbt toward the same place — a true SQL compiler is the prerequisite — and it is genuinely converging.
3. Radar criteria — the reasoning
Modeling expressiveness
SQLMesh 4.4 edges dbt 4.3 — both give you refs, macros, and modular SQL; SQLMesh's understanding of the SQL itself lets it do things dbt approximates. Warehouse-native 3.2: declarative and limited. Hand-rolled 2.6, which flatters it.
Build performance
dbt 4.4 — this is Fusion's headline and it is not marketing: up to 30× faster parsing on 10k-model projects, and state-aware orchestration that skips provably unnecessary work. SQLMesh 4.3, which had this property from the start. Warehouse-native 4.2, since the engine does the work. Hand-rolled 3.0.
Incremental correctness
The axis where dbt is genuinely behind: 3.6. dbt asks you to write the incremental strategy and then trusts you, which means every subtly-wrong is_incremental() block silently produces subtly-wrong data for months. SQLMesh 4.7 reasons about it from the parsed SQL. Warehouse-native 4.0. Hand-rolled 2.4. If your team has been burned by a bad backfill, this row is why you should look at SQLMesh — see my incremental-processing notes for how expensive the failure mode is.
Testing & data quality
dbt 4.2 and SQLMesh 4.4. dbt's tests are the reason the category exists at all — being able to say not_null and unique in YAML brought data testing to teams that were never going to write a test suite. SQLMesh adds audits and stronger typing. Warehouse-native 3.2: possible, unnatural. Hand-rolled 2.0.
Lineage & documentation
dbt 4.4 — docs and the DAG are generated from the code, so they cannot rot the way a wiki does. SQLMesh 4.4 with genuinely better column-level lineage. Warehouse-native 3.4, hand-rolled 1.8 — and 1.8 is generous, because undocumented SQL is worse than no SQL.
CI / dev loop
SQLMesh 4.6 for virtual environments — no full rebuild per developer is a structural advantage, not a tuning one. dbt 4.3, transformed by Fusion's ability to validate SQL without hitting the warehouse; the dev loop is the thing Fusion most improves and the thing users notice first. Warehouse-native 3.0: CI against a live warehouse is slow and expensive. Hand-rolled 2.4.
Governance
dbt 3.9 and SQLMesh 3.9. Both are the transformation layer, not the access-control layer — they inherit governance from the warehouse. Warehouse-native 4.2 wins here almost by definition, since it never leaves the governed boundary. Hand-rolled 2.2.
Ecosystem & hiring
dbt 4.9, and this is the axis that keeps the recommendation where it is. Every warehouse has an adapter, every BI tool integrates, every analytics engineer on the market has used it, and the packages you need already exist. SQLMesh 3.2: good engineering, small community — you will train every hire. Warehouse-native 3.4, hand-rolled 2.6.
Ops burden
Warehouse-native 4.5 — nothing to run. dbt 4.1: dbt Core is a CLI in CI, which is about as light as a real tool gets. SQLMesh 3.9. Hand-rolled 1.8, because "no tool" means you built a worse one by accident.
Vendor & licence risk
dbt 3.0 — the lowest score I give it on any axis, and the reason this assessment exists. The merged Fivetran/dbt Labs entity controls dbt Core, the Fusion roadmap, dbt Cloud's pricing, and SQLMesh. Maintaining three overlapping products indefinitely is not a thing companies do, so at some point that portfolio gets rationalised, and you do not get a vote. SQLMesh 3.2 — Linux Foundation governance is real protection, and it was donated by the company that owns the competitor, which is a fact worth holding in mind rather than a conspiracy. Warehouse-native 2.6 is the most locked-in option on the page and nobody frames it that way. Hand-rolled 4.6: the only thing it is good at is that nobody can take it away from you.
4. Radar scorecard
How these scores are arrived at — the rings, the 0–5 scale, and the evidence rules — is written up in the radar methodology. This table and the chart below are generated from one file, scorecards.json: the source of truth, machine-readable, and kept separate so two copies of the same numbers cannot drift apart between editions. Last reviewed 2026-Q3.
| Criterion | dbt (Core + Fusion) | Evidence | Risk → mitigation |
|---|---|---|---|
| Modeling Expressiveness | 4.3 | Refs, macros, modular SQL; Fusion adds true compilation | SQLMesh edges it on SQL understanding → fine for most teams |
| Build Performance | 4.4 | Fusion: ~30× faster parsing on 10k-model projects; state-aware orchestration | — |
| Incremental Correctness | 3.6 | You write the incremental strategy; the tool trusts you | Silent wrong data → SQLMesh if backfills have burned you |
| Testing & Data Quality | 4.2 | Tests in YAML; the reason data testing went mainstream | — |
| Lineage & Documentation | 4.4 | Docs + DAG generated from code, so they can't rot | Column-level lineage trails SQLMesh → improving via Fusion |
| CI / Dev Loop | 4.3 | Fusion validates SQL with no warehouse round-trip | Dev schema rebuilds → SQLMesh virtual environments |
| Governance | 3.9 | Inherits warehouse governance | Not an access-control layer → govern in the warehouse |
| Ecosystem & Hiring | 4.9 | Every adapter, every BI tool, every analytics engineer | — |
| Ops Burden | 4.1 | dbt Core is a CLI in CI | — |
| Vendor & Licence Risk | 3.0 | One entity owns dbt Core, Fusion, dbt Cloud and SQLMesh (merger completed 1 Jun 2026) | Portfolio rationalisation → stay on Core, keep models portable, treat Cloud as convenience |
Comparator scores (same axis order) — SQLMesh: 4.4 / 4.3 / 4.7 / 4.4 / 4.4 / 4.6 / 3.9 / 3.2 / 3.9 / 3.2. Warehouse-native: 3.2 / 4.2 / 4 / 3.2 / 3.4 / 3 / 4.2 / 3.4 / 4.5 / 2.6. Hand-rolled SQL: 2.6 / 3 / 2.4 / 2 / 1.8 / 2.4 / 2.2 / 2.6 / 1.8 / 4.6.
5. The radar
Ten-axis fit for the SQL transformation layer. dbt and SQLMesh are nearly the same polygon with two informative differences: SQLMesh wins incremental correctness and the dev loop, dbt wins ecosystem by a mile. Hand-rolled SQL is on the chart to make a point — it is worst on nine axes and best on the tenth, which is exactly why people keep choosing it. Click any name in the legend to toggle it on or off — comparing two shapes at a time is far more legible than comparing four.
6. Workload-specific analysis
| Situation | Best fit | Notes |
|---|---|---|
| Standard warehouse-centric analytics | dbt | The default. Ecosystem and hiring settle it; Fusion removes the old speed objection. |
| 10,000+ models, slow dev loop | dbt Fusion | This is exactly what the Rust rewrite was for. Measure it before assuming you need to migrate. |
| Incremental models that keep going subtly wrong | SQLMesh | The one workload where I'd override the default. The engine reasoning about breaking changes is the real fix. |
| Long dev-schema rebuild times | SQLMesh | Virtual environments are structural, not a tuning knob. |
| Vendor concentration is a board-level concern | SQLMesh | Linux Foundation governance — donated by the company that owns dbt. Weigh that honestly. |
| A handful of pipelines, no analytics engineers | Warehouse-native | Dynamic Tables / DLT are fine at small scale. They stop being fine at testing. |
| Streaming transformation | None | Wrong tool class — that's Flink. |
| "We'll just write SQL and schedule it" | Hold | You will rebuild dbt, badly, over three years, without the tests. |
The trap: treating dbt Cloud as the platform rather than as a convenience. The pricing, the Fusion roadmap, and the leading open-source alternative are now all controlled by one merged entity — so the further you build into the managed product, the less your alternatives are worth. This is not a reason to avoid dbt, and I want to be clear about that: dbt Core is open source, Fusion is open source under v2.0, and the engineering is good. It is a reason to keep your models runnable by dbt-core in your own CI, to avoid depending on Cloud-only features for anything load-bearing, and to notice that "we can always switch to SQLMesh" is a weaker sentence in July 2026 than it was in May. Portability is cheap to preserve and expensive to retrofit.
7. Reference architecture
The shape that keeps your options open: dbt Core runs in your CI against your warehouse, the orchestrator triggers it, and nothing Cloud-only sits on the critical path. That is not paranoia — it is the cheapest insurance available in this category, and it costs approximately one afternoon.
graph LR DEV["Analytics engineer"] --> GIT["Git
models + tests"] GIT --> CI["CI
dbt-core build"] CI -->|"validate, no warehouse"| FUS["Fusion
SQL compiler"] CI --> PR["PR review
+ slim CI"] PR --> ORC["Orchestrator
Dagster / Airflow"] ORC --> RUN["dbt build
prod target"] RAW[("Raw tables")] --> RUN RUN --> MART[("Curated marts")] RUN -.->|"test failure"| ALERT["Alerting"] RUN -.->|"manifest.json"| LIN["Lineage + docs"] MART --> SEM["Metrics layer"] SEM --> BI["BI / apps"] GOV["Warehouse RBAC"] -.->|"governs"| MART
Note what is missing: nothing on the critical path is a managed-only feature. dbt Core in your CI, triggered by your orchestrator, emitting a manifest you own. Fusion validates without touching the warehouse, which is what makes the loop fast. If this diagram still works when a vendor changes its mind, you have bought the right insurance.
The two lines that matter most in any dbt project, and the ones most often written wrong — the incremental strategy dbt trusts you to get right:
-- The axis where dbt scores 3.6: it will not check this for you.
{{ config(
materialized='incremental',
unique_key='order_id',
-- 'merge' is the safe default. 'append' is faster and will silently
-- duplicate rows the first time a late-arriving record shows up.
incremental_strategy='merge',
on_schema_change='fail'
) }}
select order_id, customer_id, updated_at, revenue
from {{ ref('stg_orders') }}
{% if is_incremental() %}
-- The classic bug: >= max(updated_at) re-reads the boundary row,
-- > max(updated_at) drops records that share the boundary timestamp.
-- A lookback window is the honest fix for late-arriving data.
where updated_at >= (
select coalesce(max(updated_at), '1900-01-01') - interval '3 days'
from {{ this }}
)
{% endif %}
8. POC plan (4 weeks)
- Week 1 — measure your dev loop before you migrate anything. Time a full parse and a dev rebuild on your real project. If Fusion takes that from minutes to seconds, the SQLMesh case just got much weaker and you have saved yourself a migration. Most teams evaluating alternatives are actually complaining about a problem Fusion fixes.
- Week 2 — audit your incremental models. For each one, ask: what happens on a late-arriving record? On a schema change? On a backfill of a month you already loaded? This is the axis where dbt scores 3.6, and the answer tells you whether SQLMesh is solving a real problem for you or an imagined one.
- Week 3 — port ten models to SQLMesh. Not because you will switch, but because knowing what the alternative costs is the only thing that makes "we could switch" a true statement rather than a comforting one. Time it honestly and write the number down.
- Week 4 — decide, and write the portability rules. Re-score this table. Then write down explicitly which dbt Cloud features you will allow on the critical path — my answer is none — and put that in the ADR. That single paragraph is worth more than the rest of the POC.
9. Final recommendation
Adopt dbt. Stay on Core. Keep your models portable, and treat that as a standing rule rather than a phase.
dbt remains the right default and the Fusion engine makes it a better tool rather than just a newer one — a real Rust SQL compiler, roughly 30× faster parsing on large projects, validation without a warehouse round-trip, and state-aware orchestration that declines to rebuild what it can prove has not changed. Open-sourced in Core v2.0. On the axes that decide platform choices over years — ecosystem, hiring, the sheer number of people who already know it — nothing else is close, and that is not inertia, it is a genuine engineering asset.
Look seriously at SQLMesh in exactly one situation: incremental correctness is hurting you. If your team has shipped subtly wrong numbers because an is_incremental() block was subtly wrong, SQLMesh's ability to reason about breaking versus non-breaking changes from parsed SQL is not a nicer version of dbt — it is a different and better answer to your actual problem. Its virtual data environments are the other genuine advantage, and neither is marketing.
The thing I would put in the ADR, though, is the one that has nothing to do with either tool's engineering. One company now owns dbt Core, Fusion, dbt Cloud, and SQLMesh. That is not an accusation — the Linux Foundation donation of SQLMesh is a real and creditable governance commitment, and nobody has behaved badly. But an argument I have leaned on for six years, "there is a credible alternative if this goes wrong", is now substantially weaker, and pretending otherwise would be dishonest. The response is not to avoid dbt. It is to keep dbt-core running in your own CI, refuse to put Cloud-only features on the critical path, and preserve the portability while it is free. Re-assess when the merged entity publishes a roadmap that says what happens to SQLMesh — that is the single fact that would move this page.
References
The merger is recent enough that most commentary is speculation. I have separated what has been announced from what people think it means, because the difference matters here more than usual.
Primary sources & documentation
- dbt — about the Fusion engine. The Rust rewrite, SQL comprehension, and state-aware orchestration; the evidence behind the Build Performance and CI scores.
- dbt-labs/dbt-fusion. The engine source. The runtime was open-sourced under Apache 2.0 alongside dbt Core v2.0 (alpha) on merger-completion day — check the current release status before you plan around it.
- SQLMesh — plans and virtual environments. The mechanism behind the 4.7 on incremental correctness and the 4.6 on the dev loop.
- TobikoData/sqlmesh. The project, now under Linux Foundation governance.
- Fivetran — the dbt Labs merger announcement. The corporate fact behind the 3.0 vendor-risk score. Announced October 2025, completed 1 June 2026.
Commentary (speculative — dated, and treat as such)
- Small Big Data — SQLMesh, dbt and Fivetran: what's next?. The clearest statement of the consolidation problem I have read.
- Nexla — open source in the age of SaaS. Written by a competitor to both; the incentive is obvious and the analysis is still worth reading.
Deeper reading (blog)
The internals behind the scores:
- Analytics Engineering with dbt — the practice this tool implements, and the deep-dive behind the modeling scores.
- Snowflake + dbt: Medallion Architecture — how the layers land in a real project.
- Data Contracts — the discipline that catches what dbt tests miss.
- The Metrics Layer — what sits downstream of the marts.
- Radar: data platform techniques — analytics engineering assessed as a practice rather than a tool.
- Radar: Airflow vs Dagster vs Prefect — what triggers all of this.
Scores are my own architect-level judgment for the stated use case, calibrated to mid-2026 — not a vendor ranking. Transformation-layer axes; NOT comparable with the analytics assessments. Re-score against your own POC numbers before you commit.