dbt

Senior

¿Cómo evito que cada CI reconstruya todo mi proyecto dbt?

dbt construye todo por defecto. La selección basada en estado es lo único que hace que el costo de CI escale con lo que realmente cambió, no con cuánto ha crecido el proyecto.

Leer en:
Build completa state:modified+ Solo modelos cambiados
Aproximadamente cómo se reduce el alcance del build de CI al añadir selección por estado - no un benchmark medido.

Un proyecto dbt con 40 modelos y otro con 400 ejecutan exactamente el mismo dbt build - y pagan facturas de CI muy distintas por ello, a menos que algo le diga a dbt qué cambió.

Qué compara realmente la selección basada en estado

dbt escribe un manifest.json después de cada ejecución exitosa, que describe por completo el SQL compilado de cada modelo y su lugar en el DAG. --select state:modified+ compara el manifest actual contra uno guardado que usted indica, y construye solo los modelos cuyo SQL compilado realmente cambió, más todo lo que depende de ellos aguas abajo.

# --state apunta al manifest de ayer, no al de hoy dbt build --select state:modified+ --state ./prod-manifest

Por qué esto silenciosamente nunca se activa

La razón más común por la que la selección por estado no hace nada: CI nunca guardó ni descargó el manifest de la ejecución anterior, así que --state no tiene con qué comparar. dbt no da error por esto - simplemente no puede encontrar modelos modificados respecto a nada, y la build hace todo en silencio. Arreglarlo significa tratar manifest.json como un artefacto de CI que se sube después de cada ejecución de producción exitosa y se descarga al inicio de la siguiente.

El otro asesino silencioso: el hábito del full-refresh

Una bandera --full-refresh dejada en el comando de CI "por si acaso" reconstruye cada modelo incremental desde cero sin importar lo que haya encontrado la selección por estado - ignora el diff por completo para esos modelos. Ese valor por defecto suele ser un resto de haber depurado un modelo incremental roto alguna vez, nunca eliminado. Reserve --full-refresh para una ejecución explícita y deliberada sobre un modelo, no como bandera fija de CI.

La señal: si el tiempo de build de CI escala con el tamaño total del proyecto en vez del tamaño del diff del PR, la selección por estado no está funcionando realmente - revise primero un manifest faltante en --state, luego un --full-refresh colado.

Vea cómo se ve esto en su propio pipeline.

Suba un event log real de Spark, un run_results.json de dbt o una exportación de métricas de Flink y obtenga recomendaciones concretas, que debe aprobar antes de aplicar - no otra regla general.