🧱 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 deint_chiffre_affaire
int_chiffre_affaire
dépend destg_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é indirectementfct_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
Avantage | Description |
---|---|
🔍 Détection précise | Aucun modèle indirectement impacté n’est oublié |
⏱️ Optimisation | dbt ne reconstruit que ce qui a vraiment changé |
🧠 Confiance | Résultat cohérent avec la chaîne de dépendance complète |
✅ Compatible CI/CD | Tu 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 justedbt 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.