Cómo hacer una carga incremental en ELT: paso a paso
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,MERGEyUPDATE. - 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:

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_watermarkavanzó 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
MERGEno 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?