dbt: comment dbt sait quels modèles doivent être réexécutés ?

🧱 Contexte : comment dbt sait quels modèles doivent être réexécutés ?

Quand tu fais un dbt run --state, dbt compare l’état actuel des modèles avec un état précédent (stocké dans un manifest.json) pour savoir :

  • si le code SQL d’un modèle a changé
  • si ses configurations ont changé (ex: materialized, tags)
  • si une dépendance amont a été modifiée (ex: un ref())

👉 Cette logique s’appelle la comparaison d’état (state comparison)


🎯 Objectif du DAG hash comparison

DAG = Directed Acyclic Graph = graphe des dépendances entre modèles dbt.

La full DAG hash comparison signifie que dbt regarde non seulement :

  • les changements directs dans un modèle (ex: SELECT * FROM ...)
  • mais aussi les changements en amont, dans toute sa chaîne de dépendances

🧪 Exemple illustratif

1. Imaginons ce DAG :

nginxCopierModifierstg_ventes     →   int_chiffre_affaire   →   fct_revenus
  • fct_revenus dépend de int_chiffre_affaire
  • int_chiffre_affaire dépend de stg_ventes

2. Tu modifies stg_ventes.sql (ex: tu changes un alias de colonne)

✅ Grâce à full DAG hash comparison, dbt détecte que :

  • stg_ventes a changé (normal)
  • int_chiffre_affaire est impacté indirectement
  • fct_revenus aussi → donc il faut tout reconstruire jusque là

🔄 Sans DAG hash, dbt pourrait ne voir que stg_ventes comme “modifié”.


🧠 Comment dbt fait techniquement ?

Chaque modèle a un “hash de contenu” calculé à partir de :

  • son SQL compilé
  • ses config()
  • ses meta, tags, etc.
  • et le hash de tous les modèles qu’il référence (ref, source, macro)

➡️ C’est ce qu’on appelle le full DAG hash.


📦 Commande dbt concernée

bashCopierModifierdbt run --select state:modified --state path/to/previous/manifest
  • dbt compare le manifest.json courant avec celui dans --state
  • tous les modèles dont le DAG hash a changé sont sélectionnés

✅ Avantages

AvantageDescription
🔍 Détection préciseAucun modèle indirectement impacté n’est oublié
⏱️ Optimisationdbt ne reconstruit que ce qui a vraiment changé
🧠 ConfianceRésultat cohérent avec la chaîne de dépendance complète
✅ Compatible CI/CDTu peux automatiser des builds partiels mais fiables

⚠️ Bonnes pratiques

  • toujours sauvegarder ton manifest.json dans un dossier versionné ou dans ton pipeline CI
  • utiliser dbt run --select state:modified avec intelligence (pas juste dbt run complet)
  • combiner avec des tags ou selectors si besoin

✅ Résumé

La full DAG hash comparison dans dbt est la méthode la plus fiable pour détecter tous les modèles impactés (directement ou non) par un changement.
Elle garantit une reconstruction cohérente, efficace et sans oubli, tout en évitant les exécutions inutiles.

Leave a Reply

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