Skip to main content

Cuando los datasets crecen, ejecutar transformaciones completas en cada ejecución deja de ser eficiente.

Reprocesar millones o billones de filas cada vez implica:

  • Mayor consumo de cómputo
  • Más tiempo de ejecución
  • Costes innecesarios
  • Retrasos en pipelines

En dbt Labs, los modelos incrementales permiten procesar únicamente los nuevos datos o los registros modificados.

En arquitecturas modernas sobre Snowflake, esta estrategia es especialmente potente.

¿Qué es un modelo incremental?

Un modelo incremental es un modelo dbt que:

  • Se ejecuta completamente la primera vez
  • En ejecuciones posteriores, solo procesa datos nuevos o actualizados

Esto se define mediante:

{{ config(materialized=’incremental’) }}

 

Ejemplo básico

{{ config(materialized=’incremental’) }}

 

SELECT

    order_id,

    customer_id,

    total_amount,

    updated_at

FROM raw_orders

 

{% if is_incremental() %}

WHERE updated_at > (SELECT MAX(updated_at) FROM {{ this }})

{% endif %}

Cómo funciona:

  • En la primera ejecución → carga todo.
  • En ejecuciones posteriores → solo carga registros con updated_at mayor al máximo existente.

¿Qué hace is_incremental()?

is_incremental() es una macro interna que devuelve TRUE cuando:

  • El modelo ya existe.
  • El materialization es incremental.
  • No se está forzando full refresh.

Permite definir lógica condicional específica para ejecuciones incrementales.

Estrategias incrementales

1️⃣ Append (por defecto)

Agrega nuevos registros sin modificar existentes.

Útil cuando:

  • Los datos no cambian.
  • No existen updates históricos.

2️⃣ Merge (muy común en Snowflake)

Permite:

  • Insertar nuevos registros.
  • Actualizar registros existentes.

Ejemplo:

{{ config(

    materialized=’incremental’,

    unique_key=’order_id’

) }}

En Snowflake, dbt genera internamente un MERGE.

Ideal cuando:

  • Existen updates.
  • Se trabaja con Slowly Changing Dimensions.
  • Se reciben datos modificados.

Importancia de unique_key

Cuando usamos estrategia merge, debemos definir:

unique_key=’order_id’

Esto indica cómo identificar registros únicos para actualizar correctamente.

Sin unique_key, el modelo no puede hacer merge correctamente.

Ejemplo más robusto

{{ config(

    materialized=’incremental’,

    unique_key=’order_id’

) }}

 

SELECT

    order_id,

    customer_id,

    total_amount,

    updated_at

FROM raw_orders

 

{% if is_incremental() %}

WHERE updated_at > (

    SELECT COALESCE(MAX(updated_at), ‘1900-01-01’)

    FROM {{ this }}

)

{% endif %}

El uso de COALESCE evita errores en primera ejecución.

Ventajas en Snowflake

En Snowflake, los modelos incrementales son especialmente eficientes porque:

  • El cómputo es escalable.
  • Las micro-partitions optimizan lectura.
  • El MERGE está optimizado.
  • Se evita reprocesar tablas masivas.

El ahorro en costes puede ser significativo.

Casos de uso ideales

  • Tablas de eventos.
  • Logs.
  • Transacciones.
  • Tablas con timestamps confiables.
  • Integraciones CDC.

No todos los modelos deben ser incrementales.

Cuándo no usar incremental

Puede no ser recomendable cuando:

  • El dataset es pequeño.
  • La lógica requiere recalcular todo.
  • No existe columna de actualización confiable.
  • Hay dependencias complejas entre registros.

Forzar incremental en escenarios incorrectos puede generar inconsistencias.

Buenas prácticas

  • Siempre usar columna updated_at o equivalente.
  • Validar lógica con full refresh periódico.
  • Definir correctamente unique_key.
  • Monitorizar volumen procesado.
  • Documentar comportamiento incremental.

Full Refresh

Si necesitamos reconstruir completamente el modelo:

dbt run –full-refresh

Esto ignora la lógica incremental y recalcula todo.

Es útil en:

  • Cambios estructurales.
  • Ajustes de lógica.
  • Corrección de errores históricos.

Modelos incrementales y arquitectura moderna

En arquitecturas ELT sobre Snowflake:

  • La ingestión puede ser continua.
  • Los modelos intermedios pueden ser incrementales.
  • Los data marts pueden refrescarse parcialmente.

Esto permite pipelines más eficientes y escalables.

Errores comunes

  • No manejar correctamente is_incremental().
  • No definir unique_key.
  • No considerar registros actualizados.
  • Usar columnas no deterministas.
  • No probar escenarios edge cases.

La lógica incremental debe diseñarse cuidadosamente.

Conclusión

Los modelos incrementales en dbt son una herramienta fundamental para escalar transformaciones en entornos de gran volumen. Permiten reducir costes, mejorar tiempos de ejecución y optimizar pipelines.

En combinación con plataformas cloud como Snowflake, representan una estrategia eficiente y alineada con arquitecturas modernas de datos.

Sin embargo, su implementación debe ser rigurosa y basada en columnas de actualización confiables para garantizar consistencia.

Leave a Reply