dbt

Senior

Como faço o CI parar de reconstruir todo o projeto dbt a cada execução?

O dbt constrói tudo por padrão. A seleção baseada em estado é o único jeito de fazer o custo do CI escalar com o que realmente mudou, não com o tamanho do projeto.

Ler em:
Build completa state:modified+ Só modelos mudados
Aproximadamente como o escopo da build de CI diminui ao adicionar seleção por estado - não é um benchmark medido.

Um projeto dbt com 40 modelos e outro com 400 rodam exatamente o mesmo dbt build - e pagam contas de CI bem diferentes por isso, a menos que algo realmente diga ao dbt o que mudou.

O que a seleção baseada em estado realmente compara

O dbt grava um manifest.json após cada execução bem-sucedida, que descreve totalmente o SQL compilado de cada modelo e seu lugar no DAG. --select state:modified+ compara o manifest atual com um salvo que você aponta, e constrói só os modelos cujo SQL compilado realmente mudou, mais tudo que depende deles adiante.

# --state aponta pro manifest de ontem, não o de hoje dbt build --select state:modified+ --state ./prod-manifest

Por que isso silenciosamente nunca entra em ação

A razão mais comum pela qual a seleção por estado não faz nada: o CI nunca salvou nem baixou o manifest da execução anterior, então --state não tem com o que comparar. O dbt não dá erro nisso - simplesmente não consegue achar modelos modificados em relação a nada, e a build silenciosamente faz tudo. Consertar isso significa tratar o manifest.json como um artefato de CI que é enviado após cada execução de produção bem-sucedida e baixado no início da próxima.

O outro assassino silencioso: o hábito do full-refresh

Uma flag --full-refresh deixada no comando de CI "por segurança" reconstrói cada modelo incremental do zero, não importa o que a seleção por estado tenha encontrado - ela ignora o diff completamente para esses modelos. Esse padrão geralmente é resto de ter depurado um modelo incremental quebrado uma vez, nunca removido. Reserve o --full-refresh para uma execução explícita e deliberada em um modelo, não como flag fixa do CI.

O sinal: se o tempo de build do CI escala com o tamanho total do projeto em vez do tamanho do diff do PR, a seleção por estado não está realmente funcionando - verifique primeiro um manifest faltando em --state, depois um --full-refresh perdido por aí.

Veja como isso fica no seu próprio pipeline.

Envie um event log real do Spark, um run_results.json do dbt ou uma exportação de métricas do Flink e receba recomendações concretas, para aprovar antes de aplicar - não mais uma regra geral.