Delete every row at indices in ONE compaction pass over rows/rowIds with a
single primary-key index rebuild at the end — the per-row delete(int) path pays
an O(n) shift per removal plus a full index rebuild each time.
Install a REPLACEMENT row at index — UPDATE never mutates a stored row in place,
which is what lets takeSnapshot() keep pointer copies instead of deep copies.
Delete every row at indices in ONE compaction pass over rows/rowIds with a
single primary-key index rebuild at the end — the per-row delete(int) path pays
an O(n) shift per removal plus a full index rebuild each time. Out-of-range indices are
ignored, matching delete(int); duplicates are harmless.
Install a REPLACEMENT row at index — UPDATE never mutates a stored row in place,
which is what lets takeSnapshot() keep pointer copies instead of deep copies.