From e0d34c6d9518da4a3fe9dca00abce23495aae841 Mon Sep 17 00:00:00 2001 From: evenyag Date: Fri, 28 Mar 2025 12:25:08 +0800 Subject: [PATCH] feat: use series scan when distribution is PerSeries --- src/mito2/src/read/scan_region.rs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/mito2/src/read/scan_region.rs b/src/mito2/src/read/scan_region.rs index 0daba026ba..e8d8010905 100644 --- a/src/mito2/src/read/scan_region.rs +++ b/src/mito2/src/read/scan_region.rs @@ -256,7 +256,9 @@ impl ScanRegion { /// Returns a [Scanner] to scan the region. pub(crate) fn scanner(self) -> Result { - if self.use_unordered_scan() { + if self.use_series_scan() { + self.series_scan().map(Scanner::Series) + } else if self.use_unordered_scan() { // If table is append only and there is no series row selector, we use unordered scan in query. // We still use seq scan in compaction. self.unordered_scan().map(Scanner::Unordered) @@ -268,7 +270,9 @@ impl ScanRegion { /// Returns a [RegionScanner] to scan the region. #[tracing::instrument(level = tracing::Level::DEBUG, skip_all)] pub(crate) fn region_scanner(self) -> Result { - if self.use_unordered_scan() { + if self.use_series_scan() { + self.series_scan().map(|scanner| Box::new(scanner) as _) + } else if self.use_unordered_scan() { self.unordered_scan().map(|scanner| Box::new(scanner) as _) } else { self.seq_scan().map(|scanner| Box::new(scanner) as _) @@ -287,6 +291,12 @@ impl ScanRegion { Ok(UnorderedScan::new(input)) } + /// Scans by series. + pub(crate) fn series_scan(self) -> Result { + let input = self.scan_input(true)?; + Ok(SeriesScan::new(input)) + } + #[cfg(test)] pub(crate) fn scan_without_filter_deleted(self) -> Result { let input = self.scan_input(false)?; @@ -307,6 +317,11 @@ impl ScanRegion { || self.request.distribution == Some(TimeSeriesDistribution::TimeWindowed)) } + /// Returns true if the region can use series scan for current request. + fn use_series_scan(&self) -> bool { + self.request.distribution == Some(TimeSeriesDistribution::TimeWindowed) + } + /// Creates a scan input. fn scan_input(mut self, filter_deleted: bool) -> Result { let time_range = self.build_time_range_predicate();