Skip to content
About
Main content

The arithmetic that governs everything

Below what change fraction does incremental processing beat a full rebuild?

Before any capture mechanism, we ask whether incremental processing applies at all. It is a cost comparison.

  • Full recompute costs about S · c. S is the state size (rows). c is the per-row cost on a sequential scan, the cheapest access pattern that exists.
  • Incremental costs about Δ · S · c′ + F. Δ is the changed fraction (for example 0.02 = 2% of rows). c′ is the per-row cost of a random-access merge into existing state. F is a : tracking, state storage, metadata , capture infrastructure, and the human work of keeping all of it honest.

Two things follow immediately.

1. The merge penalty c′/c. You gave up scanning and bought seeking, rewriting and small-file churn. On an columnar substrate (files that cannot be edited), c′/c is commonly 10–100×, because touching one row rewrites its whole file. This is the same granularity mismatch we meet everywhere in storage: the unit you change (a row) is much smaller than the unit the medium can change (a file of 128 MB). So incremental processing stops winning long before Δ reaches 100%. The crossover is often somewhere in the 1–10% range, depending on how the underlying storage handles small mutations.

2. The fixed cost F does not shrink with Δ. : you pay the complexity and receive nothing. Most incremental pipelines that should never have been built are explained by someone ignoring F.

The break-even formula

Set the two costs equal: S·c = Δ·S·c′ + F. Solve for Δ:

the state size (rows)
the per-row cost on a sequential scan
the per-row cost of a random-access merge into existing state
the changed fraction
offset tracking, state storage, metadata commits, capture infrastructure, people
full rebuildincremental merge
Data table
Run time by changed fraction (500M rows, 2 µs scan, 40 µs merge, F = 0)
Changed fraction ΔseriesRun time
0.001full rebuild1,000 s
0.001full rebuild1,000 s
0.001full rebuild1,000 s
0.001full rebuild1,000 s
0.001full rebuild1,000 s
0.001full rebuild1,000 s
0.002full rebuild1,000 s
0.002full rebuild1,000 s
0.002full rebuild1,000 s
0.002full rebuild1,000 s
0.002full rebuild1,000 s
0.002full rebuild1,000 s
0.003full rebuild1,000 s
0.003full rebuild1,000 s
0.003full rebuild1,000 s
0.003full rebuild1,000 s
0.003full rebuild1,000 s
0.004full rebuild1,000 s
0.004full rebuild1,000 s
0.004full rebuild1,000 s
0.005full rebuild1,000 s
0.005full rebuild1,000 s
0.006full rebuild1,000 s
0.006full rebuild1,000 s
0.006full rebuild1,000 s
0.007full rebuild1,000 s
0.008full rebuild1,000 s
0.008full rebuild1,000 s
0.009full rebuild1,000 s
0.01full rebuild1,000 s
0.01full rebuild1,000 s
0.011full rebuild1,000 s
0.012full rebuild1,000 s
0.013full rebuild1,000 s
0.014full rebuild1,000 s
0.015full rebuild1,000 s
0.016full rebuild1,000 s
0.018full rebuild1,000 s
0.019full rebuild1,000 s
0.021full rebuild1,000 s
0.022full rebuild1,000 s
0.024full rebuild1,000 s
0.026full rebuild1,000 s
0.028full rebuild1,000 s
0.031full rebuild1,000 s
0.033full rebuild1,000 s
0.036full rebuild1,000 s
0.039full rebuild1,000 s
0.042full rebuild1,000 s
0.045full rebuild1,000 s
0.049full rebuild1,000 s
0.053full rebuild1,000 s
0.057full rebuild1,000 s
0.061full rebuild1,000 s
0.066full rebuild1,000 s
0.072full rebuild1,000 s
0.078full rebuild1,000 s
0.084full rebuild1,000 s
0.091full rebuild1,000 s
0.098full rebuild1,000 s
0.106full rebuild1,000 s
0.114full rebuild1,000 s
0.124full rebuild1,000 s
0.133full rebuild1,000 s
0.144full rebuild1,000 s
0.156full rebuild1,000 s
0.169full rebuild1,000 s
0.182full rebuild1,000 s
0.197full rebuild1,000 s
0.213full rebuild1,000 s
0.23full rebuild1,000 s
0.249full rebuild1,000 s
0.269full rebuild1,000 s
0.29full rebuild1,000 s
0.314full rebuild1,000 s
0.339full rebuild1,000 s
0.366full rebuild1,000 s
0.396full rebuild1,000 s
0.428full rebuild1,000 s
0.463full rebuild1,000 s
0.5full rebuild1,000 s
0.001incremental merge20 s
0.001incremental merge21.6 s
0.001incremental merge23.4 s
0.001incremental merge25.2 s
0.001incremental merge27.3 s
0.001incremental merge29.5 s
0.002incremental merge31.9 s
0.002incremental merge34.5 s
0.002incremental merge37.2 s
0.002incremental merge40.2 s
0.002incremental merge43.5 s
0.002incremental merge47 s
0.003incremental merge50.8 s
0.003incremental merge54.9 s
0.003incremental merge59.3 s
0.003incremental merge64.1 s
0.003incremental merge69.3 s
0.004incremental merge74.9 s
0.004incremental merge81 s
0.004incremental merge87.5 s
0.005incremental merge94.6 s
0.005incremental merge102 s
0.006incremental merge110 s
0.006incremental merge119 s
0.006incremental merge129 s
0.007incremental merge139 s
0.008incremental merge151 s
0.008incremental merge163 s
0.009incremental merge176 s
0.01incremental merge190 s
0.01incremental merge206 s
0.011incremental merge222 s
0.012incremental merge240 s
0.013incremental merge260 s
0.014incremental merge281 s
0.015incremental merge303 s
0.016incremental merge328 s
0.018incremental merge354 s
0.019incremental merge383 s
0.021incremental merge414 s
0.022incremental merge447 s
0.024incremental merge483 s
0.026incremental merge522 s
0.028incremental merge565 s
0.031incremental merge610 s
0.033incremental merge659 s
0.036incremental merge713 s
0.039incremental merge770 s
0.042incremental merge833 s
0.045incremental merge900 s
0.049incremental merge972 s
0.053incremental merge1,050 s
0.057incremental merge1,140 s
0.061incremental merge1,230 s
0.066incremental merge1,330 s
0.072incremental merge1,430 s
0.078incremental merge1,550 s
0.084incremental merge1,680 s
0.091incremental merge1,810 s
0.098incremental merge1,960 s
0.106incremental merge2,110 s
0.114incremental merge2,290 s
0.124incremental merge2,470 s
0.133incremental merge2,670 s
0.144incremental merge2,890 s
0.156incremental merge3,120 s
0.169incremental merge3,370 s
0.182incremental merge3,640 s
0.197incremental merge3,940 s
0.213incremental merge4,250 s
0.23incremental merge4,600 s
0.249incremental merge4,970 s
0.269incremental merge5,370 s
0.29incremental merge5,810 s
0.314incremental merge6,270 s
0.339incremental merge6,780 s
0.366incremental merge7,330 s
0.396incremental merge7,920 s
0.428incremental merge8,560 s
0.463incremental merge9,250 s
0.5incremental merge10,000 s

Read it in two steps. The factor c/c′ is the reciprocal of the . The factor (1 − F/(S·c)) is a discount for the fixed cost.

So with a 20× merge penalty the crossover sits near 5%. A table where a fifth of the rows change daily should probably just be rebuilt. This is exactly Tariq's drivers table.

The claim "incremental is more efficient" is folklore in this form. The defensible version is:

That trade is only good when state is large, change is small, and the constant is spread over many runs.