The 16.22% Reindex Break-Even Is Not Your Number
Before you build an incremental indexing pipeline, price one full reindex. That number gives you a threshold. If the chunks you rewrite in a single run exceed it, incremental indexing costs more than reindexing everything.
The 16.22% in the title belongs to an organization that has a parse cache and bulk import but no embedding cache. Drop either of the first two and the threshold climbs into the 50% or 90% range; add an embedding cache and it falls into the 3% range. Change the embedding price and it moves again. This post closes that value into three ratios and shows you how to read all three off a vendor price list.
Analogy
Picture a library maintaining a card catalog. Every time a book changes, the cards have to be remade.
- A scribe reads the book and copies it into a manuscript. That is document parsing. It bills per page and it is the most expensive of the four steps
- The manuscript goes into a warehouse. That is the parse cache. If the book did not change, there is no reason to call the scribe again
- The manuscript is cut into card-sized pieces. That is chunking. It costs nothing
- Each card gets subject coordinates written on it. That is embedding. A machine does it and bills by character count
- The cards go into drawers. Sliding one into an empty drawer (a new write), pulling an old card and putting one in its place (an overwrite), and wheeling in a whole new cabinet (bulk import) all cost different amounts
A new cabinet can only be wheeled in empty. You cannot stack it on top of a cabinet that already holds cards. So the job of swapping only the changed cards cannot use the price of replacing the whole cabinet. When cards are purely added you slide into an empty drawer once; when you replace an old card you go twice, pulling and inserting. That difference is what this post measures.
Card drawers cost nothing to search, but a vector database bills for queries too. This post covers indexing cost only, not query cost.
Parsing Costs 656× Bulk Import, and It Is the One Step You Can Skip
The unit of calculation is one million chunks. Multiply by your chunk count to get your corpus’s usage. Parsing splits its rate at one million pages per month, though, and your invoice carries a plan minimum on top of that.
Fix the assumptions first.
| Symbol | Value | Basis |
|---|---|---|
| T tokens per page | 500 | assumed |
| C chunk size | 512 tokens | assumed |
| V chunk overlap | 64 tokens | assumed |
| chunk-to-record mapping | 1 chunk = 1 vector DB record | assumed. Chunk share and record share become the same number |
| embedding model | text-embedding-3-small, 1536 dimensions | OpenAI embeddings docs, accessed 2026-08-24 |
| vector bytes | 1536 × 4 B = 6,144 B | Pinecone cost docs, accessed 2026-08-25 |
| ID and metadata | 2,048 B | assumed |
| record size | 8,192 B = 8.192 KB | sum of the two above |
| unit convention | 1 KB = 1,000 B, 1 GB = 10⁹ B | Pinecone’s docs never state it, but their worked examples are decimal. See the key callout below |
Of these, T, C, V, and metadata size are assumptions. When you have a parse cache and no embedding cache, the two that move the threshold are C and metadata size; T and V cancel between numerator and denominator and do not shift it by a single digit. Without a parse cache, parsing attaches per page, so T and V enter the threshold too. With both a parse cache and an embedding cache, the threshold collapses to c alone and none of the four move it.
All four always move the total when you count your corpus in pages.
Three values derive from the assumptions.
net gain per chunk = C − V = 448 tokens
chunks per page = T ÷ (C − V) = 500 / 448 = 1.116071
pages per chunk = (C − V) ÷ T = 448 / 500 = 0.896
embedding tokens / page = T ÷ (C − V) × C = 1.116071 × 512 = 571.4286
Overlap means you embed 1.1429× more tokens than the source contains. Push overlap to 128 and it becomes 1.3333×. Overlap inflates the per-page invoice but leaves the per-chunk rate untouched.
Here is what each operation costs per million chunks.
| Operation | Formula | Rate | vs. bulk import | Source |
|---|---|---|---|---|
| document parsing | 896,000 pages × $1.50/1,000 | $1,344.000 | 656.250× | Textract pricing, accessed 2026-08-24 |
| write · overwrite | 16.384 WU/record × $4.00/1M WU | $65.536 | 32.000× | Pinecone cost docs, accessed 2026-08-25 |
| write · new | 8.192 WU/record × $4.00/1M WU | $32.768 | 16.000× | same source |
| embedding | 512M tokens × $0.02/1M | $10.240 | 5.000× | OpenAI pricing, accessed 2026-08-24 |
| write · bulk import | 8.192 GB × $0.25/GB | $2.048 | 1.000× | Pinecone pricing, accessed 2026-08-24 |
| chunking | local string processing | $0 | n/a | nothing billed externally |
Parsing is the expensive one. That rate covers the first million pages per month; past that it is $0.60/1,000, so the parsing row converges toward $537.60 as the excess volume grows. In either band, parsing exceeds the $110.592 of everything else combined.
Parsing can be skipped whenever the source document has not changed. If the chunk text is unchanged, embedding can be skipped the same way; chunking and writing cannot. The embedding-skipping path is carried all the way to the threshold by the closed-form callout below.
Take out the scribe, and take out the free scissors work, and four bars remain.
Embedding rates span 10×, from $0.02 to $0.20 (OpenAI $0.02, Gemini $0.20, both accessed 2026-08-24). This post uses the low end, which shrinks the embedding term and lowers the threshold — a direction that favors full reindexing. The high-end result is in the sensitivity table.
Key
Writing the same record has three prices. Pinecone's docs say an upsert "uses 1 WU for each 1 KB of the request, with a minimum of 5 WUs per request," and that when you modify an existing record, "the request uses 1 WU for each 1 KB of the existing record as well."
So writing into an empty namespace costs 8.192 WU, and swapping an existing record costs 16.384 WU. Bulk import bills at $0.25/GB, equivalent to 0.512 WU per record (at the $4.00 WU rate). A full reindex can pick any of the three if the plan supports bulk import; incremental indexing is the one that cannot use bulk import, so it pays one of the other two. The add-only pipeline is the 8.192 WU case, and the sensitivity table has both rows.
How many bytes that 1 KB means is never stated in prose. The upsert example table states it. All five rows of "average record size" (four distinct values) work only in decimal. The row with 1024 dimensions and 15,000 B of metadata has a record of 1024 × 4 B + 15,000 B = 19,096 B, and 19,096 ÷ 1,000 = 19.096 becomes the table's 19.10 KB. In binary it would be 18.648, printed as 18.65 KB. The WU on that same row is 10 × 19.10 = 191 exactly, so there is no per-record rounding either. (Pinecone cost docs, accessed 2026-08-25)
At the Same Change Rate, the Parse Cache and the Load Path Flip the Answer
Pinecone’s docs state, “You can’t import data into an existing namespace” (import docs, accessed 2026-08-24). Bulk import only goes into an empty namespace. A full reindex that loads everything into a new namespace and then repoints the application can use that path; incremental indexing, which swaps some records inside an existing namespace, cannot.
The two methods are not the same work at different volumes. They pay different rates. What incremental saves is volume; what full reindexing saves is rate.
Let q be the share of chunks rewritten in a single run. That gives three cases.
| Case | One full reindex | Incremental coefficient | Threshold q* | When you are in it |
|---|---|---|---|---|
| 1 bulk import available | $12.288 | $75.776 | 16.22% | You have a parse cache and your plan supports bulk import. No embedding cache |
| 2 no bulk import | $43.008 | $75.776 | 56.76% | Parse cache yes, but only new writes into an empty namespace ($32.768 + $10.240 embedding) |
| 3 no parse cache | $1,356.288 | $1,419.776 | 95.53% | Every run reparses the source documents. Parsing under one million pages per month |
Units are dollars per million chunks. The incremental coefficient is the number you multiply by q to get one incremental run. At the same corpus and the same change rate, three organizations scatter across these three rows and the threshold spreads 5.89×. An organization with an embedding cache is off this table entirely, because its one full reindex depends on q; the next section derives that threshold.
The case 3 threshold moves with the parsing rate band and the chunking assumptions. Under one million pages per month, swinging T between 300 and 1,200 gives 90.01% to 97.26%; in the $0.60/1,000 band it gives 78.82% to 93.47%. Raising V to 128 gives 94.83% at T = 500, and combining T = 1,200 with the excess band brings it down to 76.29%. If your q sits below that floor of 76.29%, the conclusion that incremental wins holds at any of these values; above it, you have to rerun the number with your own T and V.
Trap
Check the warehouse before you measure the document change rate. An organization that calls the scribe back every run sees its threshold climb into the range above, depending on the parsing rate band and on T and V. Even at its lowest that is 76.29%, so any rewritten share below that means incremental wins. The conclusion reads as "we need incremental indexing," but what is actually needed is a parse cache.
A parse cache is nothing more than storing the parse output keyed by a hash of the source and skipping when the hash matches. An incremental pipeline additionally requires change detection, chunk diffing, deletion propagation, and orphan cleanup. Lacking primary data on either effort, this post offers no multiple between them. The dollar value is certain. One parse cache takes a single full reindex from $1,356.288 to $12.288.
All Ten Sensitivity Rows Close Into One Formula of Three Ratios
Move the card size, the drawer price, and the coordinate price one at a time. The baseline is case 1’s 16.22%.
| Changed value | New q* | vs. baseline | What the direction means |
|---|---|---|---|
| Batch API embedding (50% discount, both sides) | 10.14% | −6.07pp | Cheaper embedding raises the write share, favoring full reindexing |
| Chunk size C = 256 | 10.14% | −6.07pp | Smaller chunks make embedding per chunk cheaper. Same axis as batch, so the values coincide |
| WU rate at the top, $4.50 | 14.63% | −1.58pp | Costlier overwrites hurt incremental |
| 1 KB = 1,024 B convention | 16.55% | +0.34pp | Not the convention used, since the docs’ worked examples are decimal |
| Vector only, no metadata (6,144 B) | 19.83% | +3.61pp | A lighter record shrinks the write share, favoring incremental |
| Half of incremental writes are new writes | 20.69% | +4.47pp | New writes cost half, so the incremental coefficient drops |
| Chunk size C = 1024 | 26.19% | +9.97pp | Bigger chunks make embedding per chunk costlier |
| All incremental writes are new writes | 28.57% | +12.36pp | This is the add-only pipeline |
| Embedding $0.13/1M (3-large, 3072 dimensions) | 38.70% | +22.48pp | Costlier embedding favors incremental |
| Embedding $0.20/1M (dimensions held at 1536) | 62.20% | +45.98pp | The extreme of the same axis |
The $4.50 WU top rate is on Pinecone pricing and the 3-large $0.13/1M is on OpenAI pricing, both accessed 2026-08-24.
What splits this table top from bottom is one thing: how expensive embedding is relative to writing. That is the ρ in the closed-form callout below, and all ten rows are the result of holding π at 0 and moving only ρ and c. The three rows that change the WU rate or the new-write share, plus the KB convention row, change the normalizing denominator itself, so ρ and c move together.
Add an embedding cache and ρ drops out of the formula, folding this table from 10.14–62.20% into 2.78–6.25% (the closed-form callout below derives it). Six of the ten rows collapse onto the single point 3.125%, and the four that remain are the ones that change c itself. The no-metadata row changes the denominator but bulk import falls by the same proportion, so c is unchanged and it stays with the six.
The Batch API applies equally to full reindexing and incremental. OpenAI’s
batch docs (accessed 2026-08-25) state that
/v1/embeddings supports batch and that the discount is a
“50% cost discount compared to synchronous APIs.” There is no batch rate row for embedding models
on the price list, so that phrase is the only basis for this row.
The completion window is fixed at 24 hours, so neither side can use it if your freshness requirement is shorter than a day.
The sensitivity table moves one lever at a time. Stack them and you leave the table. Batch together with C = 256 gives 6.77%.
If what raises the threshold is the embedding rate, the prize rises with it. One full reindex is the ceiling on per-run savings, so an organization paying $0.20 for embedding has a high threshold at 62.20% but a ceiling of $104.448 per million chunks, 8.5× the baseline. Easy to sit below the threshold, and a large prize when you do. An organization that lightened its records to raise the threshold gets the opposite: a lower ceiling.
Add an embedding cache and this prize collapses too. The ceiling on per-run savings falls from (c + ρ) to c, one sixth of it at baseline, and the path of growing the prize through the embedding rate disappears.
Key
The threshold closes into three ratios. All three are measured against the cost of swapping one old card, set to 1.
q* = (π + c + ρ) / (π + 1 + ρ)
incremental write cost = actual incremental write cost $0.000065536/record at baseline (all overwrites) π = parsing ÷ incremental write 0 with a cache, 20.51 at baseline without one c = full-reindex write ÷ incremental write bulk import 0.03125, new write 0.5, in-place only 1 ρ = embedding ÷ incremental write (chunk tokens × embedding rate) ÷ incremental write, baseline 0.15625
Plug in the baseline and you get (0 + 0.03125 + 0.15625) ÷ (0 + 1 + 0.15625) = 16.22%. All ten sensitivity rows and all three case rows are single points on this formula. C and metadata size from the assumption table fold into ρ, and T and V survive only inside π. With a parse cache, π is 0 and they vanish from the threshold entirely.
π and c together set the threshold's floor at (π + c) ÷ (π + 1), and ρ pulls it up from that floor toward 100%. With a parse cache the floor is c, which is 3.125% at baseline rates with bulk import ($4.50 WU makes it 2.78%). Because ρ sits in both numerator and denominator here, no embedding price can push the threshold past 100%.
Two paths reach the floor c. Either embedding is free, or you stop rewriting coordinates onto cards that already have them. The latter is the embedding cache: the full reindex's embedding term shrinks from ρ to ρq, so the crossover π + c + ρq = q(π + 1 + ρ) gives q* = (π + c) ÷ (π + 1). With a parse cache π is 0, so that value is just c, which is 3.125% at baseline. Applied to the three case rows it gives 3.125%, 50.00%, and 95.50%.
An organization that keeps parse output in the warehouse has no reason to throw away the coordinates, and this post's 16.22% rests on throwing them away. The cache key has to include not just the chunk text but the embedding model, the dimension count, and the chunking parameters. Key on text alone and you will quietly serve stale vectors after a model change.
Bulk import's c = 0.03125 is exactly independent of record size and vector dimension. Import cost and incremental write cost are both proportional to record bytes, so they cancel and only (0.25 ÷ 10⁹) ÷ (2 × 4 ÷ 10⁶ ÷ 1,000) remains. Switch to 3072 dimensions and it is still 0.03125.
All three come off vendor price lists. The only ones an invoice can substitute for are ρ and π, and even then embedding spend ÷ vector DB write spend equals ρ only if you are currently running incremental indexing as overwrites. An organization running full reindexes through bulk import that uses that ratio directly inflates ρ by 32× and gets 83.85% instead of 16.22%. This post's reader is not running incremental yet, so the price list is the default.
Measure the Rewritten-Chunk Share, Not the Document Change Rate
Insert one sentence at the front of a book and every card behind it shifts. Under fixed-size chunking, identical text still gets re-embedded and rewritten because the chunk boundaries moved. Changing a single character turning half a document into new chunks is normal behavior. So r and q are not the same number.
| Pipeline | Chunks rewritten when one spot in a document changes | q | r* (case 1, no embedding cache, q* = 16.22%) | r* (case 1, embedding cache, q* = 3.125%) |
|---|---|---|---|---|
| document-level incremental | all P chunks of that document | q = r | 16.22% | 3.125% |
| fixed-size chunking + chunk-level incremental | everything after the edit point, averaging (P+1)/2 if edits are uniform | q ≈ r/2 (large P) | 32.43% (P → ∞. 29.48% at P = 10) | 6.25% (P → ∞. 5.68% at P = 10) |
| content-defined chunking + chunk-level incremental | boundaries set by content, so only k on each side | q ≈ r × k/P | 81.08% | 15.625% |
The parenthetical on the second row and the third row use P = 10, and the third row’s k is 2. r is the share of documents that change between runs, P is chunks per document, and k is the number of chunks rewritten on each side of an edit point. The same organization at the same change rate sees r* spread 5× depending on which pipeline it runs. r* is your own q* times 1, times 2P/(P+1), and times P/k respectively, so for any combination other than the two right-hand columns, put your own q* through those multipliers.
Changing the chunking method moves every boundary, so price one full re-embedding of the corpus — one full reindex — plus the implementation effort before you do it.
P determines the order of the three rows. Content-defined’s r × k/P only falls below fixed-size’s r(P+1)/(2P) when P > 2k − 1. On the content-defined row, incremental wins when P > k × r ÷ q*, so in case 1 with k = 2 and r = 35%, chunks per document must exceed 4.32 — and 22.4 if you have an embedding cache. Set r to 100% and the condition reduces to P > k ÷ q*, so in case 1 without a cache and k = 2, an organization with more than 12.33 chunks per document wins with incremental at any document change rate. That organization measures neither q nor r.
On the fixed-size row, q cannot go below r/2, so once r exceeds the table’s 32.43% (6.25% with an embedding cache), q stays above the threshold no matter what P is. Since k and P are set by your chunking implementation, put your values into both q formulas — r(P+1)/(2P) from the table and r × k/P from the paragraph above — and use the lower result.
Trap
q is per run, and the document change rate an organization tracks is per day. If you index once a day the two share a time unit, but if you index hourly, the per-run r is one twenty-fourth of the daily change rate, and under document-level incremental that is q. This holds when changes are spread evenly across the day; if the same document changes several times a day it runs higher, and the error favors incremental. Skip this conversion and you overstate incremental cost by 24×.
If you are already running incremental, do not estimate — count it in the logs. Records written to the vector DB in one run divided by total records is q. An organization still running only full reindexes gets 100% from that ratio, so measure the document change rate instead, divide by runs per day, convert through the r → q table, and then validate with this back-calculation once incremental is on. To back it out of a Pinecone invoice, divide the period's total WU by (record size in KB × 2 × total records × runs in the period). Omit the run count and a month's worth reads as one run's worth, inflating q by the number of runs and making an organization below the threshold look like it is above.
The × 2 in that back-calculation assumes 16.384 WU overwrites. New writes cost half, so a high new-write share understates q, and an organization billed 10.24 WU for partial updates understates it by the same 0.625× factor. That organization's own threshold also moves, to 24.00% without metadata demotion (5.00% if it also has an embedding cache), so it reads an actual q of 25% as 15.6% and wrongly concludes it is below the threshold.
If you keep document-level incremental and change only how the cards are cut, q never falls below r. If r already exceeds that pipeline's r*, you also have to drop the incremental unit down to the chunk, and whether even that suffices depends on chunks per document.
In a DB That Can Only Write In Place, the Threshold Rises to 100%
Everything so far sits on Pinecone’s price list. Even without bulk import, a full reindex can still use new writes into an empty namespace, which leaves case 2’s threshold of 56.76%. The threshold only truly disappears in a DB where wheeling in a fresh empty cabinet is impossible and you must write in place. There the two values converge at $75.776.
That condition splits inside Pinecone too. Bulk import is Standard-plan-and-above only, and Standard requires “$50/month min. usage” (Pinecone pricing, accessed 2026-08-24).
What bulk import earns is $43.008 − $12.288 = $30.720 per million chunks.
The minimum usage is not an extra charge; it is a floor. Two boundaries split the range into three. Below 18.31 million reindexed chunks per year, your invoice is the same whether or not you use bulk import; above 292.97 million, the full $30.720 per million chunks shows up. An organization in between that plugs in the full amount overstates its savings.
This post’s model assumes a managed vector DB that meters writes. On pgvector or a self-hosted Qdrant, where there is no write rate, c is undefined and the comparison axis becomes instance cost and operational effort.
Measure Wall-Clock First, but the Cache Moves the Embedding Wall
The machine that writes coordinates has a throughput ceiling.
OpenAI’s text-embedding-3-small has tokens-per-minute limits by usage tier (model docs, accessed 2026-08-24). At 571.4286 embedding tokens per page, that ceiling converts to pages.
| Tier | TPM | Pages per hour | Ceiling on annual full-reindex spend (case 1, no embedding cache) |
|---|---|---|---|
| Tier 1·2 | 1,000,000 | 105,000 | $12,614 |
| Tier 3·4 | 5,000,000 | 525,000 | $63,072 |
| Tier 5 | 10,000,000 | 1,050,000 | $126,144 |
If you embed everything every run, even the highest tier tops out at 1.05 million pages for a corpus that can meet a one-hour freshness requirement by full reindexing. Above that, no budget meets the cycle.
The last column is the full-reindex invoice if you ran the embedding machine nonstop all year. One full reindex scales with chunk count and so does wall-clock time, so multiplying by annual run count cancels the chunk count. That makes this ceiling independent of corpus size, set only by tier and case. Annual savings cannot exceed it even if incremental were free, which makes it the first yardstick for the cost of building an incremental pipeline.
This table assumes the full reindex embeds everything every run. With an embedding cache the ceiling is undefined, because the chunk count no longer cancels: the ceiling becomes proportional to c ÷ q + ρ and diverges as q shrinks.
Hold up the yardstick and one band closes. For a Tier 1·2, case 1 organization with no embedding cache, annual savings cannot exceed $12,614 at any corpus size, and what comes out of that is not a threshold but an effort budget.
allowed build effort M = (ceiling on S − m × W) × target payback years ÷ W
There are two ceilings stacked here. The tier ceiling assumes embedding runs all year, so any corpus’s annual full-reindex cost is below it, and S is below that again. When budgeting your own effort, use the tighter one — your own annual full-reindex cost (step 5 of the decision table below is that value). Use the tier ceiling only for conclusions that hold regardless of corpus. What follows is the latter.
Put maintenance effort m = 12 person-days and labor W = $500/person-day against the Tier 1·2, case 1 tier ceiling and you get 52.9 person-days at a four-year payback, 39.7 at three years. The 12 person-days and $500/person-day, and the 60 person-days of build below, come from example B further down. Tier 1·2 is an assumption made only for this calculation, not taken from example B, which is Tier 5.
A ceiling is a ceiling, so an organization that does not run its embedding machine all year — that is, one whose actual annual full-reindex spend is lower — saves less and gets a stronger version of the conclusion. For a Tier 1·2, case 1 organization with no embedding cache, at example B’s 12 person-days of maintenance and W = $500/person-day, no corpus size and no q, not even q = 0, recovers that 60 person-day build within four years. Raising your tier or cutting build scope inside this budget comes before measuring q.
With a cache, as noted above, this ceiling is undefined, so use your own annual full-reindex cost.
The values themselves use case 1 rates ($12.288 per million chunks). Case 2 is 3.500× that, and case 3 is 44.8× (Tier 5) to 45.6× (Tier 1·2). The reason it is not the 110.375× you get by dividing the case table’s $1,356.288 directly is that this ceiling is the volume of embedding running all year, so parsing exceeds 76.65 million pages per month and at least 98.7% of it lands in the $0.60/1,000 band. The first million pages stay at $1.50, which is why the effective rate differs by tier. Multiply your own case’s one full reindex by (525,600 ÷ wall-clock minutes) to get your own ceiling.
Trap
If wall-clock time exceeds the freshness cycle, you cannot run a full reindex on that cycle. The first thing to look at is the embedding cache. With one, embedding time shrinks by a factor of q and the wall moves.
If it still does not fit with the cache, look at the embedding axis first. Incremental is not the lever here. Incremental also embeds the changed chunks, so it is never shorter than a cached full reindex. What is left is raising your tier (Tier 5 is the end of the table), relaxing the freshness requirement, or growing the chunk size — and chunks only cut the overlap share, so the ceiling is the 12.5% from 571.4286 tokens per page down to 500. Demoting volatile fields to metadata is the path example C works through to the end. Relaxing the requirement costs you however stale the index gets.
The write axis only opens once the embedding axis fits inside the cycle. The two are not exclusive, and if embedding alone already blows past it, cutting writes will not save you. On the write axis the two methods are asymmetric. A full reindex writes everything (27.429 GB in example B) while incremental writes only the changed records (0.0034 GB), so volume falls by a factor of q, and incremental is the main lever for moving that wall. Dropping metadata takes a record from 8,192 B to 6,144 B, cutting volume another 25%.
That said, the volume ratio becomes the time ratio only in case 2, where both sides use the same API. In case 1 the full reindex is an asynchronous bulk import and incremental is upsert. This post sets that time to 0, so which axis binds is something you have to measure in your own pipeline.
The tier table counts embedding time only, so it is optimistic. In practice parse cache lookups, bulk import file generation, and the import itself stack on top. Pinecone's docs give no baseline for import duration, so this post sets that term to 0. Near the boundary, measure it once in your own pipeline.
Two of Three Organizations Should Not Build It, for Different Reasons
Whether you clear the threshold and whether you build the pipeline are different questions. The first is about a ratio; the second is about an absolute amount. Not how many cards you save, but whether that money is worth attaching a person to. What to look at first is not the threshold but annual savings.
| Item | A internal wiki | B regulatory archive | C product catalog |
|---|---|---|---|
| source | Markdown | scanned PDF (has parse cache) | product descriptions (no parsing) |
| pages | 72,000 | 3,000,000 | 400,000 |
| chunks | 80,357 | 3,348,214 | 446,429 |
| freshness requirement | daily | 1 hour | daily |
| document change rate | 2%/day | 0.3%/day | 35%/day |
| q per run (document-level incremental) | 2% | 0.0125% | 35% |
| against the 16.22% threshold | below | below | above |
| wall-clock time | 41.14 min (Tier 1·2) | 171.43 min (Tier 5) | 228.57 min (Tier 1·2) |
| finishes inside the freshness window | yes | no | yes |
| annual runs (full / incremental) | 365 / 365 | 2,920 / 8,760 | 365 / 365 |
| one full reindex | $0.987 | $41.143 | $5.486 |
| one incremental run | $0.122 | $0.032 | $11.840 |
| annual full reindex (usage) | $360.41 | $120,137.13 | $2,002.29 |
| annual incremental (usage) | $44.45 | $277.82 | $4,321.60 |
| usage multiple | incremental 8.11× cheaper | incremental 432.43× cheaper | incremental 2.16× more expensive |
| annual savings after minimum usage (index writes only, no embedding cache) | $294.34 | $119,499.59 | −$2,053.03 |
Without an embedding cache, B’s wall-clock time of 171.43 minutes makes three hours the shortest possible full-reindex cycle, while incremental runs hourly as required. Because the two run at different frequencies, the usage multiple of 432.43 does not equal threshold ÷ q. Those two match only when both run on the same cycle.
The last row is the actual invoice. Pinecone’s $600 annual minimum applies only to vector DB spend, not to the embedding bill. For A, both methods fall below it, so the $21.62 difference disappears; for B only the incremental side is below, cutting savings by $359.73; for C only the full-reindex side is below, raising that invoice and shrinking the loss by $266.29.
Payback comes from this formula.
payback days = build effort M × W ÷ (annual savings S − maintenance effort m × W) × 365
M is build effort, m is maintenance effort, and W is the loaded cost of one engineer-day. This is the allowed-build-effort formula from the previous section rewritten as payback days. Lacking primary data on all three, they stay parameters. The values the examples below use are assumptions. The existence condition is S > m × W; fail it and payback days go negative or infinite.
If you have not measured q yet, substitute annual full-reindex cost for S. Incremental cost is at least 0, so that value is the ceiling on S, and if payback fails even at the ceiling you do not need to measure q.
Example A — internal wiki
Annual full reindexing is $360.41 and 2 person-days of maintenance (W = $400/person-day) is $800. The ceiling on S is below the maintenance cost, so judgment ends at step 5 of the decision table and neither the threshold nor q gets measured. It is on the Standard plan so bulk import is available, and the source is Markdown so there is no parsing, making it case 1. Its 29.33 million reindexed chunks per year fall between the minimum-usage boundaries of 18.31 million and 292.97 million, so bulk import cuts the full-reindex invoice by $361.10 rather than the full $901.03.
Calculated at q = 2%, it comes out like this. You have to separate drawer costs from coordinate costs to get an invoice. Full reindexing is Pinecone $60.07 + OpenAI $300.34; incremental is Pinecone $38.44 + OpenAI $6.01. On the Pinecone side both methods sit below the $600 annual minimum, so the $21.62 difference between full reindexing and incremental never appears on the invoice. The savings that remain are the $294.34 on the embedding side, short of the $800 maintenance cost. Build effort does not even enter the calculation.
That $294.34 is available without incremental. If the full reindex reuses vectors for unchanged chunks, embedding drops from $300.34 to $6.01 and the invoice becomes $606.01 — the same value as building incremental. In this organization, what an incremental pipeline earns is exactly what an embedding cache already earns.
Give up bulk import and this organization becomes case 2, c rises to 0.5, and the threshold becomes 56.76%. The full-reindex invoice rises to $1,261.44 while incremental stays at $606.01, so savings become $655.43 (with an embedding cache, $967.10 against $606.01, or $361.10). That is twice the $294.34 from using bulk import, and still short of the $800 maintenance cost. Change the path and both the threshold and the savings change, but the answer does not.
Verdict: full reindex daily, and if the cache's annual maintenance cost is below the $294.34 it saves at q = 2% (about 0.74 person-days at W = $400/person-day), attach an embedding cache keyed by chunk hash. Note that the cache also takes effort to build: at 2 person-days, payback is 2.72 years even with zero maintenance. Do not build the incremental pipeline.
Example B — regulatory archive
Wall-clock time of 171.43 minutes exceeds the one-hour requirement. That figure assumes no embedding cache; attach one and embedding time falls to 0.02 minutes, removing the embedding-side wall (import time is set to 0 as noted in the wall-clock trap). So what blocks this organization is money, not time. Run a cache-backed full reindex hourly as required and the import cost remains, at $60,106.11/year (Pinecone $60,068.57 + OpenAI $37.54), against $637.54 for incremental on a minimum-usage-adjusted invoice. That is 94×.
The table's $119,499.59 in savings is from before the embedding cache, baselined against the achievable three-hour cycle. Its being 94.73% of the Tier 5 ceiling of $126,144 — pinned to the roof — belongs to that same world.
Compare against the best alternative and the savings shrink. A cache-backed full reindex can run hourly as required at $60,106.11/year, and incremental plus a weekly cache-backed full reindex invoices at $637.77. Savings are $59,468.34 and payback is 205 days. Payback doubles, but savings clear nine times the $6,000 maintenance cost, so the answer holds. The answer to build incremental is the same on either baseline; what changes is how much that answer earns.
Ownerless cards — orphan vectors left in the drawers — get wiped by swapping the whole cabinet once a week. That is 52 runs × $41.1429 = $2,139.43, or 1.79% of the $119,499.59 in savings before the weekly is added. It is not a question of choosing between incremental and full reindexing, so this cost goes onto the incremental side and the invoice is redrawn. Of it, the $356.57 Pinecone portion only lifts incremental spend to $596.85, short of the $600 minimum, so it never appears on the invoice.
payback = 30,000 ÷ (117,716.73 − 6,000) × 365 = 98.0 days pre-cache, 3-hour baseline
30,000 ÷ ( 59,468.34 − 6,000) × 365 = 205 days cached hourly (best alternative)
build 60 person-days savings (incl. weekly full reindex) maintenance 12 person-days, W = $500/person-day
Verdict: even with an embedding cache the money is 94×, so build incremental. Run a weekly full reindex alongside it.
Example C — product catalog
Standard plan. Price and stock live in the body text of the catalog, so 35% changes daily. A q of 35% is 2.16× the 16.22% threshold.
Incremental costs $4,321.60/year; full reindexing with bulk import costs $2,002.29. Even on a minimum-usage-adjusted invoice, incremental pays $2,053.03 more every year.
Pull the volatile fields out of the embedding input and demote them to metadata, and the body stops changing, so re-embedding disappears and incremental is writes only. The cost is not in dollars. A demoted field vanishes from vector search and is reachable only through metadata filters, so if price or stock appears in queries, search quality pays for it. With that change ρ leaves the denominator and stays only in the numerator, raising the threshold to (0.03125 + 0.15625) ÷ 1 = 18.75%. A q of 35% is still above it.
How far above depends on how Pinecone bills `update`. The docs say "1 WU for each 1 KB of the new and existing record" ([Pinecone cost docs](https://docs.pinecone.io/guides/manage-cost/understanding-cost), accessed 2026-08-25). If the whole post-update record (8.192 KB) counts as the new record, that is the same 16.384 WU as an overwrite and incremental runs $3,737.60/year, $1,469.03 more than full reindexing's $2,268.57. If only the metadata you sent (2.048 KB) counts as new, it is 10.24 WU. Then the normalizing denominator becomes $40.96 per million chunks, c = 0.05, ρ = 0.25, the threshold rises to 30.00%, and incremental comes to $2,336.00, narrowing the gap to $67.43. Under both readings incremental costs more, but the size differs by 22×.
Dropping the incremental unit to the chunk to lower q is blocked too. 200,000 products hold 446,429 chunks, 2.232 per product. Under fixed-size chunking, rewriting everything after the edit point averages (P+1)/2 = 1.616 chunks, giving q = 25.34%; switching to content-defined chunking still touches 2 chunks on each side of the boundary, which is 89.6% of a product, giving 35% × 2 ÷ 2.232 = 31.36%. Both are above the threshold.
The r → q table said content-defined chunking was the better option, and here it comes out the opposite way. That table's k/P is the formula for when P exceeds 2k − 1, and at 2.232 chunks per product, "2 on each side" is nearly the whole document. When documents are short, dropping the incremental unit leaves no room to shrink.
Measure the latency benefit before switching it off. Full reindexing finishes in 228.57 minutes, so switching off leaves the index up to a day stale. Whether that is tolerable in a catalog where price and stock turn over is what you trade against $2,053.03/year.
Verdict: full reindex daily and wheel in the whole cabinet via bulk import. Demoting to metadata raises the threshold to 18.75% or 30.00%, but q = 35% is above both, so step 6 of the decision table applies as is. What incremental costs extra is $67.43/year under the cheaper reading and $1,469.03 under the dearer one. Even under the cheaper one, 2 person-days of maintenance (W = $400/person-day) at $800 stacks on top, so this is not near the boundary. Separately from demotion, attaching an embedding cache keyed by chunk hash (when annual maintenance cost is below the $1,084.57 it saves at q = 35%; about 2.71 person-days at W = $400/person-day) brings the full-reindex invoice down to $1,184.00, widening the gap to $3,137.60.
The objection that “embedding is cheap anyway, so does this calculation matter” is exactly right for example A, and that is one of this post’s conclusions.
The embedding rate attaches identically to full reindexing and incremental and cancels, so the rate difference that separates the two methods is $63.488 per million chunks where bulk import is available, or half that, $32.768, in case 2 — entirely writes. That is why which drawer you put the card in, the write path available to the full reindex, sets the threshold’s floor in a parse-cached configuration.
In example A’s full-reindex usage, embedding is 83%, and 93% of the $315.96 usage difference is also the embedding portion. That is not a contradiction. In a configuration with a parse cache and bulk import, the term that dominates the dollar amount is embedding, and the term that dominates the rate difference setting the floor is, in every case, writes.
When the total is small, there is no reason to act on that answer at all. An organization whose annual indexing cost does not exceed its maintenance labor is right not to build an incremental pipeline.
If the First Five Steps Settle It, You Never Measure q
The decision table has seven steps, and the one place judgment ends without q is step 5. Steps 2 and 3 change π and c; step 4 shrinks the full reindex’s embedding term by a factor of q and changes the q* formula itself to (π + c) ÷ (π + 1). Cost settles the question at steps 5, 6, and 7; step 1 renders no verdict at all and routes you through steps 2 and 3 to step 4 or to the wall-clock trap. Example A stops at 5 and example C at 6, while example B moves step 1’s wall with a cache and runs all the way to 7.
| Step | What to check | If this is the answer | Then |
|---|---|---|---|
| 1 | wall-clock = chunks × chunk size C ÷ TPM (minutes). With an embedding cache count only changed chunks; if you do not know q, measure at full volume and use it as a ceiling | longer than the freshness cycle | finish steps 2 and 3, then see whether step 4 can move the embedding wall. If it still does not fit, go to the wall-clock trap and separate the embedding axis from the write axis |
| 2 | does every run reparse the source | yes | attach a parse cache first. π drops to 0 (at baseline it was 20.51 under one million pages per month, 8.20 above) |
| 3 | the cheapest write path the full reindex can use | bulk import / new writes into an empty namespace / in-place only | c = 0.03125 / 0.5 / 1. If in-place only, q* is 100%, so step 6’s ratio test always favors incremental and only the absolute-amount tests at steps 5 and 7 remain |
| 4 | does the full reindex reuse vectors for unchanged chunks | no | attach an embedding cache keyed by chunk hash. Only if annual maintenance effort is below (annual embedding spend ÷ W). Your q* falls to (π + c) ÷ (π + 1) and one full reindex falls to the full-reindex write cost set by step 3 + embedding cost × q |
| 5 | annual full-reindex cost = one full reindex × annual runs (ceiling on S) | ceiling ≤ maintenance labor | keep full reindexing. No need to measure q |
| 6 | q = records written in one run ÷ total records. If you still run only full reindexes this ratio comes out at 100%, so measure the document change rate instead; if you measured it daily, divide by runs per day to get per-run r and convert through the r → q table | q ≥ your own q* | go with full reindexing. Incremental loses money. Unless a write wall stops that full reindex from meeting the cycle, in which case take the loss and go incremental — that loss is the price of the freshness requirement |
| 7 | payback days = M × W ÷ (S − m × W) × 365. S is actual savings measured against a full reindex that has been through step 4, and the budget ceiling on M comes from the allowed-build-effort formula | inside the target payback years | build incremental and run a periodic full reindex alongside it. Outside it, keep full reindexing |
Get your own q* by putting π, c, and ρ into the formula in the closed-form callout above. One full reindex and the incremental coefficient come from multiplying the case table’s per-million-chunk values by your chunk count. Wheel in the whole cabinet and it is the import cost; if you cannot, it is the cost of new writes into empty drawers. In example A that difference separates $294.34 in savings from $655.43.
If you attached an embedding cache at step 4, your q* is the same callout’s (π + c) ÷ (π + 1), and one full reindex is not the case table value but full-reindex write cost + embedding cost × q. Step 5 comes before q, so if you do not know q yet, use the case table value as is. The cache only lowers that value, so it remains valid as a ceiling.
Step 4’s gate is the same ceiling treatment as step 5. Annual embedding spend is the ceiling on savings, so failing there means definitely not attaching it, and passing means checking again whether q narrows savings to spend × (1 − q). Even an organization whose judgment ends at step 5 and never reaches step 6 can narrow the cache gate that way. This gate is a necessary condition that looks only at maintenance effort, so whether you actually attach it comes from putting the cache’s build and maintenance effort into the payback formula above.
S is (one full reindex × annual full-reindex runs) − (one incremental run × annual incremental runs). Run both on the same cycle and it reduces to (one full reindex − one incremental run) × annual runs, and the gain multiple is one full reindex ÷ one incremental run. That equals q* ÷ q only without an embedding cache. On different cycles, multiply by the ratio of annual run counts.
Even if you choose incremental, the periodic full reindex remains, so S cannot exceed step 5’s ceiling (annual full-reindex cost) times (1 − periodic full-reindex runs ÷ annual full-reindex runs). For an organization that indexed once a day and adds a weekly, 85.8% of that ceiling is the real limit.
If your plan has a minimum usage, one step goes in front of that S formula. Replace each side’s vector DB spend with max(usage, minimum usage), add embedding spend, and use the difference as S. What goes into that max is total vector DB spend, not index writes.
The three examples above were computed on index writes alone, so adding index storage cost moves B and C (A stays put, since both sides are below the floor). For example B, adding $108.62/year (27.429 GB × $0.33/GB/month × 12 months) to the incremental side still leaves $348.89, below the floor, so savings rise to $119,608.21; for example C the incremental side crosses the floor and the loss grows to $2,067.51. Query spend or other indexes move it further in the same direction, and for an organization already above the floor this correction disappears entirely.
When the floor catches the incremental side, S shrinks; when it catches the full-reindex side, S grows. Example C is the latter, so its loss shrinks from $2,319.32 to $2,053.03.
Step 5 produces an answer independent of q, so small organizations finish here. In case 1, indexing once a day with 2 person-days of annual maintenance (W = $400/person-day), a corpus under 178,368 chunks on a usage basis cannot pay for incremental maintenance even at q = 0. If you attached an embedding cache at step 4, one full reindex is import cost only and that boundary rises to about 1.07 million.
With a minimum usage, that no-cache 178,368 boundary rises further. Below 802,654 chunks, the full-reindex vector DB spend sits under the $600 annual floor. If the incremental side is below it too, that difference disappears from both invoices and the savings that remain are the embedding portion. The boundary for that band is 214,041. Example A’s 80,357 is inside it, and for organizations like that, measuring neither the threshold nor q is the right call.
Here is what was left out of the calculation.
| Excluded item | Which side it attaches to | Direction it pushes the threshold | Size |
|---|---|---|---|
| object storage cost and import file generation | full reindex every run, incremental at the periodic full-reindex frequency | up (favors incremental) | rate not obtained. Multiply 8.192 GB per million chunks by your own storage rate |
| storage while old and new namespaces coexist | same | up | 0.090% of one full reindex at three hours of overlap |
| tearing down the old namespace | same | up | flat 5 WU = $0.00002 |
| operational burden of namespace swaps | both (incremental also runs periodic full reindexes) | no direction | two failure-mode paragraphs below |
| handling deleted documents | incremental | down (favors full) | deletes consume WU too |
| orphan vector accumulation | incremental | down | cleared by periodic full reindex. $2,139.43/year in example B |
| possibility that WU is measured on request serialization size rather than record size | overwrites and new writes on both sides | direction unknown | if serialization exceeds the record, only the incremental side rises and the threshold falls; if partial-update requests are smaller than the record, the incremental side falls and the threshold rises. The 5 WU per-request minimum works out to 0.005 WU per record at the batch limit of 1,000 records (Pinecone upsert docs, accessed 2026-08-24), so it does not bind. Measure the actual WU of one of your own requests on the invoice to settle the direction |
| 50,000 embedding inputs per batch limit | both | no direction | “restricted to a maximum of 50,000 embedding inputs across all requests” (OpenAI batch docs, accessed 2026-08-25). Cost unchanged. Example B’s one full reindex splits into 67 batches |
| index storage cost | identical on both | no direction | $0.33/GB/month (Pinecone pricing, accessed 2026-08-24). 8.192 GB per million chunks. Does not move the threshold, only the minimum-usage floor test. $108.62/year in example B |
| query cost (RU) | identical on both | no direction | independent of indexing method. Does enter the floor test |
| parse cache storage | identical on both | no direction | proportional to source text size |
| embedding cache storage and invalidation effort | the cache-backed full reindex | up | 6.144 GB per million chunks holding vectors only, or $2.028/month at $0.33/GB/month. The key includes model, dimensions, and chunking parameters, so changing any one of them invalidates the whole cache. 16.22% is a no-cache value so this term does not attach to it; it attaches only to the cached threshold |
| full reindex on an embedding model change | only full reindexing can do it | down | incremental cannot perform this operation |
Of the four that push up, namespace coexistence and teardown are capped inside the $2.048 per million chunks of import cost. Storage has no rate obtained, but at 8.192 GB per million chunks, anything under $0.25/GB puts that term inside $2.048 as well. Embedding cache storage also comes to $0.07 per run for an organization indexing once a day, inside that cap, but invalidation effort has no ceiling — and that term attaches only to the cached threshold, so it does not enter 16.22%.
There is no ceiling on the side that pushes down. Orphan vectors are actual spend that an organization choosing incremental has to stack a periodic full reindex on top of, and an embedding model change is not an amount but an operation incremental cannot perform.
If the storage rate is under $0.25/GB, putting all three of the up-pushing terms that attach to 16.22% inside $2.048, then the net effect of the excluded items is downward — toward full reindexing — and this post’s threshold is generous to incremental. At the cached threshold, the up-pushing side also carries a term with no ceiling (invalidation effort), so the net effect is undetermined. How often you change model, dimensions, or chunking parameters sets the size of that term.
Swapping the whole cabinet changes the failure mode. Because the index switches over wholesale, an error in the parsing or embedding stage shows up as simultaneous contamination of the entire corpus rather than degradation of a few documents. Incremental keeps the same error local.
This burden does not go into M in the payback formula. Even if you choose incremental you still run periodic full reindexes, so the namespace swap procedure, cutover validation, and rollback procedure are needed either way. It cancels in the payback calculation, and what remains is only that a full-reindex-only configuration experiences it as often as it runs.
The last table row is large too. Change the embedding model and every existing vector becomes meaningless, so the whole corpus has to be re-embedded. An organization with only an incremental pipeline has to build a full-reindex path in a hurry at that moment. That is why you do not discard the full-reindex path even after building incremental.
Follow-up
Part 1 built its structure on the crossover between fixed cost and metered cost; this post moves that to the crossover between "the rate for doing it all at once" and "the rate for doing it a little at a time." The labor cost that dominated part 1's conclusion decides example A's answer here too.
Part 5 measures the read charges on the same corpus. That is the axis this post left open after measuring write charges, and it carries over the 8,192 B record and the decimal GB convention unchanged.
Part 3 used cache TTL to show that a threshold derived under one condition cannot be carried to another. This post's three cases are another instance of the same lesson. 16.22% is true only on top of three conditions: a parse cache, bulk import, and no embedding cache.
This post’s threshold sits on Pinecone’s price list and OpenAI’s rates. Change those values and 16.22% changes. What does not change is the structure. The cheapest cabinet price a full reindex can use is below the price of swapping a card, and that gap creates the threshold’s floor; make that path identical to incremental’s and the floor rises to 100% and the threshold disappears.
How far above the floor you land is set by ρ, and π narrows that range. With a parse cache the floor drops to c; with an embedding cache ρ disappears and the threshold is the floor itself. With both, the floor is c and that is the threshold.
All three of π, c, and ρ are on vendor price lists. How often your documents change is the question after that.
Sources
- OpenAI API Pricing — August 24, 2026
- OpenAI Embeddings Guide — August 24, 2026
- OpenAI text-embedding-3-small Model Page — August 24, 2026
- OpenAI Batch API Guide — August 25, 2026
- Gemini API Pricing — August 24, 2026
- Voyage AI Pricing — August 24, 2026
- Pinecone Pricing — August 24, 2026
- Pinecone — Understanding Cost — August 25, 2026
- Pinecone — Upsert Data — August 24, 2026
- Pinecone — Import Data — August 24, 2026
- Amazon Textract Pricing — August 24, 2026