Repository: spiraldb/vortex
Pull request #3099: Fallback to datafusion's repartitioning logic
Author: login: AdamGS
Created: 2025-04-23T18:10:11Z | Merged: 2025-04-29T09:45:04Z

This PR changes the scan repartition logic from our custom implementation to the default one that can split a file into multiple partitions.
We use the byte ranges it generates to calculate row splits in a deterministic way.


Diff:
diff --git a/.github/workflows/sql-benchmarks.yml b/.github/workflows/sql-benchmarks.yml
index e85069d7ac3..46213244d94 100644
--- a/.github/workflows/sql-benchmarks.yml
+++ b/.github/workflows/sql-benchmarks.yml
@@ -77,9 +77,11 @@ jobs:
 
       - name: Generate data
         shell: bash
-        run:
+        run: |
           # Generate data, running each query once to make sure they don't panic.
-          target/release_debug/${{ matrix.binary_name }} --targets datafusion:parquet,datafusion:vortex,duckdb:vortex -i1
+          target/release_debug/${{ matrix.binary_name }} --targets datafusion:parquet -i1 -d gh-json
+          target/release_debug/${{ matrix.binary_name }} --targets datafusion:vortex -i1 -d gh-json
+          target/release_debug/${{ matrix.binary_name }} --targets duckdb:vortex -i1 -d gh-json
 
       - name: Upload data
         if: matrix.remote_storage != null
diff --git a/Cargo.lock b/Cargo.lock
index 0950c1bb933..b691ec93a70 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -5971,6 +5971,7 @@ dependencies = [
  "arrow-schema",
  "async-trait",
  "chrono",
+ "dashmap",
  "datafusion",
  "datafusion-common",
  "datafusion-execution",
@@ -5984,6 +5985,7 @@ dependencies = [
  "object_store",
  "pin-project",
  "rand 0.9.1",
+ "rstest",
  "tempfile",
  "tokio",
  "tokio-stream",
@@ -6322,6 +6324,7 @@ dependencies = [
  "getrandom 0.3.2",
  "itertools 0.14.0",
  "log",
+ "parking_lot",
  "prost",
  "roaring",
  "rstest",
diff --git a/vortex-datafusion/Cargo.toml b/vortex-datafusion/Cargo.toml
index 7488e02868e..059cd39ea5c 100644
--- a/vortex-datafusion/Cargo.toml
+++ b/vortex-datafusion/Cargo.toml
@@ -18,6 +18,7 @@ arrow-array = { workspace = true }
 arrow-schema = { workspace = true }
 async-trait = { workspace = true }
 chrono = { workspace = true }
+dashmap = { workspace = true }
 datafusion = { workspace = true }
 datafusion-common = { workspace = true }
 datafusion-execution = { workspace = true }
@@ -58,6 +59,7 @@ tracing = [
 
 [dev-dependencies]
 anyhow = { workspace = true }
+rstest = { workspace = true }
 tempfile = { workspace = true }
 tokio = { workspace = true, features = ["test-util", "rt-multi-thread", "fs"] }
 url = { workspace = true }
diff --git a/vortex-datafusion/src/persistent/cache.rs b/vortex-datafusion/src/persistent/cache.rs
index b8a8d26370b..895bb1fa98b 100644
--- a/vortex-datafusion/src/persistent/cache.rs
+++ b/vortex-datafusion/src/persistent/cache.rs
@@ -59,7 +59,7 @@ impl VortexFileCache {
         metrics: VortexMetrics,
     ) -> Self {
         let file_cache = Cache::builder()
-            .max_capacity(size_mb as u64 * (2 << 20))
+            .max_capacity(size_mb as u64 * (1 << 20))
             .eviction_listener(|k: Arc<FileKey>, _v: VortexFile, cause| {
                 log::trace!("Removed {:?} due to {:?}", k, cause);
             })
@@ -69,7 +69,7 @@ impl VortexFileCache {
             .build_with_hasher(DefaultHashBuilder::default());
 
         let segment_cache = Cache::builder()
-            .max_capacity(segment_size_mb as u64 * (2 << 20))
+            .max_capacity(segment_size_mb as u64 * (1 << 20))
             .eviction_listener(|k: Arc<SegmentKey>, _v: ByteBuffer, cause| {
                 log::trace!("Removed {:?} due to {:?}", k, cause);
             })
diff --git a/vortex-datafusion/src/persistent/opener.rs b/vortex-datafusion/src/persistent/opener.rs
index 94357a1625c..b2c7f6ec829 100644
--- a/vortex-datafusion/src/persistent/opener.rs
+++ b/vortex-datafusion/src/persistent/opener.rs
@@ -1,13 +1,19 @@
-use std::sync::Arc;
+use std::ops::Range;
+use std::sync::{Arc, Weak};
 
 use arrow_schema::{ArrowError, SchemaRef};
+use dashmap::{DashMap, Entry};
 use datafusion::datasource::physical_plan::{FileMeta, FileOpenFuture, FileOpener};
 use datafusion_common::Result as DFResult;
 use futures::{FutureExt as _, StreamExt, TryStreamExt};
 use object_store::ObjectStore;
+use object_store::path::Path;
 use tokio::runtime::Handle;
+use vortex_array::ArrayRef;
 use vortex_error::VortexError;
 use vortex_expr::{ExprRef, VortexExpr};
+use vortex_file::scan::ScanBuilder;
+use vortex_layout::LayoutReader;
 use vortex_layout::scan::SplitBy;
 use vortex_metrics::VortexMetrics;
 
@@ -22,6 +28,7 @@ pub(crate) struct VortexFileOpener {
     pub projected_arrow_schema: SchemaRef,
     pub batch_size: usize,
     metrics: VortexMetrics,
+    layout_readers: Arc<DashMap<Path, Weak<dyn LayoutReader>>>,
 }
 
 impl VortexFileOpener {
@@ -34,6 +41,7 @@ impl VortexFileOpener {
         projected_arrow_schema: SchemaRef,
         batch_size: usize,
         metrics: VortexMetrics,
+        layout_readers: Arc<DashMap<Path, Weak<dyn LayoutReader>>>,
     ) -> Self {
         Self {
             object_store,
@@ -43,6 +51,7 @@ impl VortexFileOpener {
             projected_arrow_schema,
             batch_size,
             metrics,
+            layout_readers,
         }
     }
 }
@@ -56,12 +65,39 @@ impl FileOpener for VortexFileOpener {
         let projected_arrow_schema = self.projected_arrow_schema.clone();
         let metrics = self.metrics.clone();
         let batch_size = self.batch_size;
+        let layout_reader = self.layout_readers.clone();
 
         Ok(async move {
-            Ok(file_cache
+            let vxf = file_cache
                 .try_get(&file_meta.object_meta, object_store)
-                .await?
-                .scan()?
+                .await?;
+
+            // We share out layout readers with others partitions in the scan, so we can only need to read each layout in each file once.
+            let layout_reader = match layout_reader.entry(file_meta.object_meta.location.clone()) {
+                Entry::Occupied(mut occupied_entry) => {
+                    if let Some(reader) = occupied_entry.get().upgrade() {
+                        log::trace!("reusing layout reader for {}", occupied_entry.key());
+                        reader
+                    } else {
+                        log::trace!("creating layout reader for {}", occupied_entry.key());
+                        let reader = vxf.layout_reader()?;
+                        occupied_entry.insert(Arc::downgrade(&reader));
+                        reader
+                    }
+                }
+                Entry::Vacant(vacant_entry) => {
+                    log::trace!("creating layout reader for {}", vacant_entry.key());
+                    let reader = vxf.layout_reader()?;
+                    vacant_entry.insert(Arc::downgrade(&reader));
+
+                    reader
+                }
+            };
+
+            let scan_builder = ScanBuilder::new(layout_reader);
+            let scan_builder = apply_byte_range(file_meta, vxf.row_count(), scan_builder);
+
+            Ok(scan_builder
                 .with_tokio_executor(Handle::current())
                 .with_metrics(metrics)
                 .with_projection(projection)
@@ -78,3 +114,83 @@ impl FileOpener for VortexFileOpener {
         .boxed())
     }
 }
+
+/// If the file has a [`FileRange`](datafusion::datasource::listing::FileRange), we translate it into a row range in the file for the scan.
+fn apply_byte_range(
+    file_meta: FileMeta,
+    row_count: u64,
+    scan_builder: ScanBuilder<ArrayRef>,
+) -> ScanBuilder<ArrayRef> {
+    if let Some(byte_range) = file_meta.range {
+        let row_range = byte_range_to_row_range(
+            byte_range.start as u64..byte_range.end as u64,
+            row_count,
+            file_meta.object_meta.size as u64,
+        );
+
+        scan_builder.with_row_range(row_range)
+    } else {
+        scan_builder
+    }
+}
+
+fn byte_range_to_row_range(byte_range: Range<u64>, row_count: u64, total_size: u64) -> Range<u64> {
+    let average_row = total_size / row_count;
+    assert!(average_row > 0, "A row must always have at least one byte");
+
+    let start_row = byte_range.start / average_row;
+    let end_row = byte_range.end / average_row;
+
+    // We take the min here as `end_row` might overshoot
+    start_row..u64::min(row_count, end_row)
+}
+
+#[cfg(test)]
+mod tests {
+    use itertools::Itertools;
+    use rstest::rstest;
+
+    use super::*;
+
+    #[rstest]
+    #[case(0..100, 100, 100, 0..100)]
+    #[case(0..105, 100, 105, 0..100)]
+    #[case(0..50, 100, 105, 0..50)]
+    #[case(50..105, 100, 105, 50..100)]
+    #[case(0..1, 4, 8, 0..0)]
+    #[case(1..8, 4, 8, 0..4)]
+    fn test_range_translation(
+        #[case] byte_range: Range<u64>,
+        #[case] row_count: u64,
+        #[case] total_size: u64,
+        #[case] expected: Range<u64>,
+    ) {
+        assert_eq!(
+            byte_range_to_row_range(byte_range, row_count, total_size),
+            expected
+        );
+    }
+
+    #[test]
+    fn test_consecutive_ranges() {
+        let row_count = 100;
+        let total_size = 429;
+        let bytes_a = 0..143;
+        let bytes_b = 143..286;
+        let bytes_c = 286..429;
+
+        let rows_a = byte_range_to_row_range(bytes_a, row_count, total_size);
+        let rows_b = byte_range_to_row_range(bytes_b, row_count, total_size);
+        let rows_c = byte_range_to_row_range(bytes_c, row_count, total_size);
+
+        assert_eq!(rows_a.end - rows_a.start, 35);
+        assert_eq!(rows_b.end - rows_b.start, 36);
+        assert_eq!(rows_c.end - rows_c.start, 29);
+
+        assert_eq!(rows_a.start, 0);
+        assert_eq!(rows_c.end, 100);
+        for (left, right) in [rows_a, rows_b, rows_c].iter().tuple_windows() {
+            assert_eq!(left.end, right.start);
+        }
+    }
+}
diff --git a/vortex-datafusion/src/persistent/source.rs b/vortex-datafusion/src/persistent/source.rs
index 53003c75f29..3ac32ff9c8c 100644
--- a/vortex-datafusion/src/persistent/source.rs
+++ b/vortex-datafusion/src/persistent/source.rs
@@ -1,17 +1,17 @@
 use std::any::Any;
-use std::collections::VecDeque;
-use std::sync::Arc;
+use std::sync::{Arc, Weak};
 
 use arrow_schema::SchemaRef;
-use datafusion::datasource::listing::PartitionedFile;
+use dashmap::DashMap;
 use datafusion::datasource::physical_plan::{FileOpener, FileScanConfig, FileSource};
 use datafusion_common::{Result as DFResult, Statistics};
 use datafusion_physical_plan::metrics::ExecutionPlanMetricsSet;
-use itertools::Itertools as _;
 use object_store::ObjectStore;
+use object_store::path::Path;
 use vortex_error::VortexExpect as _;
 use vortex_expr::{Identity, VortexExpr};
 use vortex_file::VORTEX_FILE_EXTENSION;
+use vortex_layout::LayoutReader;
 use vortex_metrics::VortexMetrics;
 
 use super::cache::VortexFileCache;
@@ -32,6 +32,10 @@ pub struct VortexSource {
     pub(crate) arrow_schema: Option<SchemaRef>,
     pub(crate) metrics: VortexMetrics,
     _unused_df_metrics: ExecutionPlanMetricsSet,
+    /// Shared layout readers, the source only lives as long as one scan.
+    ///
+    /// Sharing the readers allows us to only read every layout once from the file, even across partitions.
+    layout_readers: Arc<DashMap<Path, Weak<dyn LayoutReader>>>,
 }
 
 impl VortexSource {
@@ -45,6 +49,7 @@ impl VortexSource {
             arrow_schema: None,
             predicate: None,
             _unused_df_metrics: Default::default(),
+            layout_readers: Arc::new(DashMap::default()),
         }
     }
 
@@ -81,6 +86,7 @@ impl FileSource for VortexSource {
                 .vortex_expect("We should have a schema here"),
             batch_size,
             partition_metrics,
+            self.layout_readers.clone(),
         );
 
         Arc::new(opener)
@@ -151,136 +157,4 @@ impl FileSource for VortexSource {
     fn file_type(&self) -> &str {
         VORTEX_FILE_EXTENSION
     }
-
-    fn repartitioned(
-        &self,
-        target_partitions: usize,
-        _repartition_file_min_size: usize,
-        _output_ordering: Option<datafusion_physical_expr::LexOrdering>,
-        config: &FileScanConfig,
-    ) -> DFResult<Option<FileScanConfig>> {
-        let mut new_config = config.clone();
-        let file_groups = std::mem::take(&mut new_config.file_groups);
-        new_config.file_groups = repartition_by_size(file_groups, target_partitions);
-
-        Ok(Some(new_config))
-    }
-}
-
-pub(crate) fn repartition_by_size(
-    file_groups: Vec<Vec<PartitionedFile>>,
-    desired_partitions: usize,
-) -> Vec<Vec<PartitionedFile>> {
-    let total_file_count = file_groups.iter().map(|f| f.len()).sum::<usize>();
-    let total_size = file_groups
-        .iter()
-        .flatten()
-        .map(|f| f.object_meta.size)
-        .sum::<usize>();
-    let target_partition_size = total_size / desired_partitions;
-    let average_partition_file_count = total_file_count / desired_partitions;
-
-    let mut partitions = Vec::with_capacity(desired_partitions);
-
-    let mut curr_partition_size = 0;
-    let mut curr_partition = Vec::with_capacity(average_partition_file_count);
-
-    let mut all_files = VecDeque::from_iter(
-        file_groups
-            .into_iter()
-            .flatten()
-            .sorted_unstable_by_key(|f| f.object_meta.size),
-    );
-
-    while !all_files.is_empty() && partitions.len() < desired_partitions {
-        // If the current partition is empty, we want to bootstrap it with the biggest file we have leftover.
-        let file = if curr_partition.is_empty() {
-            all_files.pop_back()
-        // If we already have files in the partition, we try and fill it up.
-        } else {
-            // Peak at the biggest file left
-            let biggest_file_size = all_files
-                .back()
-                .vortex_expect("We must have at least one item")
-                .object_meta
-                .size;
-
-            let smallest_file_size = all_files
-                .front()
-                .vortex_expect("We must have at least one item")
-                .object_meta
-                .size;
-
-            // We try and find a file on either end that fits in the partition
-            if curr_partition_size + biggest_file_size >= target_partition_size {
-                all_files.pop_front()
-            } else if curr_partition_size + smallest_file_size >= target_partition_size {
-                all_files.pop_back()
-            } else {
-                None
-            }
-        };
-
-        let missing_file = file.is_none();
-        // Add a file to the partition
-        if let Some(file) = file {
-            curr_partition_size += file.object_meta.size;
-            curr_partition.push(file);
-        }
-
-        // If the partition is full, move on to the next one
-        if curr_partition_size >= target_partition_size || missing_file {
-            curr_partition_size = 0;
-            partitions.push(std::mem::replace(
-                &mut curr_partition,
-                Vec::with_capacity(average_partition_file_count),
-            ));
-        }
-    }
-
-    // If we're still missing the last partition
-    if !curr_partition.is_empty() && partitions.len() != desired_partitions {
-        partitions.push(std::mem::take(&mut curr_partition));
-    } else if !curr_partition.is_empty() {
-        for (idx, file) in curr_partition.into_iter().enumerate() {
-            let new_part_idx = idx % partitions.len();
-            partitions[new_part_idx].push(file);
-        }
-    }
-
-    for (idx, file) in all_files.into_iter().enumerate() {
-        let new_part_idx = idx % partitions.len();
-        partitions[new_part_idx].push(file);
-    }
-
-    // Assert that we have the correct number of partitions and that the total number of files is right
-    assert_eq!(total_file_count, partitions.iter().flatten().count());
-
-    partitions
-}
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-
-    #[test]
-    fn basic_repartition_test() {
-        let file_groups = vec![vec![
-            PartitionedFile::new("a", 100),
-            PartitionedFile::new("b", 25),
-            PartitionedFile::new("c", 25),
-            PartitionedFile::new("d", 25),
-            PartitionedFile::new("e", 50),
-        ]];
-
-        repartition_by_size(file_groups, 2);
-
-        let file_groups = vec![
-            (0..100)
-                .map(|idx| PartitionedFile::new(format!("{idx}"), idx))
-                .collect(),
-        ];
-
-        repartition_by_size(file_groups, 16);
-    }
 }
diff --git a/vortex-file/src/driver.rs b/vortex-file/src/driver.rs
index 225961fc8f9..276017028f5 100644
--- a/vortex-file/src/driver.rs
+++ b/vortex-file/src/driver.rs
@@ -31,7 +31,7 @@ pub struct CoalescedDriver {
     performance_hint: PerformanceHint,
     /// The maximum number of bytes to hold in the prefetch buffer.
     max_prefetch_bytes: i64,
-
+    max_prefetch_inflight_requests: usize,
     first_poll: bool,
     state: HashMap<SegmentId, PendingSegment>,
     /// Maintain a set of segments that have been requested, ordered by insertion.
@@ -40,6 +40,8 @@ pub struct CoalescedDriver {
     polled: LinkedHashSet<SegmentId>,
     /// The number of bytes that have been prefetched but not yet consumed.
     prefetched_bytes: i64,
+
+    inflight_prefetch_lease: Arc<()>,
 }
 
 struct PendingSegment {
@@ -69,12 +71,14 @@ impl CoalescedDriver {
 
             performance_hint,
             max_prefetch_bytes: 32 << 20, // 32 MB
-
+            max_prefetch_inflight_requests: 1,
             first_poll: false,
             state: Default::default(),
             requested: Default::default(),
             polled: Default::default(),
             prefetched_bytes: 0,
+
+            inflight_prefetch_lease: Arc::new(()),
         }
     }
 
@@ -119,7 +123,7 @@ impl CoalescedDriver {
     }
 
     fn on_requested(&mut self, request: SegmentRequest) {
-        self.requested.insert(request.id());
+        self.requested.insert_if_absent(request.id());
         self.state.insert(
             request.id(),
             PendingSegment {
@@ -140,7 +144,7 @@ impl CoalescedDriver {
 
         let state = self.segment_state_mut(id);
         state.polled = true;
-        self.polled.insert(id);
+        self.polled.insert_if_absent(id);
         self.polled_counter.inc();
     }
 
@@ -155,7 +159,11 @@ impl CoalescedDriver {
     fn on_resolved(&mut self, _id: SegmentId) {}
 
     /// Request a segment from the underlying storage.
-    fn coalesce_request(&mut self, request: SegmentRequest) -> CoalescedSegmentRequest {
+    fn coalesce_request(
+        &mut self,
+        request: SegmentRequest,
+        lease: Option<Arc<()>>,
+    ) -> CoalescedSegmentRequest {
         let spec = self.segment_spec(request.id());
 
         // We start with the requested segment, and then loop in any additional segments that fall
@@ -164,6 +172,7 @@ impl CoalescedDriver {
             byte_range: spec.byte_range(),
             requests: vec![request],
             segment_map: self.segment_map.clone(),
+            lease,
         };
 
         // TODO(ngates): dynamically update the coalescing window based on request duration.
@@ -243,7 +252,7 @@ impl CoalescedDriver {
         coalesced.requests.sort_by_key(|r| r.id());
 
         // Maintain the prefetch buffer count.
-        for request in &coalesced.requests {
+        for request in coalesced.requests.iter() {
             self.mark_as_prefetched(request.id());
         }
 
@@ -290,7 +299,7 @@ impl Stream for CoalescedDriver {
                 .get_mut(&id)
                 .and_then(|state| state.request.take())
             {
-                return Poll::Ready(Some(this.coalesce_request(request)));
+                return Poll::Ready(Some(this.coalesce_request(request, None)));
             }
         }
 
@@ -300,14 +309,19 @@ impl Stream for CoalescedDriver {
             this.prefetched_bytes,
             this.max_prefetch_bytes
         );
-        if this.prefetched_bytes < this.max_prefetch_bytes {
+
+        if this.prefetched_bytes < this.max_prefetch_bytes
+            && Arc::strong_count(&this.inflight_prefetch_lease) - 1
+                < this.max_prefetch_inflight_requests
+        {
             while let Some(id) = this.requested.pop_front() {
                 if let Some(request) = this
                     .state
                     .get_mut(&id)
                     .and_then(|state| state.request.take())
                 {
-                    let coalesced = this.coalesce_request(request);
+                    let coalesced =
+                        this.coalesce_request(request, Some(this.inflight_prefetch_lease.clone()));
                     log::debug!("Prefetching: {:?}", coalesced);
                     return Poll::Ready(Some(coalesced));
                 }
@@ -326,6 +340,8 @@ pub struct CoalescedSegmentRequest {
     requests: Vec<SegmentRequest>,
     /// A copy of the segment map so we can resolve the requests.
     segment_map: Arc<[SegmentSpec]>,
+    #[allow(dead_code)]
+    lease: Option<Arc<()>>,
 }
 
 impl Debug for CoalescedSegmentRequest {
diff --git a/vortex-layout/Cargo.toml b/vortex-layout/Cargo.toml
index 9fafca11e51..eff273921d6 100644
--- a/vortex-layout/Cargo.toml
+++ b/vortex-layout/Cargo.toml
@@ -27,6 +27,7 @@ futures = { workspace = true, features = ["alloc", "async-await", "executor"] }
 getrandom_v03 = { workspace = true }
 itertools = { workspace = true }
 log = { workspace = true }
+parking_lot = { workspace = true }
 prost = { workspace = true }
 roaring = { workspace = true, optional = true }
 sketches-ddsketch = { workspace = true }


Reviews:
user: login: AdamGS
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-24T17:11:20Z
user: login: gatesn
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-25T09:36:26Z
user: login: gatesn
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-25T09:38:35Z
user: login: gatesn
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-29T09:44:57Z

Review comments:
diff_hunk: @@ -32,6 +32,7 @@ pub struct VortexSource {
     pub(crate) arrow_schema: Option<SchemaRef>,
     pub(crate) metrics: VortexMetrics,
     _unused_df_metrics: ExecutionPlanMetricsSet,
+    layout_readers: DashMap<Path, Arc<dyn LayoutReader>>,
path: vortex-datafusion/src/persistent/source.rs
user: login: AdamGS
body: The lifetime of this cache is just `VortexSource`, which is initialized per query so we can just use the path as the key, without m_time
created_at: 2025-04-24T17:11:20Z
author_association: CONTRIBUTOR
diff_hunk: @@ -78,3 +98,19 @@ impl FileOpener for VortexFileOpener {
         .boxed())
     }
 }
+
+fn apply_plan(
+    file_meta: FileMeta,
+    row_count: u64,
+    scan_builder: ScanBuilder<ArrayRef>,
+) -> ScanBuilder<ArrayRef> {
+    if let Some(byte_range) = file_meta.range.as_ref() {
+        let average_row = file_meta.object_meta.size as u64 / row_count;
path: vortex-datafusion/src/persistent/opener.rs
user: login: gatesn
body: Add a couple of tests just to make sure that these divisions do end up covering all rows from start..end
created_at: 2025-04-25T09:36:26Z
author_association: CONTRIBUTOR
diff_hunk: @@ -22,6 +27,7 @@ pub(crate) struct VortexFileOpener {
     pub projected_arrow_schema: SchemaRef,
     pub batch_size: usize,
     metrics: VortexMetrics,
+    layout_readers: DashMap<Path, Arc<dyn LayoutReader>>,
path: vortex-datafusion/src/persistent/opener.rs
user: login: gatesn
body: Add a comment here explaining _why_ we're caching layout readers in the first place
created_at: 2025-04-25T09:38:35Z
author_association: CONTRIBUTOR

PR comments:
user: login: codspeed-hq[bot]
created_at: 2025-04-23T18:16:47Z
body: <!-- __CODSPEED_PERFORMANCE_REPORT_COMMENT__ -->
<!-- __CODSPEED_INSTRUMENTATION_PERFORMANCE_REPORT_COMMENT__ -->

## [CodSpeed Performance Report](https://codspeed.io/spiraldb/vortex/branches/adamg%2Frepartition-files-by-rows)

### Merging #3099 will **not alter performance**

<sub>Comparing <code>adamg/repartition-files-by-rows</code> (c797caa) with <code>develop</code> (787879d)</sub>



### Summary

`✅ 811` untouched benchmarks  




author_association: NONE
user: login: AdamGS
created_at: 2025-04-23T19:46:41Z
body: Still trying things here, but a couple of interesting things I've found:
1. While this is much better on queries like 28 (same latency as Parquet), it makes other queries much worse, especially 3, 8, 9, 36, 37, 38, 39, 40, 41 (the worse one - from x1.11 to x8.66), 42. Did some basic profiling on 41 and the profile is really bizzare, with a huge time just blocked on IO.
2. Removing the tokio spawner actually makes ~0 zero difference in performance in this setup.
3. Just winged bytes-to-rows translation, honestly no idea if its correct but TPC-H seems happy with the results.
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-04-25T10:44:20Z
body: # Benchmarks: TPC-H on NVME
<details>
<summary>Table of Results</summary>

| name                                       |   PR c797caa4 |   base b32f7a32 |   ratio (PR/base) | unit   |
|:-------------------------------------------|--------------:|----------------:|------------------:|:-------|
| tpch_q01/DataFusion:arrow                  |      44749440 |     4.92118e+07 |          0.909323 | ns     |
| tpch_q02/DataFusion:arrow                  |      35453697 |     3.73599e+07 |          0.948977 | ns     |
| tpch_q03/DataFusion:arrow                  |      22809118 |     2.3856e+07  |          0.956118 | ns     |
| tpch_q04/DataFusion:arrow                  |      19159040 |     2.02633e+07 |          0.945506 | ns     |
| tpch_q05/DataFusion:arrow                  |      35092136 |     3.7804e+07  |          0.928264 | ns     |
| tpch_q06/DataFusion:arrow                  |       4936978 |     5.37526e+06 |          0.918463 | ns     |
| tpch_q07/DataFusion:arrow                  |      68881980 |     7.37039e+07 |          0.934577 | ns     |
| tpch_q08/DataFusion:arrow                  |      37747075 |     4.0856e+07  |          0.923905 | ns     |
| tpch_q09/DataFusion:arrow                  |      53294801 |     5.86949e+07 |          0.907997 | ns     |
| tpch_q10/DataFusion:arrow                  |      42176934 |     4.39728e+07 |          0.959159 | ns     |
| tpch_q11/DataFusion:arrow                  |      19198718 |     2.06409e+07 |          0.93013  | ns     |
| tpch_q12/DataFusion:arrow                  |      18441012 |     1.94046e+07 |          0.950342 | ns     |
| tpch_q13/DataFusion:arrow                  |      15283881 |     1.56897e+07 |          0.974135 | ns     |
| tpch_q14/DataFusion:arrow                  |       7949363 |     8.72558e+06 |          0.911042 | ns     |
| tpch_q15/DataFusion:arrow                  |      18076185 |     1.9501e+07  |          0.926934 | ns     |
| tpch_q16/DataFusion:arrow                  |      16850640 |     1.75127e+07 |          0.962193 | ns     |
| tpch_q17/DataFusion:arrow                  |      52598525 |     5.64581e+07 |          0.931637 | ns     |
| tpch_q18/DataFusion:arrow                  |      93938202 |     1.04161e+08 |          0.901858 | ns     |
| tpch_q19/DataFusion:arrow                  |      16829731 |     1.72938e+07 |          0.973166 | ns     |
| tpch_q20/DataFusion:arrow                  |      27451261 |     2.91008e+07 |          0.943316 | ns     |
| tpch_q21/DataFusion:arrow                  |     104773342 |     1.10942e+08 |          0.944397 | ns     |
| tpch_q22/DataFusion:arrow                  |      10399679 |     1.07939e+07 |          0.96348  | ns     |
| tpch_q01/DataFusion:parquet                |     134783032 |     1.41094e+08 |          0.955271 | ns     |
| tpch_q02/DataFusion:parquet                |     107459193 |     1.09336e+08 |          0.98283  | ns     |
| tpch_q03/DataFusion:parquet                |     103270019 |     1.05031e+08 |          0.983238 | ns     |
| tpch_q04/DataFusion:parquet                |      61873344 |     6.45467e+07 |          0.958582 | ns     |
| tpch_q05/DataFusion:parquet                |     106232504 |     1.10286e+08 |          0.963246 | ns     |
| tpch_q06/DataFusion:parquet                |      28931269 |     4.01466e+07 |          0.720641 | ns     |
| tpch_q07/DataFusion:parquet                |     127592128 |     1.30664e+08 |          0.976493 | ns     |
| tpch_q08/DataFusion:parquet                |     140383654 |     1.43747e+08 |          0.976599 | ns     |
| tpch_q09/DataFusion:parquet                |     187988621 |     2.02128e+08 |          0.930047 | ns     |
| tpch_q10/DataFusion:parquet                |     148990140 |     1.52839e+08 |          0.97482  | ns     |
| tpch_q11/DataFusion:parquet                |      45225235 |     4.89071e+07 |          0.924717 | ns     |
| tpch_q12/DataFusion:parquet                |      79161280 |     8.23729e+07 |          0.961011 | ns     |
| tpch_q13/DataFusion:parquet                |     183170937 |     1.92848e+08 |          0.949818 | ns     |
| tpch_q14/DataFusion:parquet                |      50352535 |     5.14628e+07 |          0.978426 | ns     |
| tpch_q15/DataFusion:parquet                |      78807071 |     7.08706e+07 |          1.11199  | ns     |
| tpch_q16/DataFusion:parquet                |      44191087 |     4.91603e+07 |          0.898918 | ns     |
| tpch_q17/DataFusion:parquet                |     142317427 |     1.55061e+08 |          0.917814 | ns     |
| tpch_q18/DataFusion:parquet                |     207009602 |     2.25755e+08 |          0.916967 | ns     |
| tpch_q19/DataFusion:parquet                |      84650150 |     8.59804e+07 |          0.984528 | ns     |
| tpch_q20/DataFusion:parquet                |      99383403 |     1.0262e+08  |          0.968461 | ns     |
| tpch_q21/DataFusion:parquet                |     179213804 |     1.86953e+08 |          0.958601 | ns     |
| tpch_q22/DataFusion:parquet                |      50848425 |     5.31943e+07 |          0.9559   | ns     |
| tpch_q01/DataFusion:vortex-file-compressed |      44427388 |     4.22111e+07 |          1.0525   | ns     |
| tpch_q02/DataFusion:vortex-file-compressed |      42472608 |     4.71708e+07 |          0.9004   | ns     |
| tpch_q03/DataFusion:vortex-file-compressed |      27773193 |     2.71703e+07 |          1.02219  | ns     |
| tpch_q04/DataFusion:vortex-file-compressed |      15987219 |     1.46385e+07 |          1.09213  | ns     |
| tpch_q05/DataFusion:vortex-file-compressed |      40977438 |     4.3847e+07  |          0.934554 | ns     |
| tpch_q06/DataFusion:vortex-file-compressed |       7124044 |     5.64076e+06 |          1.26296  | ns     |
| tpch_q07/DataFusion:vortex-file-compressed |      59835049 |     6.10919e+07 |          0.979426 | ns     |
| tpch_q08/DataFusion:vortex-file-compressed |      50020836 |     5.14253e+07 |          0.972688 | ns     |
| tpch_q09/DataFusion:vortex-file-compressed |      65030674 |     7.24234e+07 |          0.897923 | ns     |
| tpch_q10/DataFusion:vortex-file-compressed |      43982329 |     5.38727e+07 |          0.816412 | ns     |
| tpch_q11/DataFusion:vortex-file-compressed |      19668363 |     2.21766e+07 |          0.886897 | ns     |
| tpch_q12/DataFusion:vortex-file-compressed |      18854926 |     1.6975e+07  |          1.11075  | ns     |
| tpch_q13/DataFusion:vortex-file-compressed |      19304104 |     2.02552e+07 |          0.953046 | ns     |
| tpch_q14/DataFusion:vortex-file-compressed |      10771449 |     1.04811e+07 |          1.02771  | ns     |
| tpch_q15/DataFusion:vortex-file-compressed |      18436444 |     1.81606e+07 |          1.01519  | ns     |
| tpch_q16/DataFusion:vortex-file-compressed |      22455695 |     2.33193e+07 |          0.962967 | ns     |
| tpch_q17/DataFusion:vortex-file-compressed |      60078009 |     6.54711e+07 |          0.917626 | ns     |
| tpch_q18/DataFusion:vortex-file-compressed |      95772133 |     1.02335e+08 |          0.935871 | ns     |
| tpch_q19/DataFusion:vortex-file-compressed |      32595391 |     2.70742e+07 |          1.20393  | ns     |
| tpch_q20/DataFusion:vortex-file-compressed |      27850184 |     2.94961e+07 |          0.944198 | ns     |
| tpch_q21/DataFusion:vortex-file-compressed |      87820188 |     8.91128e+07 |          0.985495 | ns     |
| tpch_q22/DataFusion:vortex-file-compressed |      12802936 |     2.97069e+07 |          0.430975 | ns     |
| tpch_q01/DuckDB:parquet                    |      88000000 |     8.9e+07     |          0.988764 | ns     |
| tpch_q02/DuckDB:parquet                    |      73000000 |     7.4e+07     |          0.986486 | ns     |
| tpch_q03/DuckDB:parquet                    |     153000000 |     1.55e+08    |          0.987097 | ns     |
| tpch_q04/DuckDB:parquet                    |      91000000 |     9.3e+07     |          0.978495 | ns     |
| tpch_q05/DuckDB:parquet                    |     123000000 |     1.25e+08    |          0.984    | ns     |
| tpch_q06/DuckDB:parquet                    |      42000000 |     4.3e+07     |          0.976744 | ns     |
| tpch_q07/DuckDB:parquet                    |     119000000 |     1.23e+08    |          0.96748  | ns     |
| tpch_q08/DuckDB:parquet                    |     154000000 |     1.55e+08    |          0.993548 | ns     |
| tpch_q09/DuckDB:parquet                    |     168000000 |     1.71e+08    |          0.982456 | ns     |
| tpch_q10/DuckDB:parquet                    |     402000000 |     4.06e+08    |          0.990148 | ns     |
| tpch_q11/DuckDB:parquet                    |      37000000 |     3.8e+07     |          0.973684 | ns     |
| tpch_q12/DuckDB:parquet                    |      89000000 |     9e+07       |          0.988889 | ns     |
| tpch_q13/DuckDB:parquet                    |     284000000 |     2.97e+08    |          0.956229 | ns     |
| tpch_q14/DuckDB:parquet                    |      77000000 |     7.8e+07     |          0.987179 | ns     |
| tpch_q15/DuckDB:parquet                    |      53000000 |     5.4e+07     |          0.981481 | ns     |
| tpch_q16/DuckDB:parquet                    |      99000000 |     1.02e+08    |          0.970588 | ns     |
| tpch_q17/DuckDB:parquet                    |      85000000 |     8.6e+07     |          0.988372 | ns     |
| tpch_q18/DuckDB:parquet                    |     138000000 |     1.4e+08     |          0.985714 | ns     |
| tpch_q19/DuckDB:parquet                    |      98000000 |     1.01e+08    |          0.970297 | ns     |
| tpch_q20/DuckDB:parquet                    |     107000000 |     1.08e+08    |          0.990741 | ns     |
| tpch_q21/DuckDB:parquet                    |     179000000 |     1.8e+08     |          0.994444 | ns     |
| tpch_q22/DuckDB:parquet                    |      72000000 |     7.2e+07     |          1        | ns     |
| tpch_q01/DuckDB:vortex-file-compressed     |     306000000 |     3.11e+08    |          0.983923 | ns     |
| tpch_q02/DuckDB:vortex-file-compressed     |      87000000 |     9.2e+07     |          0.945652 | ns     |
| tpch_q03/DuckDB:vortex-file-compressed     |     291000000 |     2.98e+08    |          0.97651  | ns     |
| tpch_q04/DuckDB:vortex-file-compressed     |     184000000 |     1.88e+08    |          0.978723 | ns     |
| tpch_q05/DuckDB:vortex-file-compressed     |     420000000 |     4.34e+08    |          0.967742 | ns     |
| tpch_q06/DuckDB:vortex-file-compressed     |      41000000 |     4.4e+07     |          0.931818 | ns     |
| tpch_q07/DuckDB:vortex-file-compressed     |     216000000 |     2.23e+08    |          0.96861  | ns     |
| tpch_q08/DuckDB:vortex-file-compressed     |     432000000 |     4.41e+08    |          0.979592 | ns     |
| tpch_q09/DuckDB:vortex-file-compressed     |     833000000 |     8.94e+08    |          0.931767 | ns     |
| tpch_q10/DuckDB:vortex-file-compressed     |     418000000 |     4.29e+08    |          0.974359 | ns     |
| tpch_q11/DuckDB:vortex-file-compressed     |      58000000 |     6e+07       |          0.966667 | ns     |
| tpch_q12/DuckDB:vortex-file-compressed     |     218000000 |     2.2e+08     |          0.990909 | ns     |
| tpch_q13/DuckDB:vortex-file-compressed     |     270000000 |     2.82e+08    |          0.957447 | ns     |
| tpch_q14/DuckDB:vortex-file-compressed     |      55000000 |     5.8e+07     |          0.948276 | ns     |
| tpch_q15/DuckDB:vortex-file-compressed     |      55000000 |     5.9e+07     |          0.932203 | ns     |
| tpch_q16/DuckDB:vortex-file-compressed     |     110000000 |     1.13e+08    |          0.973451 | ns     |
| tpch_q17/DuckDB:vortex-file-compressed     |     112000000 |     1.13e+08    |          0.99115  | ns     |
| tpch_q18/DuckDB:vortex-file-compressed     |     304000000 |     3.08e+08    |          0.987013 | ns     |
| tpch_q19/DuckDB:vortex-file-compressed     |     120000000 |     1.23e+08    |          0.97561  | ns     |
| tpch_q20/DuckDB:vortex-file-compressed     |     118000000 |     1.2e+08     |          0.983333 | ns     |
| tpch_q21/DuckDB:vortex-file-compressed     |     644000000 |     6.72e+08    |          0.958333 | ns     |
| tpch_q22/DuckDB:vortex-file-compressed     |      53000000 |     5.5e+07     |          0.963636 | ns     |
| tpch_q01/DuckDB:duckdb                     |      28000000 |     2.8e+07     |          1        | ns     |
| tpch_q02/DuckDB:duckdb                     |      22000000 |     2.3e+07     |          0.956522 | ns     |
| tpch_q03/DuckDB:duckdb                     |      56000000 |     5.6e+07     |          1        | ns     |
| tpch_q04/DuckDB:duckdb                     |      24000000 |     2.5e+07     |          0.96     | ns     |
| tpch_q05/DuckDB:duckdb                     |      35000000 |     3.7e+07     |          0.945946 | ns     |
| tpch_q06/DuckDB:duckdb                     |      15000000 |     1.3e+07     |          1.15385  | ns     |
| tpch_q07/DuckDB:duckdb                     |      34000000 |     3.6e+07     |          0.944444 | ns     |
| tpch_q08/DuckDB:duckdb                     |      33000000 |     3.3e+07     |          1        | ns     |
| tpch_q09/DuckDB:duckdb                     |      69000000 |     7.2e+07     |          0.958333 | ns     |
| tpch_q10/DuckDB:duckdb                     |     277000000 |     2.85e+08    |          0.97193  | ns     |
| tpch_q11/DuckDB:duckdb                     |      10000000 |     1.1e+07     |          0.909091 | ns     |
| tpch_q12/DuckDB:duckdb                     |      29000000 |     3.1e+07     |          0.935484 | ns     |
| tpch_q13/DuckDB:duckdb                     |      42000000 |     4.3e+07     |          0.976744 | ns     |
| tpch_q14/DuckDB:duckdb                     |      29000000 |     3.1e+07     |          0.935484 | ns     |
| tpch_q15/DuckDB:duckdb                     |      40000000 |     3.9e+07     |          1.02564  | ns     |
| tpch_q16/DuckDB:duckdb                     |      58000000 |     6e+07       |          0.966667 | ns     |
| tpch_q17/DuckDB:duckdb                     |      31000000 |     3e+07       |          1.03333  | ns     |
| tpch_q18/DuckDB:duckdb                     |      49000000 |     4.9e+07     |          1        | ns     |
| tpch_q19/DuckDB:duckdb                     |      42000000 |     4.4e+07     |          0.954545 | ns     |
| tpch_q20/DuckDB:duckdb                     |      35000000 |     3.5e+07     |          1        | ns     |
| tpch_q21/DuckDB:duckdb                     |      65000000 |     6.7e+07     |          0.970149 | ns     |
| tpch_q22/DuckDB:duckdb                     |      33000000 |     3.3e+07     |          1        | ns     |
</details>

<!-- thollander/actions-comment-pull-request "bench-pr-comment-tpch-nvme" -->
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-04-25T10:48:11Z
body: # Benchmarks: TPC-H on S3
<details>
<summary>Table of Results</summary>

| name                                       |   PR c797caa4 |   base b32f7a32 |   ratio (PR/base) | unit   |
|:-------------------------------------------|--------------:|----------------:|------------------:|:-------|
| tpch_q01/DataFusion:parquet                |     297471597 |     2.96305e+08 |          1.00394  | ns     |
| tpch_q02/DataFusion:parquet                |     716023798 |     7.22298e+08 |          0.991313 | ns     |
| tpch_q03/DataFusion:parquet                |     436724647 |     4.51677e+08 |          0.966897 | ns     |
| tpch_q04/DataFusion:parquet                |     248647486 |     2.48572e+08 |          1.0003   | ns     |
| tpch_q05/DataFusion:parquet                |     612670110 |     6.14212e+08 |          0.997489 | ns     |
| tpch_q06/DataFusion:parquet                |     193885455 |     1.92998e+08 |          1.0046   | ns     |
| tpch_q07/DataFusion:parquet                |     683462842 |     6.61059e+08 |          1.03389  | ns     |
| tpch_q08/DataFusion:parquet                |     837597918 |     8.40785e+08 |          0.99621  | ns     |
| tpch_q09/DataFusion:parquet                |     728266389 |     7.13993e+08 |          1.01999  | ns     |
| tpch_q10/DataFusion:parquet                |     586073375 |     5.95258e+08 |          0.98457  | ns     |
| tpch_q11/DataFusion:parquet                |     300409630 |     3.00545e+08 |          0.999548 | ns     |
| tpch_q12/DataFusion:parquet                |     283845678 |     2.94671e+08 |          0.963264 | ns     |
| tpch_q13/DataFusion:parquet                |     426511676 |     4.48109e+08 |          0.951802 | ns     |
| tpch_q14/DataFusion:parquet                |     271735571 |     2.81971e+08 |          0.9637   | ns     |
| tpch_q15/DataFusion:parquet                |     507070635 |     5.12494e+08 |          0.989417 | ns     |
| tpch_q16/DataFusion:parquet                |     294837823 |     2.93816e+08 |          1.00348  | ns     |
| tpch_q17/DataFusion:parquet                |     433616639 |     4.26819e+08 |          1.01593  | ns     |
| tpch_q18/DataFusion:parquet                |     593663476 |     5.96777e+08 |          0.994782 | ns     |
| tpch_q19/DataFusion:parquet                |     311732538 |     3.13012e+08 |          0.995912 | ns     |
| tpch_q20/DataFusion:parquet                |     579136165 |     5.76456e+08 |          1.00465  | ns     |
| tpch_q21/DataFusion:parquet                |     682812841 |     6.72018e+08 |          1.01606  | ns     |
| tpch_q22/DataFusion:parquet                |     296433392 |     2.9541e+08  |          1.00346  | ns     |
| tpch_q01/DataFusion:vortex-file-compressed |     145663278 |     1.4621e+08  |          0.996258 | ns     |
| tpch_q02/DataFusion:vortex-file-compressed |     170241494 |     1.5026e+08  |          1.13298  | ns     |
| tpch_q03/DataFusion:vortex-file-compressed |     261044387 |     2.07292e+08 |          1.25931  | ns     |
| tpch_q04/DataFusion:vortex-file-compressed |     153326470 |     1.36429e+08 |          1.12385  | ns     |
| tpch_q05/DataFusion:vortex-file-compressed |     259421728 |     2.57615e+08 |          1.00701  | ns     |
| tpch_q06/DataFusion:vortex-file-compressed |     140434223 |     8.68618e+07 |          1.61675  | ns     |
| tpch_q07/DataFusion:vortex-file-compressed |     239630059 |     2.306e+08   |          1.03916  | ns     |
| tpch_q08/DataFusion:vortex-file-compressed |     322489096 |     3.36047e+08 |          0.959656 | ns     |
| tpch_q09/DataFusion:vortex-file-compressed |     318825161 |     3.29599e+08 |          0.967313 | ns     |
| tpch_q10/DataFusion:vortex-file-compressed |     298036888 |     2.91039e+08 |          1.02405  | ns     |
| tpch_q11/DataFusion:vortex-file-compressed |      83743767 |     8.19033e+07 |          1.02247  | ns     |
| tpch_q12/DataFusion:vortex-file-compressed |     202585817 |     1.80428e+08 |          1.12281  | ns     |
| tpch_q13/DataFusion:vortex-file-compressed |     157862000 |     1.27779e+08 |          1.23543  | ns     |
| tpch_q14/DataFusion:vortex-file-compressed |     142449660 |     1.29137e+08 |          1.10309  | ns     |
| tpch_q15/DataFusion:vortex-file-compressed |     220695716 |     2.15396e+08 |          1.02461  | ns     |
| tpch_q16/DataFusion:vortex-file-compressed |      88084996 |     8.96295e+07 |          0.982768 | ns     |
| tpch_q17/DataFusion:vortex-file-compressed |     240464096 |     2.39493e+08 |          1.00406  | ns     |
| tpch_q18/DataFusion:vortex-file-compressed |     273489562 |     2.95576e+08 |          0.925276 | ns     |
| tpch_q19/DataFusion:vortex-file-compressed |     180587044 |     1.53043e+08 |          1.17997  | ns     |
| tpch_q20/DataFusion:vortex-file-compressed |     221497062 |     2.29663e+08 |          0.964442 | ns     |
| tpch_q21/DataFusion:vortex-file-compressed |     367363535 |     4.1794e+08  |          0.878986 | ns     |
| tpch_q22/DataFusion:vortex-file-compressed |     117327370 |     1.17757e+08 |          0.996353 | ns     |
</details>

<!-- thollander/actions-comment-pull-request "bench-pr-comment-tpch-s3" -->
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-04-25T10:50:15Z
body: # Benchmarks: Clickbench on NVME
<details>
<summary>Table of Results</summary>

| name                                             |   PR c797caa4 |   base b32f7a32 |   ratio (PR/base) | unit   |
|:-------------------------------------------------|--------------:|----------------:|------------------:|:-------|
| clickbench_q00/DataFusion:parquet                |       1907640 |     1.90592e+06 |          1.0009   | ns     |
| clickbench_q01/DataFusion:parquet                |      31292084 |     3.15013e+07 |          0.993357 | ns     |
| clickbench_q02/DataFusion:parquet                |      68042106 |     7.20438e+07 |          0.944455 | ns     |
| clickbench_q03/DataFusion:parquet                |      56700985 |     5.92021e+07 |          0.957753 | ns     |
| clickbench_q04/DataFusion:parquet                |     400182032 |     4.23391e+08 |          0.945184 | ns     |
| clickbench_q05/DataFusion:parquet                |     383676095 |     4.14696e+08 |          0.925199 | ns     |
| clickbench_q06/DataFusion:parquet                |       1939279 |     2.00327e+06 |          0.968056 | ns     |
| clickbench_q07/DataFusion:parquet                |      32868709 |     3.62156e+07 |          0.907585 | ns     |
| clickbench_q08/DataFusion:parquet                |     466580158 |     4.97505e+08 |          0.937841 | ns     |
| clickbench_q09/DataFusion:parquet                |     695886859 |     7.53815e+08 |          0.923153 | ns     |
| clickbench_q10/DataFusion:parquet                |     153681893 |     1.62157e+08 |          0.947736 | ns     |
| clickbench_q11/DataFusion:parquet                |     177408080 |     1.937e+08   |          0.915891 | ns     |
| clickbench_q12/DataFusion:parquet                |     414334904 |     4.44245e+08 |          0.932673 | ns     |
| clickbench_q13/DataFusion:parquet                |     591570663 |     6.23787e+08 |          0.948354 | ns     |
| clickbench_q14/DataFusion:parquet                |     406659332 |     4.23949e+08 |          0.959218 | ns     |
| clickbench_q15/DataFusion:parquet                |     474775673 |     5.04733e+08 |          0.940648 | ns     |
| clickbench_q16/DataFusion:parquet                |     820038445 |     8.66626e+08 |          0.946242 | ns     |
| clickbench_q17/DataFusion:parquet                |     797028395 |     8.34039e+08 |          0.955625 | ns     |
| clickbench_q18/DataFusion:parquet                |    1515582620 |     1.58596e+09 |          0.955625 | ns     |
| clickbench_q19/DataFusion:parquet                |      45553056 |     4.89125e+07 |          0.931318 | ns     |
| clickbench_q20/DataFusion:parquet                |     664874221 |     6.80285e+08 |          0.977346 | ns     |
| clickbench_q21/DataFusion:parquet                |     767652311 |     7.85244e+08 |          0.977597 | ns     |
| clickbench_q22/DataFusion:parquet                |    1241281823 |     1.28012e+09 |          0.969663 | ns     |
| clickbench_q23/DataFusion:parquet                |    4923444644 |     5.20432e+09 |          0.94603  | ns     |
| clickbench_q24/DataFusion:parquet                |     264629091 |     2.67728e+08 |          0.988424 | ns     |
| clickbench_q25/DataFusion:parquet                |     211201354 |     2.23803e+08 |          0.943694 | ns     |
| clickbench_q26/DataFusion:parquet                |     279745493 |     2.98931e+08 |          0.93582  | ns     |
| clickbench_q27/DataFusion:parquet                |     968035654 |     1.02486e+09 |          0.944551 | ns     |
| clickbench_q28/DataFusion:parquet                |    5787113093 |     5.82283e+09 |          0.993866 | ns     |
| clickbench_q29/DataFusion:parquet                |     244510164 |     2.62813e+08 |          0.930359 | ns     |
| clickbench_q30/DataFusion:parquet                |     397568141 |     4.16103e+08 |          0.955457 | ns     |
| clickbench_q31/DataFusion:parquet                |     447963903 |     4.72557e+08 |          0.947958 | ns     |
| clickbench_q32/DataFusion:parquet                |    1379029059 |     1.45149e+09 |          0.950076 | ns     |
| clickbench_q33/DataFusion:parquet                |    1681607559 |     1.77955e+09 |          0.944962 | ns     |
| clickbench_q34/DataFusion:parquet                |    1752647797 |     1.76539e+09 |          0.992782 | ns     |
| clickbench_q35/DataFusion:parquet                |     623991597 |     6.54157e+08 |          0.953886 | ns     |
| clickbench_q36/DataFusion:parquet                |     195470949 |     2.0983e+08  |          0.931567 | ns     |
| clickbench_q37/DataFusion:parquet                |      75350586 |     7.90842e+07 |          0.952789 | ns     |
| clickbench_q38/DataFusion:parquet                |     108914308 |     1.20533e+08 |          0.903603 | ns     |
| clickbench_q39/DataFusion:parquet                |     364628611 |     3.74494e+08 |          0.973656 | ns     |
| clickbench_q40/DataFusion:parquet                |      46435431 |     5.09128e+07 |          0.912059 | ns     |
| clickbench_q41/DataFusion:parquet                |      46708494 |     4.9457e+07  |          0.944426 | ns     |
| clickbench_q42/DataFusion:parquet                |      55419999 |     5.98031e+07 |          0.926708 | ns     |
| clickbench_q00/DataFusion:vortex-file-compressed |       1921393 |     1.9399e+06  |          0.99046  | ns     |
| clickbench_q01/DataFusion:vortex-file-compressed |      10072606 |     8.5559e+06  |          1.17727  | ns     |
| clickbench_q02/DataFusion:vortex-file-compressed |      30774396 |     2.96253e+07 |          1.03879  | ns     |
| clickbench_q03/DataFusion:vortex-file-compressed |      37575692 |     3.76618e+07 |          0.997715 | ns     |
| clickbench_q04/DataFusion:vortex-file-compressed |     357783824 |     4.09274e+08 |          0.874191 | ns     |
| clickbench_q05/DataFusion:vortex-file-compressed |     414990251 |     4.92148e+08 |          0.843223 | ns     |
| clickbench_q06/DataFusion:vortex-file-compressed |       1994865 |     2.05733e+06 |          0.969637 | ns     |
| clickbench_q07/DataFusion:vortex-file-compressed |      16552681 |     1.55128e+07 |          1.06703  | ns     |
| clickbench_q08/DataFusion:vortex-file-compressed |     454840656 |     5.00958e+08 |          0.907941 | ns     |
| clickbench_q09/DataFusion:vortex-file-compressed |     569385524 |     6.27085e+08 |          0.907988 | ns     |
| clickbench_q10/DataFusion:vortex-file-compressed |      77487661 |     7.93668e+07 |          0.976323 | ns     |
| clickbench_q11/DataFusion:vortex-file-compressed |      88744699 |     8.91498e+07 |          0.995456 | ns     |
| clickbench_q12/DataFusion:vortex-file-compressed |     352691187 |     3.82352e+08 |          0.922425 | ns     |
| clickbench_q13/DataFusion:vortex-file-compressed |     471908289 |     4.83328e+08 |          0.976372 | ns     |
| clickbench_q14/DataFusion:vortex-file-compressed |     291496548 |     3.15188e+08 |          0.924835 | ns     |
| clickbench_q15/DataFusion:vortex-file-compressed |     422518656 |     4.9273e+08  |          0.857506 | ns     |
| clickbench_q16/DataFusion:vortex-file-compressed |     875833746 |     9.72322e+08 |          0.900765 | ns     |
| clickbench_q17/DataFusion:vortex-file-compressed |     844567149 |     9.31208e+08 |          0.906959 | ns     |
| clickbench_q18/DataFusion:vortex-file-compressed |    1567267875 |     1.56755e+09 |          0.999822 | ns     |
| clickbench_q19/DataFusion:vortex-file-compressed |      16336946 |     1.60998e+07 |          1.01473  | ns     |
| clickbench_q20/DataFusion:vortex-file-compressed |     278534543 |     2.78314e+08 |          1.00079  | ns     |
| clickbench_q21/DataFusion:vortex-file-compressed |     327903752 |     3.32959e+08 |          0.984817 | ns     |
| clickbench_q22/DataFusion:vortex-file-compressed |     561499267 |     5.78567e+08 |          0.9705   | ns     |
| clickbench_q23/DataFusion:vortex-file-compressed |    1197765196 |     1.22608e+09 |          0.976907 | ns     |
| clickbench_q24/DataFusion:vortex-file-compressed |     115070416 |     1.17836e+08 |          0.976533 | ns     |
| clickbench_q25/DataFusion:vortex-file-compressed |     152730056 |     1.60111e+08 |          0.953901 | ns     |
| clickbench_q26/DataFusion:vortex-file-compressed |     146783416 |     1.60849e+08 |          0.912556 | ns     |
| clickbench_q27/DataFusion:vortex-file-compressed |     671710283 |     7.56762e+08 |          0.887612 | ns     |
| clickbench_q28/DataFusion:vortex-file-compressed |    6415491086 |     6.16214e+09 |          1.04111  | ns     |
| clickbench_q29/DataFusion:vortex-file-compressed |     478695571 |     4.70299e+08 |          1.01785  | ns     |
| clickbench_q30/DataFusion:vortex-file-compressed |     258124711 |     2.82741e+08 |          0.912936 | ns     |
| clickbench_q31/DataFusion:vortex-file-compressed |     290214971 |     3.01759e+08 |          0.961745 | ns     |
| clickbench_q32/DataFusion:vortex-file-compressed |    1321099958 |     1.39008e+09 |          0.95038  | ns     |
| clickbench_q33/DataFusion:vortex-file-compressed |    1587561561 |     1.67879e+09 |          0.945659 | ns     |
| clickbench_q34/DataFusion:vortex-file-compressed |    1582416187 |     1.73301e+09 |          0.913105 | ns     |
| clickbench_q35/DataFusion:vortex-file-compressed |     703743342 |     7.35498e+08 |          0.956825 | ns     |
| clickbench_q36/DataFusion:vortex-file-compressed |     101436683 |     7.50537e+07 |          1.35152  | ns     |
| clickbench_q37/DataFusion:vortex-file-compressed |      44343300 |     3.25253e+07 |          1.36335  | ns     |
| clickbench_q38/DataFusion:vortex-file-compressed |      32643160 |     2.98964e+07 |          1.09187  | ns     |
| clickbench_q39/DataFusion:vortex-file-compressed |     173408814 |     1.4735e+08  |          1.17685  | ns     |
| clickbench_q40/DataFusion:vortex-file-compressed |      21035264 |     1.72228e+07 |          1.22136  | ns     |
| clickbench_q41/DataFusion:vortex-file-compressed |      18995590 |     1.63537e+07 |          1.16155  | ns     |
| clickbench_q42/DataFusion:vortex-file-compressed |      36259382 |     2.64583e+07 |          1.37044  | ns     |
| clickbench_q00/DuckDB:parquet                    |     241000000 |     2.56e+08    |          0.941406 | ns     |
| clickbench_q01/DuckDB:parquet                    |     162000000 |     1.6e+08     |          1.0125   | ns     |
| clickbench_q02/DuckDB:parquet                    |     185000000 |     1.98e+08    |          0.934343 | ns     |
| clickbench_q03/DuckDB:parquet                    |     183000000 |     1.94e+08    |          0.943299 | ns     |
| clickbench_q04/DuckDB:parquet                    |     299000000 |     3.06e+08    |          0.977124 | ns     |
| clickbench_q05/DuckDB:parquet                    |     329000000 |     3.37e+08    |          0.976261 | ns     |
| clickbench_q06/DuckDB:parquet                    |     170000000 |     1.79e+08    |          0.949721 | ns     |
| clickbench_q07/DuckDB:parquet                    |     162000000 |     1.7e+08     |          0.952941 | ns     |
| clickbench_q08/DuckDB:parquet                    |     338000000 |     3.47e+08    |          0.974063 | ns     |
| clickbench_q09/DuckDB:parquet                    |     444000000 |     4.53e+08    |          0.980132 | ns     |
| clickbench_q10/DuckDB:parquet                    |     217000000 |     2.25e+08    |          0.964444 | ns     |
| clickbench_q11/DuckDB:parquet                    |     233000000 |     2.42e+08    |          0.96281  | ns     |
| clickbench_q12/DuckDB:parquet                    |     347000000 |     3.57e+08    |          0.971989 | ns     |
| clickbench_q13/DuckDB:parquet                    |     524000000 |     5.35e+08    |          0.979439 | ns     |
| clickbench_q14/DuckDB:parquet                    |     380000000 |     3.9e+08     |          0.974359 | ns     |
| clickbench_q15/DuckDB:parquet                    |     316000000 |     3.27e+08    |          0.966361 | ns     |
| clickbench_q16/DuckDB:parquet                    |     660000000 |     6.71e+08    |          0.983607 | ns     |
| clickbench_q17/DuckDB:parquet                    |     574000000 |     5.87e+08    |          0.977853 | ns     |
| clickbench_q18/DuckDB:parquet                    |    1073000000 |     1.106e+09   |          0.970163 | ns     |
| clickbench_q19/DuckDB:parquet                    |     167000000 |     1.71e+08    |          0.976608 | ns     |
| clickbench_q20/DuckDB:parquet                    |     774000000 |     7.81e+08    |          0.991037 | ns     |
| clickbench_q21/DuckDB:parquet                    |     703000000 |     7.09e+08    |          0.991537 | ns     |
| clickbench_q22/DuckDB:parquet                    |    1150000000 |     1.155e+09   |          0.995671 | ns     |
| clickbench_q23/DuckDB:parquet                    |    2671000000 |     2.71e+09    |          0.985609 | ns     |
| clickbench_q24/DuckDB:parquet                    |     147000000 |     1.47e+08    |          1        | ns     |
| clickbench_q25/DuckDB:parquet                    |     234000000 |     2.4e+08     |          0.975    | ns     |
| clickbench_q26/DuckDB:parquet                    |     146000000 |     1.5e+08     |          0.973333 | ns     |
| clickbench_q27/DuckDB:parquet                    |     837000000 |     8.34e+08    |          1.0036   | ns     |
| clickbench_q28/DuckDB:parquet                    |    6004000000 |     6.028e+09   |          0.996019 | ns     |
| clickbench_q29/DuckDB:parquet                    |     183000000 |     1.82e+08    |          1.00549  | ns     |
| clickbench_q30/DuckDB:parquet                    |     413000000 |     4.18e+08    |          0.988038 | ns     |
| clickbench_q31/DuckDB:parquet                    |     465000000 |     4.8e+08     |          0.96875  | ns     |
| clickbench_q32/DuckDB:parquet                    |    1135000000 |     1.161e+09   |          0.977606 | ns     |
| clickbench_q33/DuckDB:parquet                    |    1303000000 |     1.346e+09   |          0.968053 | ns     |
| clickbench_q34/DuckDB:parquet                    |    1369000000 |     1.42e+09    |          0.964085 | ns     |
| clickbench_q35/DuckDB:parquet                    |     409000000 |     4.19e+08    |          0.976134 | ns     |
| clickbench_q36/DuckDB:parquet                    |     159000000 |     1.63e+08    |          0.97546  | ns     |
| clickbench_q37/DuckDB:parquet                    |     153000000 |     1.59e+08    |          0.962264 | ns     |
| clickbench_q38/DuckDB:parquet                    |     161000000 |     1.64e+08    |          0.981707 | ns     |
| clickbench_q39/DuckDB:parquet                    |     182000000 |     1.88e+08    |          0.968085 | ns     |
| clickbench_q40/DuckDB:parquet                    |     157000000 |     1.57e+08    |          1        | ns     |
| clickbench_q41/DuckDB:parquet                    |     161000000 |     1.65e+08    |          0.975758 | ns     |
| clickbench_q42/DuckDB:parquet                    |     148000000 |     1.53e+08    |          0.96732  | ns     |
| clickbench_q00/DuckDB:vortex-file-compressed     |      21000000 |     2.1e+07     |          1        | ns     |
| clickbench_q01/DuckDB:vortex-file-compressed     |      25000000 |     2.6e+07     |          0.961538 | ns     |
| clickbench_q02/DuckDB:vortex-file-compressed     |      76000000 |     7.7e+07     |          0.987013 | ns     |
| clickbench_q03/DuckDB:vortex-file-compressed     |      85000000 |     8.4e+07     |          1.0119   | ns     |
| clickbench_q04/DuckDB:vortex-file-compressed     |     272000000 |     2.8e+08     |          0.971429 | ns     |
| clickbench_q05/DuckDB:vortex-file-compressed     |     326000000 |     3.4e+08     |          0.958824 | ns     |
| clickbench_q06/DuckDB:vortex-file-compressed     |      37000000 |     3.6e+07     |          1.02778  | ns     |
| clickbench_q07/DuckDB:vortex-file-compressed     |      37000000 |     3.8e+07     |          0.973684 | ns     |
| clickbench_q08/DuckDB:vortex-file-compressed     |     364000000 |     3.61e+08    |          1.00831  | ns     |
| clickbench_q09/DuckDB:vortex-file-compressed     |     497000000 |     5.15e+08    |          0.965049 | ns     |
| clickbench_q10/DuckDB:vortex-file-compressed     |     147000000 |     1.5e+08     |          0.98     | ns     |
| clickbench_q11/DuckDB:vortex-file-compressed     |     159000000 |     1.58e+08    |          1.00633  | ns     |
| clickbench_q12/DuckDB:vortex-file-compressed     |     323000000 |     3.33e+08    |          0.96997  | ns     |
| clickbench_q13/DuckDB:vortex-file-compressed     |     512000000 |     5.25e+08    |          0.975238 | ns     |
| clickbench_q14/DuckDB:vortex-file-compressed     |     322000000 |     3.26e+08    |          0.98773  | ns     |
| clickbench_q15/DuckDB:vortex-file-compressed     |     288000000 |     3.09e+08    |          0.932039 | ns     |
| clickbench_q16/DuckDB:vortex-file-compressed     |     725000000 |     7.36e+08    |          0.985054 | ns     |
| clickbench_q17/DuckDB:vortex-file-compressed     |     631000000 |     6.61e+08    |          0.954614 | ns     |
| clickbench_q18/DuckDB:vortex-file-compressed     |    1346000000 |     1.383e+09   |          0.973247 | ns     |
| clickbench_q19/DuckDB:vortex-file-compressed     |     164000000 |     1.67e+08    |          0.982036 | ns     |
| clickbench_q20/DuckDB:vortex-file-compressed     |     679000000 |     6.95e+08    |          0.976978 | ns     |
| clickbench_q21/DuckDB:vortex-file-compressed     |     488000000 |     5.29e+08    |          0.922495 | ns     |
| clickbench_q22/DuckDB:vortex-file-compressed     |     747000000 |     7.79e+08    |          0.958922 | ns     |
| clickbench_q23/DuckDB:vortex-file-compressed     |    1514000000 |     1.563e+09   |          0.96865  | ns     |
| clickbench_q24/DuckDB:vortex-file-compressed     |     174000000 |     1.85e+08    |          0.940541 | ns     |
| clickbench_q25/DuckDB:vortex-file-compressed     |     168000000 |     1.71e+08    |          0.982456 | ns     |
| clickbench_q26/DuckDB:vortex-file-compressed     |     172000000 |     1.82e+08    |          0.945055 | ns     |
| clickbench_q27/DuckDB:vortex-file-compressed     |     886000000 |     8.9e+08     |          0.995506 | ns     |
| clickbench_q28/DuckDB:vortex-file-compressed     |    6837000000 |     6.96e+09    |          0.982328 | ns     |
| clickbench_q29/DuckDB:vortex-file-compressed     |      63000000 |     6.6e+07     |          0.954545 | ns     |
| clickbench_q30/DuckDB:vortex-file-compressed     |     330000000 |     3.25e+08    |          1.01538  | ns     |
| clickbench_q31/DuckDB:vortex-file-compressed     |     393000000 |     4.46e+08    |          0.881166 | ns     |
| clickbench_q32/DuckDB:vortex-file-compressed     |    1338000000 |     1.373e+09   |          0.974508 | ns     |
| clickbench_q33/DuckDB:vortex-file-compressed     |    1514000000 |     1.488e+09   |          1.01747  | ns     |
| clickbench_q34/DuckDB:vortex-file-compressed     |    1618000000 |     1.652e+09   |          0.979419 | ns     |
| clickbench_q35/DuckDB:vortex-file-compressed     |     448000000 |     4.61e+08    |          0.9718   | ns     |
| clickbench_q36/DuckDB:vortex-file-compressed     |      84000000 |     8.5e+07     |          0.988235 | ns     |
| clickbench_q37/DuckDB:vortex-file-compressed     |      38000000 |     4.2e+07     |          0.904762 | ns     |
| clickbench_q38/DuckDB:vortex-file-compressed     |      49000000 |     5e+07       |          0.98     | ns     |
| clickbench_q39/DuckDB:vortex-file-compressed     |     171000000 |     1.73e+08    |          0.988439 | ns     |
| clickbench_q40/DuckDB:vortex-file-compressed     |      27000000 |     2.8e+07     |          0.964286 | ns     |
| clickbench_q41/DuckDB:vortex-file-compressed     |      27000000 |     2.9e+07     |          0.931034 | ns     |
| clickbench_q42/DuckDB:vortex-file-compressed     |      33000000 |     3.5e+07     |          0.942857 | ns     |
| clickbench_q00/DuckDB:duckdb                     |      18000000 |     1.8e+07     |          1        | ns     |
| clickbench_q01/DuckDB:duckdb                     |      37000000 |     3.6e+07     |          1.02778  | ns     |
| clickbench_q02/DuckDB:duckdb                     |      69000000 |     7e+07       |          0.985714 | ns     |
| clickbench_q03/DuckDB:duckdb                     |      63000000 |     6.4e+07     |          0.984375 | ns     |
| clickbench_q04/DuckDB:duckdb                     |     229000000 |     2.36e+08    |          0.970339 | ns     |
| clickbench_q05/DuckDB:duckdb                     |     311000000 |     3.19e+08    |          0.974922 | ns     |
| clickbench_q06/DuckDB:duckdb                     |      39000000 |     4e+07       |          0.975    | ns     |
| clickbench_q07/DuckDB:duckdb                     |      37000000 |     3.7e+07     |          1        | ns     |
| clickbench_q08/DuckDB:duckdb                     |     277000000 |     2.88e+08    |          0.961806 | ns     |
| clickbench_q09/DuckDB:duckdb                     |     380000000 |     3.84e+08    |          0.989583 | ns     |
| clickbench_q10/DuckDB:duckdb                     |     125000000 |     1.27e+08    |          0.984252 | ns     |
| clickbench_q11/DuckDB:duckdb                     |     135000000 |     1.37e+08    |          0.985401 | ns     |
| clickbench_q12/DuckDB:duckdb                     |     290000000 |     2.96e+08    |          0.97973  | ns     |
| clickbench_q13/DuckDB:duckdb                     |     470000000 |     4.78e+08    |          0.983264 | ns     |
| clickbench_q14/DuckDB:duckdb                     |     314000000 |     3.22e+08    |          0.975155 | ns     |
| clickbench_q15/DuckDB:duckdb                     |     258000000 |     2.62e+08    |          0.984733 | ns     |
| clickbench_q16/DuckDB:duckdb                     |     626000000 |     6.47e+08    |          0.967543 | ns     |
| clickbench_q17/DuckDB:duckdb                     |     545000000 |     5.64e+08    |          0.966312 | ns     |
| clickbench_q18/DuckDB:duckdb                     |    1070000000 |     1.088e+09   |          0.983456 | ns     |
| clickbench_q19/DuckDB:duckdb                     |      35000000 |     3.6e+07     |          0.972222 | ns     |
| clickbench_q20/DuckDB:duckdb                     |     672000000 |     6.7e+08     |          1.00299  | ns     |
| clickbench_q21/DuckDB:duckdb                     |     550000000 |     5.57e+08    |          0.987433 | ns     |
| clickbench_q22/DuckDB:duckdb                     |     853000000 |     8.44e+08    |          1.01066  | ns     |
| clickbench_q23/DuckDB:duckdb                     |     337000000 |     3.44e+08    |          0.979651 | ns     |
| clickbench_q24/DuckDB:duckdb                     |      59000000 |     6e+07       |          0.983333 | ns     |
| clickbench_q25/DuckDB:duckdb                     |     132000000 |     1.3e+08     |          1.01538  | ns     |
| clickbench_q26/DuckDB:duckdb                     |      57000000 |     5.7e+07     |          1        | ns     |
| clickbench_q27/DuckDB:duckdb                     |     673000000 |     6.66e+08    |          1.01051  | ns     |
| clickbench_q28/DuckDB:duckdb                     |    5879000000 |     5.861e+09   |          1.00307  | ns     |
| clickbench_q29/DuckDB:duckdb                     |      60000000 |     6e+07       |          1        | ns     |
| clickbench_q30/DuckDB:duckdb                     |     314000000 |     3.21e+08    |          0.978193 | ns     |
| clickbench_q31/DuckDB:duckdb                     |     402000000 |     4.16e+08    |          0.966346 | ns     |
| clickbench_q32/DuckDB:duckdb                     |    1106000000 |     1.135e+09   |          0.974449 | ns     |
| clickbench_q33/DuckDB:duckdb                     |    1337000000 |     1.399e+09   |          0.955683 | ns     |
| clickbench_q34/DuckDB:duckdb                     |    1400000000 |     1.438e+09   |          0.973574 | ns     |
| clickbench_q35/DuckDB:duckdb                     |     304000000 |     3.06e+08    |          0.993464 | ns     |
| clickbench_q36/DuckDB:duckdb                     |      51000000 |     5e+07       |          1.02     | ns     |
| clickbench_q37/DuckDB:duckdb                     |      33000000 |     3.4e+07     |          0.970588 | ns     |
| clickbench_q38/DuckDB:duckdb                     |      34000000 |     3.5e+07     |          0.971429 | ns     |
| clickbench_q39/DuckDB:duckdb                     |      74000000 |     8.1e+07     |          0.91358  | ns     |
| clickbench_q40/DuckDB:duckdb                     |      33000000 |     3.2e+07     |          1.03125  | ns     |
| clickbench_q41/DuckDB:duckdb                     |      33000000 |     3.4e+07     |          0.970588 | ns     |
| clickbench_q42/DuckDB:duckdb                     |      31000000 |     3.2e+07     |          0.96875  | ns     |
</details>

<!-- thollander/actions-comment-pull-request "bench-pr-comment-clickbench-nvme" -->
author_association: CONTRIBUTOR
user: login: cloudflare-workers-and-pages[bot]
created_at: 2025-04-28T10:32:39Z
body: ## Deploying vortex-bench with &nbsp;<a href="https://pages.dev"><img alt="Cloudflare Pages" src="https://user-images.githubusercontent.com/23264/106598434-9e719e00-654f-11eb-9e59-6167043cfa01.png" width="16"></a> &nbsp;Cloudflare Pages

<table><tr><td><strong>Latest commit:</strong> </td><td>
<code>a62a0d4</code>
</td></tr>
<tr><td><strong>Status:</strong></td><td>&nbsp;✅&nbsp; Deploy successful!</td></tr>
<tr><td><strong>Preview URL:</strong></td><td>
<a href='https://014b2565.vortex-bench.pages.dev'>https://014b2565.vortex-bench.pages.dev</a>
</td></tr>
<tr><td><strong>Branch Preview URL:</strong></td><td>
<a href='https://adamg-repartition-files-by-r.vortex-bench.pages.dev'>https://adamg-repartition-files-by-r.vortex-bench.pages.dev</a>
</td></tr>
</table>

[View logs](https://dash.cloudflare.com/01e9655179bbec953276890b183039bc/pages/view/vortex-bench/014b2565-043e-4738-aa13-ef57ac8b2fb1)

author_association: NONE