Skip to content

perf(index): remove quadratic duplicate-key hash removal on batch DELETE (P5) - #378

Merged
MPCoreDeveloper merged 1 commit into
masterfrom
perf/hash-dup-key-remove
Sep 4, 2026
Merged

perf(index): remove quadratic duplicate-key hash removal on batch DELETE (P5)#378
MPCoreDeveloper merged 1 commit into
masterfrom
perf/hash-dup-key-remove

Conversation

@MPCoreDeveloper

Copy link
Copy Markdown
Owner

Samenvatting

Duplicate-key hash-index removal op batch-DELETE is niet langer kwadratisch (P5).

HashIndex.RemoveBatchKeys (en het RemoveBatch-rij-overload) deden per positie een List.Remove:
voor een key met n rijen en m duplicate-key deletes in één batch was dat O(m·n) door de lineaire
shift per duplicate. Nu:

  • Single-row keys (de gebruikelijke, bv. unieke indexwaarden) houden de directe,
    allocatie-vrije
    weg — list.Remove + key-opruiming bij leeg.
  • Keys met >1 rij worden pas gevolgd zodra een duplicate in de batch opduikt: eerste
    verwijdering direct, latere posities gedeferred in een per-key set, daarna één O(list)-compaction
    per key (CompactPositionList, value-based).

Validatie

  • Nieuwe regressietests HashIndexDuplicateKeyBatchDeleteTests: volle én partiële duplicate-groep
    deletes (2000 rijen, 10 naamgroepen van 200), beide index-backends (managed List +
    unsafe native backend via EnableUnsafeEqualityIndex), inclusief reopen.
  • Full suite: 1764 tests, 0 failed (Release).
  • Benchmark-neutraal op unieke keys (fair-PK --pk: legacy ~80K, fixed-width ~133K ops/s —
    binnen de ruis van perf(delete): batch commit-time tombstone marker writes per storage page (C5) #377).

…ETE (P5)

HashIndex.RemoveBatchKeys/RemoveBatch removed every position from a key's List
with one O(list) List.Remove shift per duplicate: O(m·n) for a key holding n
rows with m duplicate-key deletions in a single batch. Batch removal now keeps
the direct allocation-free path for single-row keys (the common unique-key
case, verified benchmark-neutral at ~80K legacy / ~133K fixed-width ops/s on
--pk) and defers duplicate-key positions into a per-key set that is applied with
one O(list) compaction per key.

Regression tests (HashIndexDuplicateKeyBatchDeleteTests) cover full and partial
duplicate-group deletes on both index backends (managed List + unsafe native)
including a reopen; full suite 1764 tests, 0 failed.
@sonarqubecloud

sonarqubecloud Bot commented Sep 4, 2026

Copy link
Copy Markdown

@MPCoreDeveloper
MPCoreDeveloper merged commit a76fca6 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