🧠 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 leconfig) - Tu n’as pas touché à
fct_clients.sqldirectement - Pourtant,
fct_clientsdépend indirectement destg_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 hash | Exemple |
|---|---|
| SQL compilé | Le SELECT final |
config() | Matérialisation, tags, etc. |
meta, docs, etc. | Documentation liée |
| Macros utilisées | si 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éfice | Détail |
|---|---|
| ✅ Fiabilité | Aucune modification (même indirecte) n’est ignorée |
| 🎯 Sélectivité | Seuls les modèles réellement affectés sont reconstruits |
| ⚡ Performance | Tu évites les rebuilds inutiles |
| 🔐 Cohérence | Tu 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.