(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa
ELT

Cómo hacer una carga incremental en ELT: paso a paso

João Barros 04 de July de 2026 5 min de lectura

Las cargas incrementales son el secreto para mantener un pipeline de ELT rápido y económico: en lugar de recargar millones de registros cada noche, procesas solo las filas que cambiaron desde la última ejecución. Las recargas totales desperdician tiempo y cómputo, y empeoran a medida que los datos crecen. El patrón de watermark (marca de agua) combinado con una instrucción MERGE resuelve el problema de forma sencilla e intemporal — y funciona en SQL Server, Azure SQL, Azure Synapse o en el Warehouse de Microsoft Fabric.

Requisitos previos

  • Una tabla de origen con una columna de fecha de modificación (por ejemplo, data_modificacao) o un ID siempre creciente.
  • Un destino SQL donde transformar los datos (SQL Server, Azure SQL, Synapse o Fabric Warehouse).
  • Permisos para crear tablas y ejecutar INSERT, MERGE y UPDATE.
  • Nociones básicas de SQL y, más adelante, una herramienta de orquestación para programarlo.

Paso 1: Crear la tabla de control (watermark)

El watermark es simplemente el valor más alto ya procesado, normalmente una fecha/hora. Lo guardamos en una pequeña tabla de control para que cada ejecución sepa exactamente dónde se detuvo la anterior. Crea la tabla una sola vez y registra un valor inicial bajo, para que la primera carga traiga el historial completo:

Cómo hacer una carga incremental en ELT: paso a paso
CREATE TABLE dbo.controlo_carga (
    tabela_origem    VARCHAR(128) NOT NULL PRIMARY KEY,
    ultimo_watermark DATETIME2    NOT NULL
);

-- Valor inicial baixo para a 1a carga trazer todo o historico
INSERT INTO dbo.controlo_carga (tabela_origem, ultimo_watermark)
VALUES ('vendas', '1900-01-01');

Paso 2: Leer el watermark actual

Al inicio de cada ejecución, lee el valor guardado. Se convierte en el límite inferior de tu ventana de datos: solo queremos filas más recientes que él. Guárdalo en una variable para reutilizarlo en los pasos siguientes.

DECLARE @watermark DATETIME2;

SELECT @watermark = ultimo_watermark
FROM dbo.controlo_carga
WHERE tabela_origem = 'vendas';

Paso 3: Extraer y cargar (E + L) las filas nuevas

En ELT, primero llevamos los datos en bruto a un área de staging y solo después los transformamos — esto es lo que distingue ELT de ETL. Extrae únicamente las filas modificadas desde el watermark y cárgalas en una tabla de staging. Así reduces drásticamente el volumen transferido y la carga se mantiene rápida, incluso en tablas con millones de registros.

-- Limpa a staging da execucao anterior
TRUNCATE TABLE stg.vendas;

-- Carrega so o que mudou desde o watermark
INSERT INTO stg.vendas (id_venda, cliente, total, data_modificacao)
SELECT id_venda, cliente, total, data_modificacao
FROM origem.vendas
WHERE data_modificacao > @watermark;
Elige una columna de watermark fiable: debe aumentar siempre que una fila se crea o se modifica. Una data_modificacao actualizada por la aplicación o por un trigger es ideal.

Paso 4: Transformar con MERGE (upsert)

Ahora aplicamos la transformación dentro del destino, aprovechando su capacidad de cómputo. MERGE hace un upsert: actualiza las filas que ya existen e inserta las nuevas, todo en una sola instrucción y en una sola pasada por los datos. Es el corazón de una carga incremental y evita duplicados.

MERGE INTO dw.vendas AS destino
USING stg.vendas AS origem
    ON destino.id_venda = origem.id_venda
WHEN MATCHED THEN
    UPDATE SET destino.cliente = origem.cliente,
               destino.total   = origem.total,
               destino.data_modificacao = origem.data_modificacao
WHEN NOT MATCHED BY TARGET THEN
    INSERT (id_venda, cliente, total, data_modificacao)
    VALUES (origem.id_venda, origem.cliente, origem.total, origem.data_modificacao);

Paso 5: Actualizar el watermark

Para que la próxima ejecución empiece exactamente donde terminó esta, guarda el valor máximo de data_modificacao que acabas de procesar. Usa la tabla de staging como fuente y protégete contra ejecuciones vacías, para nunca adelantar la marca más allá de los datos que no cargaste.

UPDATE c
SET c.ultimo_watermark = (SELECT MAX(data_modificacao) FROM stg.vendas)
FROM dbo.controlo_carga AS c
WHERE c.tabela_origem = 'vendas'
  AND EXISTS (SELECT 1 FROM stg.vendas);

Verificar el resultado

Confirma que la carga funcionó con tres comprobaciones simples:

  • Compara los recuentos: SELECT COUNT(*) FROM dw.vendas; debe reflejar los registros esperados.
  • Consulta la tabla de control y confirma que ultimo_watermark avanzó a la fecha más reciente.
  • Ejecuta el pipeline una segunda vez sin cambiar datos en el origen: el staging debe quedar vacío y el MERGE no debe cambiar ninguna fila. Es la prueba de que la carga es realmente incremental e idempotente.

Conclusión

Con una tabla de control, un filtro por watermark y un MERGE, convertiste una carga total pesada en una carga incremental ligera y repetible. A partir de aquí, programa el proceso (por ejemplo, con Azure Data Factory o un pipeline de Microsoft Fabric), añade logs para saber cuántas filas se procesaron en cada ejecución y gestiona las eliminaciones en el origen con una columna de soft delete. ¿Cuál será la primera tabla de tu modelo que migrarás a cargas incrementales?

Compartir: