pub struct SoaBatch<'a> {
pub commit_ts: Vec<u64>,
pub txn_ids: Vec<u64>,
pub keys: Vec<&'a [u8]>,
pub value_handles: Vec<Option<ValueHandle<'a>>>,
pub visibility: Vec<bool>,
pub selection: Vec<usize>,
}Expand description
Structure of Arrays (SoA) batch for optimal SIMD visibility filtering
§Why SoA?
AoS (Array of Structures) layout:
[key, value, commit_ts, txn_id], [key, value, commit_ts, txn_id], ...- Poor cache utilization for visibility checks
- SIMD loads scatter data across cache lines
SoA (Structure of Arrays) layout:
commit_ts: [ts1, ts2, ts3, ts4, ...] // Contiguous for SIMD
txn_ids: [id1, id2, id3, id4, ...] // Contiguous for SIMD
keys: [k1, k2, k3, k4, ...] // Only accessed for visible rows
values: [v1, v2, v3, v4, ...] // Late materializedSIMD can process 4-8 timestamps per cycle with perfect cache utilization.
§Late Materialization
Values are NOT copied into the batch. Instead, we store offsets/handles and only materialize values for rows that pass visibility filtering.
For scans where 90% of rows are filtered out, this saves ~90% of value copies.
Fields§
§commit_ts: Vec<u64>Contiguous commit timestamps for SIMD visibility filtering
txn_ids: Vec<u64>Contiguous transaction IDs for self-visibility checking
keys: Vec<&'a [u8]>Key references (zero-copy)
value_handles: Vec<Option<ValueHandle<'a>>>Value materializer handles (late binding) None = tombstone, Some = handle to materialize value
visibility: Vec<bool>Pre-computed visibility mask (after SIMD filtering)
selection: Vec<usize>Selection vector: indices of visible rows for late materialization
Implementations§
Source§impl<'a> SoaBatch<'a>
impl<'a> SoaBatch<'a>
Sourcepub fn with_capacity(capacity: usize) -> Self
pub fn with_capacity(capacity: usize) -> Self
Create a new SoA batch with capacity
Sourcepub fn push(
&mut self,
key: &'a [u8],
value: Option<&'a [u8]>,
commit_ts: u64,
txn_id: u64,
)
pub fn push( &mut self, key: &'a [u8], value: Option<&'a [u8]>, commit_ts: u64, txn_id: u64, )
Add an entry to the batch (SoA decomposition)
Sourcepub fn push_deferred(
&mut self,
key: &'a [u8],
handle: Option<ValueHandle<'a>>,
commit_ts: u64,
txn_id: u64,
)
pub fn push_deferred( &mut self, key: &'a [u8], handle: Option<ValueHandle<'a>>, commit_ts: u64, txn_id: u64, )
Add with block handle (for disk-resident values)
Sourcepub fn filter_visibility(
&mut self,
snapshot_ts: u64,
current_txn_id: Option<u64>,
)
pub fn filter_visibility( &mut self, snapshot_ts: u64, current_txn_id: Option<u64>, )
Apply SIMD visibility filtering and build selection vector
This is the hot path - SIMD processes commit_ts array directly without touching keys/values until we know what’s visible.
Sourcepub fn visible_count(&self) -> usize
pub fn visible_count(&self) -> usize
Get visible row count (after filtering)
Trait Implementations§
Auto Trait Implementations§
impl<'a> Freeze for SoaBatch<'a>
impl<'a> RefUnwindSafe for SoaBatch<'a>
impl<'a> Send for SoaBatch<'a>
impl<'a> Sync for SoaBatch<'a>
impl<'a> Unpin for SoaBatch<'a>
impl<'a> UnsafeUnpin for SoaBatch<'a>
impl<'a> UnwindSafe for SoaBatch<'a>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more