This is an automated email from the ASF dual-hosted git repository.

korlov pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new bceab69a6f5 IGNITE-28437 Sql. Reduce number of rows fetched during 
ordered index scan (#7919)
bceab69a6f5 is described below

commit bceab69a6f51269fa3e3f01f9f5d4b5e84b6da24
Author: korlov42 <[email protected]>
AuthorDate: Mon Apr 6 12:18:12 2026 +0300

    IGNITE-28437 Sql. Reduce number of rows fetched during ordered index scan 
(#7919)
---
 .../internal/sql/engine/exec/rel/IndexScanNode.java      | 16 ++++++++++++++--
 .../apache/ignite/internal/sql/engine/util/Commons.java  |  7 -------
 2 files changed, 14 insertions(+), 9 deletions(-)

diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/IndexScanNode.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/IndexScanNode.java
index cd423dcab75..18ba95b6173 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/IndexScanNode.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/IndexScanNode.java
@@ -17,6 +17,9 @@
 
 package org.apache.ignite.internal.sql.engine.exec.rel;
 
+import static java.lang.Integer.max;
+import static java.lang.Integer.min;
+
 import java.util.Collection;
 import java.util.Comparator;
 import java.util.Iterator;
@@ -38,7 +41,6 @@ import 
org.apache.ignite.internal.sql.engine.exec.exp.RangeIterable;
 import org.apache.ignite.internal.sql.engine.schema.ColumnDescriptor;
 import org.apache.ignite.internal.sql.engine.schema.IgniteIndex;
 import org.apache.ignite.internal.sql.engine.schema.TableDescriptor;
-import org.apache.ignite.internal.sql.engine.util.Commons;
 import org.apache.ignite.internal.util.SubscriptionUtils;
 import org.apache.ignite.internal.util.TransformingIterator;
 import org.jetbrains.annotations.Nullable;
@@ -131,8 +133,18 @@ public class IndexScanNode<RowT> extends 
StorageScanNode<RowT> {
                 partWithConsistencyToken -> 
partitionPublisher(partWithConsistencyToken, cond)
         );
 
+        int bufferSize = context().bufferSize();
+
+        // Let's prefetch equal share of a buffer from each partition.
+        int fetchSize = max(context().bufferSize() / 
partsWithConsistencyTokens.size(), 1);
+
+        // Adds some buffer to improve chances to fulfill entire request 
without need go to storage once again.
+        // This renders over-prefetching over all local partitions in total, 
but at least it's capped now at
+        // 2x bufferSize within up to 512 local partitions.
+        fetchSize = min(fetchSize * 2, bufferSize);
+
         if (comp != null) {
-            return SubscriptionUtils.orderedMerge(comp, 
Commons.SORTED_IDX_PART_PREFETCH_SIZE, it);
+            return SubscriptionUtils.orderedMerge(comp, fetchSize, it);
         } else {
             return SubscriptionUtils.concat(it);
         }
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java
index aa2f3ca9cc8..1fde9c85a07 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java
@@ -138,13 +138,6 @@ public final class Commons {
             SqlKind.OTHER_DDL
     );
 
-    /**
-     * The number of elements to be prefetched from each partition when 
scanning the sorted index.
-     * The higher the value, the fewer calls to the upstream will be, but at 
the same time, the bigger
-     * internal buffer will be.
-     */
-    public static final int SORTED_IDX_PART_PREFETCH_SIZE = 100;
-
     @SuppressWarnings("rawtypes")
     public static final List<RelTraitDef> DISTRIBUTED_TRAITS_SET = List.of(
             ConventionTraitDef.INSTANCE,

Reply via email to