dbt: Full DAG hash comparison


🧠 Contexte : state:modified dans dbt

Quand tu fais :

dbt run --select state:modified --state path/to/previous_run

👉 dbt compare le “state” du projet actuel avec celui d’un run précédent (dans un manifest.json)
Cela permet de ne recompiler/recalculer que les modèles impactés par un changement.

Mais… comment dbt détecte qu’un modèle est impacté ? 🤔


✅ Solution : DAG hash comparison

dbt utilise un mécanisme de “hash de graphe” pour détecter les modèles affectés directement ou indirectement par une modification.


🔗 Qu’est-ce qu’un DAG dans dbt ?

DAG = Directed Acyclic Graph
C’est le graphe de dépendances de ton projet dbt.

Exemple :

source → stg_clients → int_clients_enriched → fct_clients

🎯 Exemple de changement indirect

  • Tu modifies stg_clients.sql (changement de logique, de colonnes, ou même juste un commentaire dans le config)
  • Tu n’as pas touché à fct_clients.sql directement
  • Pourtant, fct_clients dépend indirectement de stg_clients

👉 Grâce au full DAG hash comparison, dbt détecte que fct_clients est indirectement impacté et doit être reconstruit.


⚙️ Comment ça fonctionne ?

Chaque modèle dans dbt a un hash (empreinte) qui inclut :

Élément inclus dans le hashExemple
SQL compiléLe SELECT final
config()Matérialisation, tags, etc.
meta, docs, etc.Documentation liée
Macros utiliséessi le modèle appelle un macro
Dépendances (ref(), source())Toute la chaîne ascendante ! ✅

👉 dbt calcule un hash total à partir du modèle et de ses dépendances : c’est le full DAG hash.


🔍 Avantages

BénéficeDétail
✅ FiabilitéAucune modification (même indirecte) n’est ignorée
🎯 SélectivitéSeuls les modèles réellement affectés sont reconstruits
⚡ PerformanceTu évites les rebuilds inutiles
🔐 CohérenceTu assures que tous les résultats sont synchronisés avec la logique métier actuelle

✅ Résumé

La DAG hash comparison permet à dbt de détecter tous les modèles affectés par une modification, même si elle est indirecte.
Cela garantit une exécution fiable, ciblée et cohérente en production avec --select state:modified.


Leave a Reply

Your email address will not be published. Required fields are marked *