Lineage tooling answers one question well when it works: if this column looks wrong, what upstream table, job, or transformation produced it? The tools differ mostly in how they discover that graph — parsing SQL statically, watching query logs at runtime, or relying on the transformation tool itself to declare it — and that choice determines how much you trust the result.
Column-level vs table-level lineage
Table-level lineage tells you that fct_orders depends on stg_orders and stg_customers. That is enough to answer "what breaks if I drop this table" but not enough to answer "which of the forty columns in this dashboard actually comes from the field the vendor just renamed." Column-level lineage traces individual fields through every transformation, which is dramatically more useful for impact analysis but much harder to compute reliably, especially across `SELECT *`, dynamic SQL, or Python transformation steps that a parser cannot follow.
How tools actually build the graph
Static SQL parsing (used by dbt's own lineage graph, SQLLineage, and most open-source options) reads the transformation code and builds a dependency graph without running anything. It is fast and free but blind to anything dynamic — a stored procedure that builds SQL strings at runtime will not resolve correctly. Query-log-based tools (OpenLineage integrations, Monte Carlo, Datadog's data tooling) watch what actually executed in the warehouse and infer lineage from real query history. That catches dynamic SQL but requires warehouse-level access and can be noisy — ad hoc analyst queries pollute the graph unless filtered out.
The dependency graph dbt generates from ref() and source() calls is accurate but stops at the warehouse boundary. It has no visibility into what happens after a BI tool queries a table, or what fed the raw sources before dbt touched them. For end-to-end lineage — ingestion tool through BI dashboard — you need a tool that consumes OpenLineage events or integrates specifically with your ingestion and BI layers, not dbt's graph alone.
OpenLineage as the common interchange format
Most serious lineage tooling today speaks OpenLineage, an open specification for emitting lineage events (job runs, datasets read/written, schema) that any producer or consumer can integrate with. Airflow, dbt, Spark, and most modern orchestrators have OpenLineage integrations. The practical benefit: you are not locked into one vendor's proprietary graph format, and you can swap the visualization or alerting layer without re-instrumenting every pipeline.
eventType: COMPLETE
job:
namespace: analytics
name: transform_fct_orders
inputs:
- namespace: warehouse
name: staging.stg_orders
outputs:
- namespace: warehouse
name: warehouse.fct_orders
facets:
schema:
fields:
- {name: order_id, type: BIGINT}
- {name: amount, type: DECIMAL}
Picking a tool for your team's actual size
A five-person data team with everything in dbt gets most of the value from dbt's native lineage graph plus dbt docs generate — adding a separate lineage platform is often overhead without enough scale to justify it. Once you have multiple ingestion tools, several orchestrators, and BI tools that need to trace back to source for compliance reasons, a dedicated platform (Atlan, Select Star, Monte Carlo, OpenMetadata) earns its cost because it stitches together tools that otherwise have no shared vocabulary for lineage.
| Approach | Strength | Blind spot |
|---|---|---|
| Static SQL parsing | Fast, no runtime access needed | Misses dynamic SQL, `SELECT *` |
| Query-log based | Catches what actually ran | Needs warehouse access, noisy |
| dbt native graph | Accurate within dbt's scope | Stops at warehouse boundary |
| OpenLineage platform | Cross-tool, vendor-neutral | Requires instrumentation everywhere |
Wrapping up
Start with what your transformation tool already gives you for free — dbt's graph covers more than most teams realize — and only add a dedicated lineage platform once you have enough tools in the stack that no single one can see the whole picture. Column-level lineage is worth the setup cost the first time a renamed field silently breaks three dashboards and nobody can trace why.
Independent software engineer in Nairobi specialising in Acumatica customisations, Laravel backends, and tax fiscalisation integrations across East and Southern Africa.