Skip to content

Fix RangeIterator O(n) drain and query_next_batch routing#11

Open
mynameborat wants to merge 1 commit into
hkadayam:rust/mainfrom
mynameborat:iterator-improvements
Open

Fix RangeIterator O(n) drain and query_next_batch routing#11
mynameborat wants to merge 1 commit into
hkadayam:rust/mainfrom
mynameborat:iterator-improvements

Conversation

@mynameborat
Copy link
Copy Markdown

Fix RangeIterator O(n) drain and query_next_batch routing

  • RangeIterator: replace Vec::remove(0) with cursor index — O(1) per
    element instead of O(n) shift. Eliminates ~500K element moves when
    draining a 1000-entry batch.
  • Btree::query_next_batch(): fix inverted is_sweep_query routing —
    sweep queries now continue with sweep_query_internal and traversal
    queries continue with traversal_query_internal (was swapped).
      ┌─────────────┬────────────┬───────────────────────┬─────────────────────┐
      │  Scan Size  │ Before Fix │       After Fix       │ vs RocksDB PT+noWAL │
      ├─────────────┼────────────┼───────────────────────┼─────────────────────┤
      │ 100 keys    │ 20.0 us    │ 12.2 us (1.6x faster) │ 1.9x slower         │
      ├─────────────┼────────────┼───────────────────────┼─────────────────────┤
      │ 1,000 keys  │ 276 us     │ 152 us (1.8x faster)  │ 2.5x slower         │
      ├─────────────┼────────────┼───────────────────────┼─────────────────────┤
      │ 5,000 keys  │ 1,380 us   │ 454 us (3.0x faster)  │ 1.5x slower         │
      ├─────────────┼────────────┼───────────────────────┼─────────────────────┤
      │ 10,000 keys │ 2,810 us   │ 454 us (6.2x faster)  │ HomeDb 1.3x faster! │
      └─────────────┴────────────┴───────────────────────┴─────────────────────┘

- RangeIterator: replace Vec::remove(0) with cursor index — O(1) per
  element instead of O(n) shift. Eliminates ~500K element moves when
  draining a 1000-entry batch.
- Btree::query_next_batch(): fix inverted is_sweep_query routing —
  sweep queries now continue with sweep_query_internal and traversal
  queries continue with traversal_query_internal (was swapped).

 ┌─────────────┬────────────┬───────────────────────┬─────────────────────┐
 │  Scan Size  │ Before Fix │       After Fix       │ vs RocksDB PT+noWAL │
 ├─────────────┼────────────┼───────────────────────┼─────────────────────┤
 │ 100 keys    │ 20.0 us    │ 12.2 us (1.6x faster) │ 1.9x slower         │
 ├─────────────┼────────────┼───────────────────────┼─────────────────────┤
 │ 1,000 keys  │ 276 us     │ 152 us (1.8x faster)  │ 2.5x slower         │
 ├─────────────┼────────────┼───────────────────────┼─────────────────────┤
 │ 5,000 keys  │ 1,380 us   │ 454 us (3.0x faster)  │ 1.5x slower         │
 ├─────────────┼────────────┼───────────────────────┼─────────────────────┤
 │ 10,000 keys │ 2,810 us   │ 454 us (6.2x faster)  │ HomeDb 1.3x faster! │
 └─────────────┴────────────┴───────────────────────┴─────────────────────┘
self.sweep_query_internal(req).await
} else {
// Traversal query continues with traversal (supports reverse, no sibling links)
self.traversal_query_internal(req).await
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How did it even work earlier was a wonder :-)

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.

2 participants