Skip to content

perf(delete): bulk descending PK-delete on the generic DELETE path - #376

Merged
MPCoreDeveloper merged 1 commit into
masterfrom
perf/bulk-pk-delete
Sep 4, 2026
Merged

perf(delete): bulk descending PK-delete on the generic DELETE path#376
MPCoreDeveloper merged 1 commit into
masterfrom
perf/bulk-pk-delete

Conversation

@MPCoreDeveloper

Copy link
Copy Markdown
Owner

Samenvatting

Bulk aflopende PK-delete op het generieke DELETE-pad (DeleteRecordsCore).

  • IIndex krijgt een DeleteBulk(IEnumerable<TKey>) (default = per-key Delete).
  • BTree.DeleteBulk sorteert de batch aflopend zodat opeenvolgende removals langs het rechter-bladpad lopen -> veel minder interne separator-promoties/rebalances dan willekeurige per-rij resolutievolgorde.
  • DeleteRecordsCore verzamelt de PK-sleutels van de batch eenmalig en verwijdert ze via DeleteBulk i.p.v. per-key Delete.

Correctheid

  • Identieke keyset, elk key precies één keer; PK is uniek.
  • Regressietest LegacyLayoutBatchDelete_BulkPkRemove_StaysCorrectAcrossReopen: forceert het generieke pad (fixed-width uit), verwijdert 1..1000 van 2000, controleert PK- en hash-lookups en reopen (tombstones + PK-index-rebuild mogen rijen niet herrijzen).
  • Full suite: 1762 tests, 0 failed (Release).

Metingen (fair-PK harness --pk, AppendOnly, zelfde machine als master)

Variant master deze branch
legacy DELETE 10K ~67,8-71,4K ops/s ~68,9-71,8K ops/s
fixed-width DELETE 10K ~96,9-104,9K ops/s ~101,2-106,1K ops/s

Op strikt oplopende batch-deletes is het effect binnen de meetruis (die volgorde was al vrijwel boomvriendelijk). De winst zit bij ongeordende keysets (hash-geselecteerde subselects, reverse/random batches) die voorheen per sprong een separator-promotie betaalden. Deze stap is daarmee de correctheids-neutrale ordering-fix + infrastructuur op het generieke pad; de structurele DELETE-winst komt uit de fixed-width/PageBased-track (Fase B), zoals vastgelegd in het uitvoerplan.

…5-bulk)

IIndex gains DeleteBulk (default = per-key Delete). BTree.DeleteBulk sorts the
batch in descending key order so consecutive removals run along the rightmost
leaf path, triggering far fewer internal-separator promotions than deleting in
arbitrary per-row resolution order. DeleteRecordsCore collects the batch's PK
keys once and removes them via DeleteBulk instead of per-key Delete.

Correctness is unchanged (same key set, one visit per key; PK unique). Fair-PK
harness (--pk, AppendOnly legacy): DELETE ~69-72K ops/s on strictly ascending
batches (within noise); the win concentrates on unordered key sets.

Regression: LegacyLayoutBatchDelete_BulkPkRemove_StaysCorrectAcrossReopen drives
the generic bulk path on a legacy-layout table (fixed-width disabled) and reopens
to prove tombstones + on-load PK-index rebuild do not resurrect rows.
Full suite: 1762 tests, 0 failed.
@sonarqubecloud

sonarqubecloud Bot commented Sep 4, 2026

Copy link
Copy Markdown

@MPCoreDeveloper
MPCoreDeveloper merged commit 2ce18f6 into master Sep 4, 2026
13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant