Modern data systems process increasingly large datasets. A pipeline that works efficiently with 10 million rows may become slow and expensive when it has to process billions of records every day.
One solution is incremental data processing.
Instead of processing an entire dataset every time a pipeline runs, incremental processing identifies and handles only the data that is new, changed, or otherwise relevant since the previous run.
This approach can dramatically reduce processing time, compute requirements, storage I/O, and pipeline costs.
In this guide, you’ll learn what incremental data processing is, how it works, the most common implementation strategies, and when to use techniques such as timestamps, change data capture, watermarks, and upserts.
What is Incremental Data Processing
Incremental data processing means processing only the records that have been added or changed since the last successful processing operation instead of reprocessing the entire dataset.
Common approaches include:
- Timestamp-based processing
- Change Data Capture (CDC)
- Watermarks
- Incremental SQL models
- Log-based processing
- Upserts and merges
- Partition-based processing
Full Processing vs Incremental Processing
Imagine a database contains 1 billion customer transactions.
A traditional pipeline might run:
1 billion records
↓
Extract
↓
Transform
↓
Load
If only 100,000 new transactions arrived, processing all 1 billion records again is wasteful.
An incremental pipeline instead does:
1 billion existing records
+
100,000 new records
↓
Process 100,000 records
↓
Update destination
The difference becomes enormous as data grows.
Why Incremental Processing Matters
Incremental processing can provide:
Faster Pipelines
Fewer records need to be read and transformed.
Lower Compute Costs
Cloud data processing is often usage-based. Processing fewer records can reduce costs.
Lower Storage I/O
The pipeline reads and writes less data.
More Frequent Updates
Pipelines can run more frequently because each execution requires less work.
Better Scalability
Incremental workloads remain manageable as datasets grow.
A Basic Incremental Pipeline
A simple architecture looks like:
Source Database
↓
Identify New/Changed Data
↓
Incremental Processing
↓
Transform
↓
Destination
The most important part is determining:
Which records need to be processed?
This is called the incremental boundary.
1. Timestamp-Based Incremental Processing
One of the simplest approaches is using a timestamp column.
Suppose a table contains:
id | customer | updated_at
The pipeline records the last successful timestamp:
last_processed = 2026-08-16 23:00:00
The next query retrieves only newer records:
SELECT *
FROM customers
WHERE updated_at > '2026-08-16 23:00:00';
The pipeline then processes those records.
Advantages
- Simple to implement
- Easy to understand
- Works with many databases
- Efficient for append-heavy datasets
Limitations
It depends on the timestamp being reliable.
Problems can occur when:
- Timestamps are missing
- Records are updated without changing the timestamp
- Clocks differ between systems
- Late-arriving records appear
2. Change Data Capture
Change Data Capture (CDC) tracks changes made to a source database.
Instead of periodically asking:
“What changed?”
the pipeline consumes a stream of changes.
These may include:
INSERT
UPDATE
DELETE
A CDC pipeline can look like:
Database
↓
Transaction Log
↓
CDC System
↓
Event Stream
↓
Data Pipeline
↓
Warehouse / Lakehouse
CDC is especially useful when data changes frequently.
3. Log-Based CDC
Many databases maintain transaction logs.
A CDC system can read these logs and identify database changes.
For example:
10:01 INSERT customer 100
10:02 UPDATE customer 101
10:03 DELETE customer 102
Instead of scanning the entire table, the pipeline consumes the changes.
This can be much more efficient for large operational databases.
4. Watermarks
A watermark represents the point up to which a pipeline has successfully processed data.
For example:
Processed:
08:00
08:05
08:10
08:15
The watermark becomes:
08:15
The next processing window starts after that point.
Watermarks are particularly important in streaming systems.
Event-Time Watermarks
Streaming systems often distinguish between:
- Processing time
- Event time
Suppose an event occurred at 10:00 but arrived at 10:07.
Event Time: 10:00
Arrival Time: 10:07
An event-time watermark helps the system determine how long it should wait for late events before considering a time window sufficiently complete.
5. Incremental Processing With IDs
Another approach is using monotonically increasing IDs.
For example:
transaction_id
1001
1002
1003
1004
The pipeline remembers:
last_id = 1004
Then retrieves:
SELECT *
FROM transactions
WHERE transaction_id > 1004;
This is simple and efficient when IDs are strictly increasing and records are append-only.
Limitation
This approach can miss updates to older records.
For example:
transaction_id = 1001
could be updated after the pipeline has already processed it.
6. Incremental Processing With Upserts
An upsert means:
Update the record if it exists; otherwise insert it.
Suppose the source contains:
customer_id | name | status
101 | John | Active
Later:
customer_id | name | status
101 | John | Inactive
The destination needs to update customer 101 rather than create a duplicate.
Conceptually:
Incoming Record
↓
Does Key Exist?
┌──┴──┐
Yes No
↓ ↓
Update Insert
Upserts are fundamental to many incremental pipelines.
7. MERGE Statements
Many analytical databases support MERGE.
For example:
MERGE INTO target AS t
USING source AS s
ON t.customer_id = s.customer_id
WHEN MATCHED THEN
UPDATE SET
name = s.name,
status = s.status
WHEN NOT MATCHED THEN
INSERT (customer_id, name, status)
VALUES (s.customer_id, s.name, s.status);
This allows changed records to be updated while new records are inserted.
8. Incremental Processing in dbt
Modern analytics teams often implement incremental transformations using dbt.
A full model might process:
SELECT *
FROM orders;
An incremental model can restrict processing to recent records:
SELECT *
FROM orders
{% if is_incremental() %}
WHERE updated_at > (
SELECT MAX(updated_at)
FROM {{ this }}
)
{% endif %}
This can dramatically reduce the amount of data transformed during subsequent runs.
9. Partition-Based Incremental Processing
Large datasets are often partitioned by:
- Date
- Month
- Region
- Event type
For example:
sales/
├── year=2024/
├── year=2025/
└── year=2026/
If only today’s data has changed, the pipeline can process:
year=2026/month=08/day=17
instead of scanning the entire dataset.
This technique is known as partition pruning when the query engine avoids reading irrelevant partitions.
10. Incremental File Processing
Data lakes often receive files continuously.
For example:
incoming/
├── orders_001.parquet
├── orders_002.parquet
├── orders_003.parquet
The pipeline can maintain a record of processed files.
File Arrives
↓
Already Processed?
┌──┴──┐
Yes No
↓ ↓
Skip Process
This is simple but requires reliable tracking.
11. Incremental Processing for APIs
Incremental processing is also useful when extracting data from APIs.
An API might provide:
?page=1
?page=2
?page=3
or allow filtering by modification date:
updated_after=2026-08-16
The pipeline can store the last successful extraction point and request only newer records.
This reduces:
- API calls
- Network traffic
- Processing time
- Rate-limit pressure
Handling Late-Arriving Data
One of the biggest challenges in incremental processing is late data.
Suppose a pipeline processes:
00:00–01:00
01:00–02:00
but an event from 00:45 arrives at 02:15.
A strict timestamp filter might miss it.
One solution is to use a lookback window.
Instead of processing only data after the last timestamp:
WHERE updated_at > last_processed
process a small overlap:
WHERE updated_at > last_processed - INTERVAL '2 hours'
Duplicates can then be removed using an idempotent merge.
Idempotent Incremental Processing
An incremental pipeline should ideally be idempotent.
This means running the same processing operation multiple times should not produce incorrect duplicate results.
For example:
Run 1 → 1,000 records
Run 2 → Same 1,000 records
The destination should remain correct rather than becoming:
2,000 records
Idempotency is especially important when pipelines retry after failures.
Checkpoints
A checkpoint records how far the pipeline has successfully progressed.
For example:
Checkpoint:
transaction_id = 500000
After a successful run:
Checkpoint:
transaction_id = 525000
If the pipeline fails during processing:
Read Checkpoint
↓
Resume
This prevents unnecessary full reprocessing.
Incremental Processing and Streaming
Incremental processing isn’t limited to batch pipelines.
Streaming systems naturally process data incrementally:
Event 1 → Process
Event 2 → Process
Event 3 → Process
Event 4 → Process
Instead of waiting for the entire dataset, each event or micro-batch is processed as it arrives.
This enables near-real-time applications such as:
- Fraud detection
- IoT monitoring
- Recommendation systems
- Real-time analytics
- Operational dashboards
Batch vs Micro-Batch vs Streaming
| Approach | Processing Frequency | Typical Use |
|---|---|---|
| Full Batch | Hours / days | Historical workloads |
| Incremental Batch | Minutes / hours | Warehouses |
| Micro-Batch | Seconds / minutes | Near-real-time analytics |
| Streaming | Continuous | Real-time systems |
Incremental processing can therefore exist at several levels of latency.
Incremental Processing Architecture
A modern architecture might look like:
Source Systems
↓
CDC / Events
↓
Message Broker
↓
Incremental Processing
↓
┌────────┴────────┐
↓ ↓
Data Lake Data Warehouse
↓ ↓
Analytics BI / ML
The important characteristic is that downstream systems process changes rather than repeatedly rebuilding everything.
Incremental Processing vs Full Refresh
| Feature | Full Refresh | Incremental |
|---|---|---|
| Data processed | Entire dataset | New/changed data |
| Runtime | Usually higher | Usually lower |
| Compute cost | Higher | Lower |
| Implementation | Simpler | More complex |
| Handles updates | Naturally | Requires strategy |
| Handles deletes | Naturally | Requires strategy |
| Recovery | Simple | Requires checkpoints |
| Scalability | Limited | Better |
Full refreshes are still useful.
For small datasets, rebuilding everything can be simpler and safer.
When Should You Use Incremental Processing?
Incremental processing is particularly useful when:
- Data volumes are large
- Only a small portion changes between runs
- Pipelines run frequently
- Processing is expensive
- Source systems support CDC
- Data has reliable timestamps or sequence IDs
For small datasets, incremental complexity may not be worth it.
When Full Refresh Is Better
A full refresh can be preferable when:
- The dataset is small
- Source data changes unpredictably
- Historical corrections are common
- Incremental boundaries are unreliable
- Simplicity is more important than performance
Sometimes:
10,000 rows × Full Refresh
is better than building a complicated incremental system.
Common Incremental Processing Mistakes
Using Only Creation Time
A record can be updated after it was created.
Always consider whether you need an updated_at field or CDC.
Ignoring Deletes
Incremental pipelines often capture inserts and updates but forget deletions.
CDC or explicit deletion tracking can solve this.
Not Handling Late Data
Strict watermarks can miss delayed events.
Lookback windows and replay strategies can help.
Creating Duplicates
Retries can cause duplicate records if the pipeline isn’t idempotent.
Updating the Checkpoint Too Early
The checkpoint should only advance after the relevant data has been successfully processed.
Assuming IDs Always Increase
An increasing ID can identify new rows but doesn’t necessarily capture updates.
Best Practices
Use Reliable Change Indicators
Prefer:
- CDC
- Transaction logs
- Reliable update timestamps
- Sequence numbers
Design for Retries
Failures happen. Make rerunning a processing window safe.
Track Checkpoints
Store the latest successfully processed position.
Handle Deletes Explicitly
Don’t assume that missing records mean nothing changed.
Use Lookback Windows
Allow a small overlap to capture late-arriving data.
Validate Incremental Results
Monitor:
- Row counts
- Duplicate rates
- Missing records
- Processing latency
- Data freshness
Keep Periodic Reconciliation
Even reliable incremental pipelines can drift.
Periodically compare the destination with the source to identify discrepancies.
Monitoring an Incremental Pipeline
A useful monitoring dashboard can track:
Records Processed
Records Inserted
Records Updated
Records Deleted
Processing Time
Pipeline Lag
Watermark
Error Rate
Duplicate Rate
For example:
Watermark: 2026-08-17 18:00
Records Processed: 2.4M
Inserted: 1.8M
Updated: 550K
Deleted: 50K
Lag: 4 minutes
These metrics provide visibility into pipeline health.
Incremental data processing allows data systems to scale by processing only the information that has changed rather than repeatedly processing entire datasets.
Techniques such as timestamps, CDC, watermarks, sequence IDs, partition pruning, upserts, and MERGE operations provide different ways to identify and process changes.
However, efficient incremental processing requires more than simply filtering new rows. Production pipelines must also handle late-arriving data, updates, deletes, retries, duplicates, checkpoints, and data validation.
The best incremental pipelines are therefore designed around three principles:
Process only what changed. Make retries safe. Never lose or duplicate data.
When implemented correctly, incremental processing can transform slow, expensive data pipelines into systems capable of handling continuously growing datasets efficiently.
FAQ
What is incremental data processing?
Incremental data processing handles only new or changed data instead of processing the entire dataset during every pipeline run.
What is the difference between incremental and full processing?
Full processing reprocesses the complete dataset, while incremental processing identifies and processes only records that have changed since the previous successful run.
What is the best way to implement incremental processing?
There is no single best method. CDC is powerful for frequently changing databases, while timestamps, sequence IDs, and partition-based processing can work well for simpler workloads.
How does CDC help incremental processing?
Change Data Capture identifies inserts, updates, and deletes from a source system, allowing downstream pipelines to process changes without repeatedly scanning the entire source table.
What is a watermark in data processing?
A watermark represents the point up to which a pipeline or streaming system has successfully processed data.
How do incremental pipelines handle late-arriving data?
Common approaches include lookback windows, event-time watermarks, replaying processing windows, and idempotent upserts.
Can incremental processing handle deleted records?
Yes, but deletions must be explicitly captured. CDC, deletion flags, tombstone events, or periodic reconciliation can be used to detect removed records.
Is incremental processing always better than a full refresh?
No. For small datasets or unreliable source systems, a full refresh can be simpler, safer, and fast enough. Incremental processing provides the greatest benefit when datasets are large and only a small portion changes between runs.