You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by am...@apache.org on 2025/03/14 13:45:53 UTC

(ignite-3) 01/02: Avoid boxing/unboxing in sql module

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

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

commit 5f720dbf3564775df6481bbb4238d3ce8c6990fb
Author: amashenkov <am...@apache.org>
AuthorDate: Thu Mar 13 20:52:24 2025 +0300

    Avoid boxing/unboxing in sql module
---
 .../sql/engine/exec/DestinationFactory.java        |  8 ++---
 .../exec/ExecutionDependencyResolverImpl.java      |  8 ++---
 .../sql/engine/exec/ExecutionServiceImpl.java      |  4 +--
 .../sql/engine/exec/ResolvedDependencies.java      | 10 +++----
 .../engine/exec/exp/agg/AccumulatorsFactory.java   | 22 +++++++-------
 .../sql/engine/exec/exp/agg/AggregateRow.java      |  6 ++--
 .../sql/engine/exec/mapping/ColocationGroup.java   |  9 +++---
 .../sql/engine/exec/mapping/FragmentMapper.java    |  3 +-
 .../engine/exec/mapping/MappingServiceImpl.java    | 10 +++----
 .../sql/engine/exec/rel/HashAggregateNode.java     |  3 +-
 .../sql/engine/exec/rel/SortAggregateNode.java     | 16 +++++-----
 .../sql/engine/message/MessageServiceImpl.java     |  8 ++---
 .../sql/engine/prepare/IgniteSqlValidator.java     |  8 ++---
 .../sql/engine/prepare/PrepareServiceImpl.java     | 10 +++----
 .../internal/sql/engine/rel/IgniteMergeJoin.java   |  4 +--
 .../engine/rel/agg/IgniteSortAggregateBase.java    |  1 +
 .../sql/engine/rel/agg/MapReduceAggregates.java    | 35 +++++++++++-----------
 .../sql/engine/rule/LogicalScanConverterRule.java  | 10 +++----
 .../sql/engine/trait/IgniteDistributions.java      |  2 +-
 .../internal/sql/engine/trait/Partitioned.java     |  6 ++--
 .../internal/sql/engine/trait/TraitUtils.java      |  7 +++++
 .../ignite/internal/sql/engine/util/Commons.java   | 11 +++++--
 .../sql/engine/exec/ExecutionServiceImplTest.java  |  3 +-
 .../exec/IdentityDistributionFunctionSelfTest.java |  3 +-
 .../sql/engine/exec/PartitionProvidersTest.java    |  7 +++--
 .../exec/mapping/MappingServiceImplTest.java       | 15 +++++-----
 .../engine/exec/rel/ModifyNodeExecutionTest.java   |  3 +-
 .../pruning/PartitionPruningPredicateSelfTest.java |  5 ++--
 28 files changed, 128 insertions(+), 109 deletions(-)

diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/DestinationFactory.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/DestinationFactory.java
index 979a5932e6f..834ef891ba8 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/DestinationFactory.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/DestinationFactory.java
@@ -23,11 +23,8 @@ import static org.apache.ignite.internal.util.CollectionUtils.nullOrEmpty;
 import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
 import java.util.Collections;
-import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Objects;
 import java.util.function.Supplier;
-import java.util.stream.Collectors;
 import org.apache.calcite.util.ImmutableIntList;
 import org.apache.ignite.internal.sql.engine.exec.mapping.ColocationGroup;
 import org.apache.ignite.internal.sql.engine.schema.PartitionCalculator;
@@ -40,6 +37,7 @@ import org.apache.ignite.internal.sql.engine.trait.Identity;
 import org.apache.ignite.internal.sql.engine.trait.IgniteDistribution;
 import org.apache.ignite.internal.sql.engine.trait.Partitioned;
 import org.apache.ignite.internal.sql.engine.trait.RandomNode;
+import org.apache.ignite.internal.util.CollectionUtils;
 
 /**
  * Factory that resolves {@link IgniteDistribution} trait, which represents logical {@link DistributionFunction} function, into its
@@ -103,8 +101,8 @@ class DestinationFactory<RowT> {
 
                     var resolver = new TablePartitionExtractor<>(calculator.get(), keys.toIntArray(), tableDescriptor, rowHandler);
 
-                    Map<Integer, String> partToNode = group.assignments().int2ObjectEntrySet().stream()
-                            .collect(Collectors.toMap(Entry::getKey, e -> e.getValue().name()));
+                    Int2ObjectMap<String> partToNode = group.assignments().int2ObjectEntrySet().stream()
+                            .collect(CollectionUtils.toIntMapCollector(Int2ObjectMap.Entry::getIntKey, e -> e.getValue().name()));
 
                     return new Partitioned<>(partToNode, resolver);
                 }
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutionDependencyResolverImpl.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutionDependencyResolverImpl.java
index 3a1ccb159d5..c5344413d89 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutionDependencyResolverImpl.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutionDependencyResolverImpl.java
@@ -17,8 +17,8 @@
 
 package org.apache.ignite.internal.sql.engine.exec;
 
-import java.util.HashMap;
-import java.util.Map;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
+import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
 import org.apache.ignite.internal.sql.engine.prepare.IgniteRelShuttle;
 import org.apache.ignite.internal.sql.engine.rel.IgniteIndexScan;
 import org.apache.ignite.internal.sql.engine.rel.IgniteRel;
@@ -55,8 +55,8 @@ public class ExecutionDependencyResolverImpl implements ExecutionDependencyResol
      */
     @Override
     public ResolvedDependencies resolveDependencies(Iterable<IgniteRel> rels, int catalogVersion) {
-        Map<Integer, ExecutableTable> tableMap = new HashMap<>();
-        Map<Integer, ScannableDataSource> dataSources = new HashMap<>();
+        Int2ObjectMap<ExecutableTable> tableMap = new Int2ObjectOpenHashMap<>();
+        Int2ObjectMap<ScannableDataSource> dataSources = new Int2ObjectOpenHashMap<>();
 
         IgniteRelShuttle shuttle = new IgniteRelShuttle() {
             @Override
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImpl.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImpl.java
index 646eda809c0..c16f77e78f1 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImpl.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImpl.java
@@ -1152,8 +1152,8 @@ public class ExecutionServiceImpl<RowT> implements ExecutionService, TopologyEve
 
                     tx.assignCommitPartition(targetReplicationGroupId(tableId, zoneId, ThreadLocalRandom.current().nextInt(partsCnt)));
 
-                    for (Map.Entry<Integer, NodeWithConsistencyToken> partWithToken : assignments.int2ObjectEntrySet()) {
-                        ReplicationGroupId replicationGroupId = targetReplicationGroupId(tableId, zoneId, partWithToken.getKey());
+                    for (Int2ObjectMap.Entry<NodeWithConsistencyToken> partWithToken : assignments.int2ObjectEntrySet()) {
+                        ReplicationGroupId replicationGroupId = targetReplicationGroupId(tableId, zoneId, partWithToken.getIntKey());
 
                         NodeWithConsistencyToken assignment = partWithToken.getValue();
 
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ResolvedDependencies.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ResolvedDependencies.java
index 871ff9aeb6f..0ba8de48327 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ResolvedDependencies.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ResolvedDependencies.java
@@ -17,7 +17,7 @@
 
 package org.apache.ignite.internal.sql.engine.exec;
 
-import java.util.Map;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import java.util.function.Supplier;
 import org.apache.ignite.internal.sql.engine.schema.PartitionCalculator;
 import org.apache.ignite.internal.sql.engine.schema.TableDescriptor;
@@ -27,14 +27,14 @@ import org.apache.ignite.internal.sql.engine.schema.TableDescriptor;
  */
 public class ResolvedDependencies {
 
-    private final Map<Integer, ExecutableTable> tableMap;
+    private final Int2ObjectMap<ExecutableTable> tableMap;
 
-    private final Map<Integer, ScannableDataSource> dataSourceMap;
+    private final Int2ObjectMap<ScannableDataSource> dataSourceMap;
 
     /** Constructor. */
     public ResolvedDependencies(
-            Map<Integer, ExecutableTable> tableMap,
-            Map<Integer, ScannableDataSource> dataSourceMap
+            Int2ObjectMap<ExecutableTable> tableMap,
+            Int2ObjectMap<ScannableDataSource> dataSourceMap
     ) {
         this.tableMap = tableMap;
         this.dataSourceMap = dataSourceMap;
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/AccumulatorsFactory.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/AccumulatorsFactory.java
index 5f504eac53f..ebc560c9f7a 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/AccumulatorsFactory.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/AccumulatorsFactory.java
@@ -23,6 +23,8 @@ import static org.apache.ignite.internal.util.CollectionUtils.nullOrEmpty;
 
 import com.github.benmanes.caffeine.cache.Caffeine;
 import com.github.benmanes.caffeine.cache.LoadingCache;
+import it.unimi.dsi.fastutil.ints.IntArrayList;
+import it.unimi.dsi.fastutil.ints.IntList;
 import java.lang.reflect.Modifier;
 import java.util.List;
 import java.util.Map;
@@ -53,6 +55,7 @@ import org.apache.ignite.internal.sql.engine.exec.exp.SqlScalar;
 import org.apache.ignite.internal.sql.engine.type.IgniteTypeFactory;
 import org.apache.ignite.internal.sql.engine.util.Commons;
 import org.apache.ignite.internal.sql.engine.util.Primitives;
+import org.apache.ignite.internal.util.IgniteUtils;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -255,13 +258,15 @@ public class AccumulatorsFactory<RowT> {
     }
 
     private static final class AccumulatorWrapperImpl<RowT> implements AccumulatorWrapper<RowT> {
+        static final IntList SINGLE_ARG_LIST = IntList.of(0);
+
         private final Accumulator accumulator;
 
         private final Function<Object[], Object[]> inAdapter;
 
         private final Function<Object, Object> outAdapter;
 
-        private final List<Integer> argList;
+        private final IntList argList;
 
         private final boolean literalAgg;
 
@@ -289,10 +294,11 @@ public class AccumulatorsFactory<RowT> {
             this.distinct = call.isDistinct();
 
             literalAgg = call.getAggregation() == LITERAL_AGG;
-            argList = call.getArgList();
             ignoreNulls = call.ignoreNulls();
             filterArg = call.hasFilter() ? call.filterArg : -1;
 
+            argList = distinct && call.getArgList().isEmpty() ? SINGLE_ARG_LIST : new IntArrayList(call.getArgList());
+
             if (literalAgg) {
                 assert call.getArgList().isEmpty() : "LiteralAgg should have no operands: " + call;
 
@@ -323,20 +329,16 @@ public class AccumulatorsFactory<RowT> {
                 return new Object[]{preOperand};
             }
 
-            int params = argList.size();
-
-            List<Integer> argList0 = argList;
-
-            if ((distinct && argList.isEmpty())) {
+            if (IgniteUtils.assertionsEnabled() && argList == SINGLE_ARG_LIST) {
                 int cnt = handler.columnCount(row);
                 assert cnt <= 1;
-                argList0 = List.of(0);
-                params = 1;
             }
 
+            int params = argList.size();
+
             Object[] args = new Object[params];
             for (int i = 0; i < params; i++) {
-                int argPos = argList0.get(i);
+                int argPos = argList.getInt(i);
                 args[i] = handler.get(argPos, row);
 
                 if (ignoreNulls && args[i] == null) {
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/AggregateRow.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/AggregateRow.java
index 9437ec87d8f..bf7be3cb594 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/AggregateRow.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/AggregateRow.java
@@ -17,7 +17,7 @@
 
 package org.apache.ignite.internal.sql.engine.exec.exp.agg;
 
-import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import java.util.List;
 import java.util.Set;
 import org.apache.calcite.util.ImmutableBitSet;
@@ -32,12 +32,12 @@ public class AggregateRow<RowT> {
 
     private final AccumulatorsState state;
 
-    private final Int2ObjectArrayMap<Set<Object>> distinctSets;
+    private final Int2ObjectMap<Set<Object>> distinctSets;
 
     /** Constructor. */
     public AggregateRow(
             AccumulatorsState state,
-            Int2ObjectArrayMap<Set<Object>> distinctSets
+            Int2ObjectMap<Set<Object>> distinctSets
     ) {
         this.state = state;
         this.distinctSets = distinctSets;
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/mapping/ColocationGroup.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/mapping/ColocationGroup.java
index 67c789b038d..5fc8a3deeac 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/mapping/ColocationGroup.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/mapping/ColocationGroup.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.sql.engine.exec.mapping;
 
 import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
+import it.unimi.dsi.fastutil.longs.LongList;
 import java.io.Serializable;
 import java.util.Collections;
 import java.util.List;
@@ -37,7 +38,7 @@ import org.apache.ignite.internal.sql.engine.exec.PartitionWithConsistencyToken;
 public class ColocationGroup implements Serializable {
     private static final long serialVersionUID = 1370403193139083025L;
 
-    private final List<Long> sourceIds;
+    private final LongList sourceIds;
 
     private final List<String> nodeNames;
 
@@ -46,7 +47,7 @@ public class ColocationGroup implements Serializable {
     private final Map<String, List<PartitionWithConsistencyToken>> partitionsPerNode;
 
     /** Constructor. */
-    public ColocationGroup(List<Long> sourceIds, List<String> nodeNames, Int2ObjectMap<NodeWithConsistencyToken> assignments) {
+    public ColocationGroup(LongList sourceIds, List<String> nodeNames, Int2ObjectMap<NodeWithConsistencyToken> assignments) {
         this.sourceIds = Objects.requireNonNull(sourceIds, "sourceIds");
         this.nodeNames = Objects.requireNonNull(nodeNames, "nodeNames");
         this.assignments = Objects.requireNonNull(assignments, "assignments");
@@ -55,7 +56,7 @@ public class ColocationGroup implements Serializable {
 
     /** Constructor for colocation group with applied partition pruning. */
     public ColocationGroup(
-            List<Long> sourceIds,
+            LongList sourceIds,
             List<String> nodeNames,
             Int2ObjectMap<NodeWithConsistencyToken> assignments,
             Map<String, List<PartitionWithConsistencyToken>> partitionsPerNode
@@ -69,7 +70,7 @@ public class ColocationGroup implements Serializable {
     /**
      * Get lists of colocation group sources.
      */
-    public List<Long> sourceIds() {
+    public LongList sourceIds() {
         return sourceIds;
     }
 
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/mapping/FragmentMapper.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/mapping/FragmentMapper.java
index 8fb7c3e6386..a83dfe0bf45 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/mapping/FragmentMapper.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/mapping/FragmentMapper.java
@@ -813,9 +813,10 @@ class FragmentMapper {
             List<String> nodes = context.targetFactory().resolveNodes(target);
             Int2ObjectMap<NodeWithConsistencyToken> assignments = context.targetFactory().resolveAssignments(target);
 
+
             return List.of(
                     new ColocationGroup(
-                            List.copyOf(sourceIds),
+                            new LongArrayList(sourceIds),
                             nodes,
                             assignments
                     )
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/mapping/MappingServiceImpl.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/mapping/MappingServiceImpl.java
index bacb28deb16..0837fb9990c 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/mapping/MappingServiceImpl.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/mapping/MappingServiceImpl.java
@@ -36,8 +36,8 @@ import java.util.List;
 import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
+import java.util.function.LongSupplier;
 import java.util.function.Predicate;
-import java.util.function.Supplier;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import org.apache.calcite.plan.RelOptCluster;
@@ -79,7 +79,7 @@ public class MappingServiceImpl implements MappingService {
     private final Cache<PlanId, FragmentsTemplate> templatesCache;
     private final Cache<MappingsCacheKey, MappingsCacheValue> mappingsCache;
     private final PartitionPruner partitionPruner;
-    private final Supplier<Long> logicalTopologyVerSupplier;
+    private final LongSupplier logicalTopologyVerSupplier;
     private final ExecutionDistributionProvider distributionProvider;
 
     private final boolean enabledColocation = IgniteSystemProperties.enabledColocation();
@@ -101,7 +101,7 @@ public class MappingServiceImpl implements MappingService {
             CacheFactory cacheFactory,
             int cacheSize,
             PartitionPruner partitionPruner,
-            Supplier<Long> logicalTopologyVerSupplier,
+            LongSupplier logicalTopologyVerSupplier,
             ExecutionDistributionProvider distributionProvider
     ) {
         this.localNodeName = localNodeName;
@@ -158,14 +158,14 @@ public class MappingServiceImpl implements MappingService {
                                 }
                             }
 
-                            long topVer = topologyAware ? logicalTopologyVerSupplier.get() : Long.MAX_VALUE;
+                            long topVer = topologyAware ? logicalTopologyVerSupplier.getAsLong() : Long.MAX_VALUE;
 
                             assert nodeExclusionFilter == null;
 
                             return new MappingsCacheValue(topVer, tableIds, mapFragments(template, mapOnBackups, null));
                         }
 
-                        long topologyVer = logicalTopologyVerSupplier.get();
+                        long topologyVer = logicalTopologyVerSupplier.getAsLong();
 
                         if (val.topologyVersion < topologyVer) {
                             return new MappingsCacheValue(topologyVer, val.tableIds, mapFragments(template, mapOnBackups, null));
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/HashAggregateNode.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/HashAggregateNode.java
index fe8df767d40..0783403aeb7 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/HashAggregateNode.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/HashAggregateNode.java
@@ -21,6 +21,7 @@ import static java.util.stream.Collectors.toCollection;
 import static org.apache.ignite.internal.util.CollectionUtils.nullOrEmpty;
 
 import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -300,7 +301,7 @@ public class HashAggregateNode<RowT> extends AbstractNode<RowT> implements Singl
         }
 
         private AggregateRow<RowT> create() {
-            Int2ObjectArrayMap<Set<Object>> distinctSets = new Int2ObjectArrayMap<>();
+            Int2ObjectMap<Set<Object>> distinctSets = new Int2ObjectArrayMap<>();
 
             for (int i = 0; i < accs.size(); i++) {
                 AccumulatorWrapper<RowT> acc = accs.get(i);
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/SortAggregateNode.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/SortAggregateNode.java
index 3e7b2cb2522..587df79d90a 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/SortAggregateNode.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/SortAggregateNode.java
@@ -21,6 +21,8 @@ import static org.apache.ignite.internal.util.ArrayUtils.OBJECT_EMPTY_ARRAY;
 import static org.apache.ignite.internal.util.CollectionUtils.nullOrEmpty;
 
 import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
+import it.unimi.dsi.fastutil.objects.ObjectArrayList;
 import java.util.ArrayDeque;
 import java.util.Comparator;
 import java.util.Deque;
@@ -204,16 +206,12 @@ public class SortAggregateNode<RowT> extends AbstractNode<RowT> implements Singl
     }
 
     private Group newGroup(RowT r) {
-        final Object[] grpKeys = new Object[grpSet.cardinality()];
-        List<Integer> fldIdxs = grpSet.asList();
+        RowHandler<RowT> rowHandler =rowFactory.handler();
+        ObjectArrayList<Object> grpKeys = new ObjectArrayList<>(grpSet.cardinality());
 
-        final RowHandler<RowT> rowHandler = rowFactory.handler();
+        grpSet.forEachInt(fldIdx -> grpKeys.add(rowHandler.get(fldIdx, r)));
 
-        for (int i = 0; i < grpKeys.length; ++i) {
-            grpKeys[i] = rowHandler.get(fldIdxs.get(i), r);
-        }
-
-        Group grp = new Group(grpKeys);
+        Group grp = new Group(grpKeys.elements());
 
         grp.add(r);
 
@@ -254,7 +252,7 @@ public class SortAggregateNode<RowT> extends AbstractNode<RowT> implements Singl
 
             AccumulatorsState state = new AccumulatorsState(accs.size());
 
-            Int2ObjectArrayMap<Set<Object>> distinctSets = new Int2ObjectArrayMap<>();
+            Int2ObjectMap<Set<Object>> distinctSets = new Int2ObjectArrayMap<>();
             for (int i = 0; i < accs.size(); i++) {
                 AccumulatorWrapper<RowT> acc = accs.get(i);
                 if (acc.isDistinct()) {
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/message/MessageServiceImpl.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/message/MessageServiceImpl.java
index a751c290719..7f55e59b1f9 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/message/MessageServiceImpl.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/message/MessageServiceImpl.java
@@ -21,8 +21,8 @@ import static org.apache.ignite.internal.sql.engine.message.SqlQueryMessageGroup
 import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.ExceptionUtils.sneakyThrow;
 
-import java.util.HashMap;
-import java.util.Map;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
+import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
 import java.util.Objects;
 import java.util.concurrent.CompletableFuture;
 import org.apache.ignite.internal.hlc.ClockService;
@@ -51,7 +51,7 @@ public class MessageServiceImpl implements MessageService {
 
     private final ClockService clockService;
 
-    private volatile Map<Short, MessageListener> lsnrs;
+    private volatile Int2ObjectMap<MessageListener> lsnrs;
 
     /**
      * Constructor.
@@ -112,7 +112,7 @@ public class MessageServiceImpl implements MessageService {
     @Override
     public void register(MessageListener lsnr, short type) {
         if (lsnrs == null) {
-            lsnrs = new HashMap<>();
+            lsnrs = new Int2ObjectOpenHashMap<>();
         }
 
         MessageListener old = lsnrs.put(type, lsnr);
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteSqlValidator.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteSqlValidator.java
index 0ab21dfced9..0861083e2c5 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteSqlValidator.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteSqlValidator.java
@@ -29,6 +29,7 @@ import static org.apache.ignite.lang.ErrorGroups.Sql.STMT_VALIDATION_ERR;
 import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;
 import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import it.unimi.dsi.fastutil.ints.IntArraySet;
+import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
 import it.unimi.dsi.fastutil.ints.IntSet;
 import java.math.BigDecimal;
 import java.util.AbstractList;
@@ -36,7 +37,6 @@ import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.EnumSet;
-import java.util.HashSet;
 import java.util.IdentityHashMap;
 import java.util.List;
 import java.util.Map;
@@ -169,9 +169,9 @@ public class IgniteSqlValidator extends SqlValidatorImpl {
         super(opTab, catalogReader, typeFactory, config);
 
         this.dynamicParameters = new Int2ObjectArrayMap<>(parameters.size());
-        for (Map.Entry<Integer, Object> param : parameters.int2ObjectEntrySet()) {
+        for (Int2ObjectMap.Entry<Object> param : parameters.int2ObjectEntrySet()) {
             Object value = param.getValue();
-            dynamicParameters.put(param.getKey().intValue(), new DynamicParamState(value));
+            dynamicParameters.put(param.getIntKey(), new DynamicParamState(value));
         }
     }
 
@@ -588,7 +588,7 @@ public class IgniteSqlValidator extends SqlValidatorImpl {
                         targetField.getType());
             }
         }
-        final Set<Integer> assignedFields = new HashSet<>();
+        final IntSet assignedFields = new IntOpenHashSet(targetColumnList.size());
         final RelOptTable relOptTable = table instanceof RelOptTable
                 ? ((RelOptTable) table) : null;
         for (SqlNode node : targetColumnList) {
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/PrepareServiceImpl.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/PrepareServiceImpl.java
index acc0ee60b42..06f31f130e4 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/PrepareServiceImpl.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/PrepareServiceImpl.java
@@ -25,10 +25,10 @@ import static org.apache.ignite.internal.sql.engine.util.Commons.fastQueryOptimi
 import static org.apache.ignite.internal.thread.ThreadOperation.NOTHING_ALLOWED;
 import static org.apache.ignite.lang.ErrorGroups.Sql.EXECUTION_CANCELLED_ERR;
 
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CompletionException;
@@ -657,10 +657,10 @@ public class PrepareServiceImpl implements PrepareService {
     @Nullable
     private static CacheKey tryCreateCacheKeyFromParameterValues(ParsedResult parsedResult, PlanningContext ctx) {
 
-        Map<Integer, Object> parameters = ctx.parameters();
+        Int2ObjectMap<Object> parameters = ctx.parameters();
 
         int maxParamNum = 0;
-        for (Integer key : parameters.keySet()) {
+        for (int key : parameters.keySet()) {
             maxParamNum = Math.max(maxParamNum, key);
         }
 
@@ -684,7 +684,7 @@ public class PrepareServiceImpl implements PrepareService {
         } else {
             ColumnType[] result = new ColumnType[parameters.size()];
 
-            for (Map.Entry<Integer, Object> entry : parameters.entrySet()) {
+            for (Int2ObjectMap.Entry<Object> entry : parameters.int2ObjectEntrySet()) {
                 Object value = entry.getValue();
                 ColumnType columnType;
                 if (value != null) {
@@ -692,7 +692,7 @@ public class PrepareServiceImpl implements PrepareService {
                 } else {
                     columnType = ColumnType.NULL;
                 }
-                result[entry.getKey()] = columnType;
+                result[entry.getIntKey()] = columnType;
             }
 
             paramTypes = result;
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/IgniteMergeJoin.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/IgniteMergeJoin.java
index 264548957d4..1b8b4079d00 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/IgniteMergeJoin.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/IgniteMergeJoin.java
@@ -346,9 +346,7 @@ public class IgniteMergeJoin extends AbstractIgniteJoin {
         ImmutableBitSet colKeysBitset = ImmutableBitSet.of(collation.getKeys());
         ImmutableBitSet exceptBitset = keysBitset.except(colKeysBitset);
 
-        for (Integer i : exceptBitset) {
-            fieldsForNewCollation.add(new RelFieldCollation(i));
-        }
+        exceptBitset.forEachInt(i -> fieldsForNewCollation.add(new RelFieldCollation(i)));
 
         return RelCollations.of(fieldsForNewCollation);
     }
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/agg/IgniteSortAggregateBase.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/agg/IgniteSortAggregateBase.java
index 5b50a9bbd5f..c933a350271 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/agg/IgniteSortAggregateBase.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/agg/IgniteSortAggregateBase.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.sql.engine.rel.agg;
 import static org.apache.ignite.internal.sql.engine.util.Commons.maxPrefix;
 
 import it.unimi.dsi.fastutil.ints.IntList;
+import it.unimi.dsi.fastutil.ints.IntLists;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.function.IntPredicate;
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/agg/MapReduceAggregates.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/agg/MapReduceAggregates.java
index 727bce836a4..2ae38dfb6d4 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/agg/MapReduceAggregates.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/agg/MapReduceAggregates.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.sql.engine.rel.agg;
 import static org.apache.ignite.internal.lang.IgniteStringFormatter.format;
 
 import com.google.common.collect.ImmutableList;
+import it.unimi.dsi.fastutil.ints.IntList;
 import java.math.BigDecimal;
 import java.util.AbstractMap.SimpleEntry;
 import java.util.ArrayList;
@@ -78,7 +79,7 @@ public class MapReduceAggregates {
      * Should be used by aggregates that use the same operator for both MAP and REDUCE phases.
      */
     private static final MakeReduceExpr USE_INPUT_FIELD = (rexBuilder, input, args, typeFactory) ->
-            rexBuilder.makeInputRef(input, args.get(0));
+            rexBuilder.makeInputRef(input, args.getInt(0));
 
     private MapReduceAggregates() {
 
@@ -210,7 +211,7 @@ public class MapReduceAggregates {
             int argIdx = groupByColumns + argOffset;
 
             for (int j = 0; j < mapReduceAgg.reduceCalls.size(); j++) {
-                RexNode projExpr = mapReduceAgg.makeReduceInputExpr.makeExpr(rexBuilder, map, List.of(argIdx), typeFactory);
+                RexNode projExpr = mapReduceAgg.makeReduceInputExpr.makeExpr(rexBuilder, map, IntList.of(argIdx), typeFactory);
                 reduceInputExprs.set(argIdx, projExpr);
 
                 if (mapReduceAgg.makeReduceInputExpr != USE_INPUT_FIELD) {
@@ -246,7 +247,7 @@ public class MapReduceAggregates {
         // Build a list of projections (arg-list, expr) that accept reduce phase and combine/collect/cast results.
 
         List<AggregateCall> reduceAggCalls = new ArrayList<>();
-        List<Map.Entry<List<Integer>, MakeReduceExpr>> projection = new ArrayList<>(mapReduceAggs.size());
+        List<Map.Entry<IntList, MakeReduceExpr>> projection = new ArrayList<>(mapReduceAggs.size());
 
         for (MapReduceAgg mapReduceAgg : mapReduceAggs) {
             // Update row type returned by REDUCE node.
@@ -258,7 +259,7 @@ public class MapReduceAggregates {
             }
 
             // Update projection list
-            List<Integer> reduceArgList = mapReduceAgg.argList;
+            IntList reduceArgList = mapReduceAgg.argList;
             MakeReduceExpr projectionExpr = mapReduceAgg.makeReduceOutputExpr;
             projection.add(new SimpleEntry<>(reduceArgList, projectionExpr));
 
@@ -320,7 +321,7 @@ public class MapReduceAggregates {
             projectionList.add(ref);
         }
 
-        for (Map.Entry<List<Integer>, MakeReduceExpr> expr : projection) {
+        for (Map.Entry<IntList, MakeReduceExpr> expr : projection) {
             RexNode resultExpr = expr.getValue().makeExpr(rexBuilder, reduce, expr.getKey(), typeFactory);
             projectionList.add(resultExpr);
         }
@@ -393,7 +394,7 @@ public class MapReduceAggregates {
     public static class MapReduceAgg {
 
         /** Argument list on reduce phase. */
-        final List<Integer> argList;
+        final IntList argList;
 
         /** MAP phase aggregate, an initial aggregation function was transformed into. */
         final List<AggregateCall> mapCalls;
@@ -408,7 +409,7 @@ public class MapReduceAggregates {
         final MakeReduceExpr makeReduceOutputExpr;
 
         MapReduceAgg(
-                List<Integer> argList,
+                IntList argList,
                 AggregateCall mapCalls,
                 AggregateCall reduceCalls,
                 MakeReduceExpr makeReduceOutputExpr
@@ -417,7 +418,7 @@ public class MapReduceAggregates {
         }
 
         MapReduceAgg(
-                List<Integer> argList,
+                IntList argList,
                 List<AggregateCall> mapCalls,
                 MakeReduceExpr makeReduceInputExpr,
                 List<AggregateCall> reduceCalls,
@@ -438,7 +439,7 @@ public class MapReduceAggregates {
     }
 
     private static MapReduceAgg createCountAgg(AggregateCall call, int reduceArgumentOffset) {
-        List<Integer> argList = List.of(reduceArgumentOffset);
+        IntList argList = IntList.of(reduceArgumentOffset);
 
         AggregateCall sum0 = AggregateCall.create(
                 SqlStdOperatorTable.SUM0,
@@ -457,7 +458,7 @@ public class MapReduceAggregates {
         // COUNT(x) aggregate have type BIGINT, but the type of SUM(COUNT(x)) is DECIMAL,
         // so we should convert it to back to BIGINT.
         MakeReduceExpr exprBuilder = (rexBuilder, input, args, typeFactory) -> {
-            RexInputRef ref = rexBuilder.makeInputRef(input, args.get(0));
+            RexInputRef ref = rexBuilder.makeInputRef(input, args.getInt(0));
             return rexBuilder.makeCast(typeFactory.createSqlType(SqlTypeName.BIGINT), ref, true, false);
         };
 
@@ -465,7 +466,7 @@ public class MapReduceAggregates {
     }
 
     private static MapReduceAgg createSimpleAgg(AggregateCall call, int reduceArgumentOffset) {
-        List<Integer> argList = List.of(reduceArgumentOffset);
+        IntList argList = IntList.of(reduceArgumentOffset);
 
         AggregateCall reduceCall = AggregateCall.create(
                 call.getAggregation(),
@@ -507,7 +508,7 @@ public class MapReduceAggregates {
          *
          * @return Expression.
          */
-        RexNode makeExpr(RexBuilder rexBuilder, RelNode input, List<Integer> args, IgniteTypeFactory typeFactory);
+        RexNode makeExpr(RexBuilder rexBuilder, RelNode input, IntList args, IgniteTypeFactory typeFactory);
     }
 
     private static MapReduceAgg createAvgAgg(
@@ -566,7 +567,7 @@ public class MapReduceAggregates {
                 "AVG_COUNT" + reduceArgumentOffset);
 
         // REDUCE : SUM(s) as reduce_sum, SUM0(c) as reduce_count
-        List<Integer> reduceSumArgs = List.of(reduceArgumentOffset);
+        IntList reduceSumArgs = IntList.of(reduceArgumentOffset);
 
         // SUM0(s)
         RelDataType reduceSumType = typeSystem.deriveSumType(tf, mapSumType);
@@ -591,7 +592,7 @@ public class MapReduceAggregates {
 
         // SUM0(c)
         RelDataType reduceSumCountType = typeSystem.deriveSumType(tf, mapCount0.type);
-        List<Integer> reduceSumCountArgs = List.of(reduceArgumentOffset + 1);
+        IntList reduceSumCountArgs = IntList.of(reduceArgumentOffset + 1);
 
         AggregateCall reduceSumCount = AggregateCall.create(
                 SqlStdOperatorTable.SUM0,
@@ -610,9 +611,9 @@ public class MapReduceAggregates {
         RelDataType finalReduceSumType = reduceSumType;
 
         MakeReduceExpr reduceInputExpr = (rexBuilder, input, args, typeFactory) -> {
-            RexInputRef argExpr = rexBuilder.makeInputRef(input, args.get(0));
+            RexInputRef argExpr = rexBuilder.makeInputRef(input, args.getInt(0));
 
-            if (args.get(0) == reduceArgumentOffset) {
+            if (args.getInt(0) == reduceArgumentOffset) {
                 // Accumulator functions handle NULL, so it is safe to ignore it.
                 if (!SqlTypeUtil.equalSansNullability(finalReduceSumType, argExpr.getType())) {
                     return rexBuilder.makeCast(finalReduceSumType, argExpr, true, false);
@@ -661,7 +662,7 @@ public class MapReduceAggregates {
             }
         };
 
-        List<Integer> argList = List.of(reduceArgumentOffset, reduceArgumentOffset + 1);
+        IntList argList = IntList.of(reduceArgumentOffset, reduceArgumentOffset + 1);
         return new MapReduceAgg(
                 argList,
                 List.of(mapSum0, mapCount0),
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rule/LogicalScanConverterRule.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rule/LogicalScanConverterRule.java
index e8acec834f8..af5fe05b537 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rule/LogicalScanConverterRule.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rule/LogicalScanConverterRule.java
@@ -17,9 +17,8 @@
 
 package org.apache.ignite.internal.sql.engine.rule;
 
-import java.util.HashMap;
+import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 import org.apache.calcite.plan.RelOptCluster;
 import org.apache.calcite.plan.RelOptPlanner;
 import org.apache.calcite.plan.RelTraitSet;
@@ -31,6 +30,7 @@ import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.calcite.rex.RexLocalRef;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.util.ImmutableBitSet;
+import org.apache.calcite.util.mapping.IntPair;
 import org.apache.calcite.util.mapping.Mapping;
 import org.apache.calcite.util.mapping.Mappings;
 import org.apache.ignite.internal.sql.engine.rel.IgniteConvention;
@@ -184,8 +184,8 @@ public abstract class LogicalScanConverterRule<T extends ProjectableFilterableTa
                     ? Mappings.invert(Mappings.source(requiredColumns.asList(), tableRowSize))
                     : Mappings.createIdentity(tableRowSize);
 
-            Map<Integer, Integer> mappingMap = new HashMap<>();
 
+            List<IntPair> pairs = new ArrayList<>(projects.size());
             for (int i = 0; i < projects.size(); i++) {
                 RexNode rex = projects.get(i);
                 if (!(rex instanceof RexLocalRef)) {
@@ -194,11 +194,11 @@ public abstract class LogicalScanConverterRule<T extends ProjectableFilterableTa
 
                 RexLocalRef ref = (RexLocalRef) rex;
 
-                mappingMap.put(trimmingMapping.getSource(ref.getIndex()), i);
+                pairs.add(IntPair.of(trimmingMapping.getSource(ref.getIndex()), i));
             }
 
             return Mappings.target(
-                mappingMap,
+                pairs,
                 tableRowSize,
                 projects.size()
             );
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/trait/IgniteDistributions.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/trait/IgniteDistributions.java
index 7ae9594e939..ff37c2ceae3 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/trait/IgniteDistributions.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/trait/IgniteDistributions.java
@@ -120,7 +120,7 @@ public class IgniteDistributions {
      * @return Identity distribution.
      */
     public static IgniteDistribution identity(int key) {
-        return canonize(new DistributionTrait(List.of(key), DistributionFunction.identity()));
+        return canonize(new DistributionTrait(ImmutableIntList.of(key), DistributionFunction.identity()));
     }
 
     /**
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/trait/Partitioned.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/trait/Partitioned.java
index ab6448ca484..5bdf94b1c8f 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/trait/Partitioned.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/trait/Partitioned.java
@@ -17,8 +17,8 @@
 
 package org.apache.ignite.internal.sql.engine.trait;
 
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import java.util.List;
-import java.util.Map;
 import java.util.stream.Collectors;
 import org.apache.ignite.internal.sql.engine.exec.RowPartitionExtractor;
 
@@ -27,7 +27,7 @@ import org.apache.ignite.internal.sql.engine.exec.RowPartitionExtractor;
  * TODO Documentation https://issues.apache.org/jira/browse/IGNITE-15859
  */
 public final class Partitioned<RowT> implements Destination<RowT> {
-    private final Map<Integer, String> assignments;
+    private final Int2ObjectMap<String> assignments;
 
     private final RowPartitionExtractor<RowT> calc;
 
@@ -35,7 +35,7 @@ public final class Partitioned<RowT> implements Destination<RowT> {
      * Constructor.
      * TODO Documentation https://issues.apache.org/jira/browse/IGNITE-15859
      */
-    public Partitioned(Map<Integer, String> assignments, RowPartitionExtractor<RowT> calc) {
+    public Partitioned(Int2ObjectMap<String> assignments, RowPartitionExtractor<RowT> calc) {
         this.calc = calc;
         this.assignments = assignments;
     }
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/trait/TraitUtils.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/trait/TraitUtils.java
index 644b9c4251f..38ac3cb166e 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/trait/TraitUtils.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/trait/TraitUtils.java
@@ -29,6 +29,7 @@ import static org.apache.ignite.internal.util.CollectionUtils.nullOrEmpty;
 
 import com.google.common.collect.ImmutableList;
 import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
+import it.unimi.dsi.fastutil.ints.IntList;
 import java.lang.reflect.Proxy;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -408,6 +409,12 @@ public class TraitUtils {
      * @param keys The keys to create collation from.
      * @return New collation.
      */
+    public static RelCollation createCollation(IntList keys) {
+        return RelCollations.of(
+                keys.intStream().mapToObj(TraitUtils::createFieldCollation).collect(Collectors.toList())
+        );
+    }
+
     public static RelCollation createCollation(Collection<Integer> keys) {
         return RelCollations.of(
                 keys.stream().map(TraitUtils::createFieldCollation).collect(Collectors.toList())
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 ae0802b7160..abe90afaff8 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
@@ -56,7 +56,6 @@ import java.util.stream.Collectors;
 import org.apache.calcite.DataContexts;
 import org.apache.calcite.config.CalciteSystemProperty;
 import org.apache.calcite.config.NullCollation;
-import org.apache.calcite.linq4j.Ord;
 import org.apache.calcite.plan.Contexts;
 import org.apache.calcite.plan.ConventionTraitDef;
 import org.apache.calcite.plan.RelOptCluster;
@@ -488,8 +487,14 @@ public final class Commons {
      */
     public static Mapping trimmingMapping(int sourceSize, ImmutableBitSet requiredElements) {
         Mapping mapping = Mappings.create(MappingType.INVERSE_SURJECTION, sourceSize, requiredElements.cardinality());
-        for (Ord<Integer> ord : Ord.zip(requiredElements)) {
-            mapping.set(ord.e, ord.i);
+
+        int i = 0;
+        for (int idx = requiredElements.nextSetBit(0); idx >= 0; idx = requiredElements.nextSetBit(idx + 1)) {
+            mapping.set(idx, i++);
+
+            if (idx == Integer.MAX_VALUE) {
+                break;  // or (i+1) would overflow
+            }
         }
         return mapping;
     }
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImplTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImplTest.java
index 89cb42b4c9c..38cb46a8d34 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImplTest.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImplTest.java
@@ -70,6 +70,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.BiFunction;
 import java.util.function.Function;
+import java.util.function.LongSupplier;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -1085,7 +1086,7 @@ public class ExecutionServiceImplTest extends BaseIgniteAbstractTest {
     ) {
         PartitionPruner partitionPruner = (mappedFragments, dynamicParameters) -> mappedFragments;
 
-        Supplier<Long> topologyVerSupplier = () -> Long.MAX_VALUE;
+        LongSupplier topologyVerSupplier = () -> Long.MAX_VALUE;
 
         return new MappingServiceImpl(nodeName, clock, cacheFactory, 0, partitionPruner, topologyVerSupplier,
                 new TestExecutionDistributionProvider(logicalNodes, () -> mappingException));
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/IdentityDistributionFunctionSelfTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/IdentityDistributionFunctionSelfTest.java
index cf4689a49d3..72fad396b0d 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/IdentityDistributionFunctionSelfTest.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/IdentityDistributionFunctionSelfTest.java
@@ -24,6 +24,7 @@ import static org.hamcrest.Matchers.instanceOf;
 import static org.hamcrest.Matchers.is;
 
 import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
+import it.unimi.dsi.fastutil.longs.LongList;
 import java.util.Collection;
 import java.util.List;
 import org.apache.calcite.rel.RelDistribution.Type;
@@ -55,7 +56,7 @@ public class IdentityDistributionFunctionSelfTest {
             .addField(NativeTypes.STRING)
             .build();
 
-    private final ColocationGroup colocationGroup = new ColocationGroup(List.of(1L), List.of(NODE_1, NODE_2, NODE_3),
+    private final ColocationGroup colocationGroup = new ColocationGroup(LongList.of(1L), List.of(NODE_1, NODE_2, NODE_3),
             Int2ObjectMaps.emptyMap());
     private final DestinationFactory<Object[]> destinationFactory = new DestinationFactory<>(rowHandler, null);
 
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/PartitionProvidersTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/PartitionProvidersTest.java
index 217342b829e..669e05eec69 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/PartitionProvidersTest.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/PartitionProvidersTest.java
@@ -27,6 +27,7 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
 import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
 import it.unimi.dsi.fastutil.longs.Long2ObjectMaps;
 import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
+import it.unimi.dsi.fastutil.longs.LongList;
 import java.util.List;
 import java.util.Map;
 import org.apache.calcite.rex.RexNode;
@@ -80,7 +81,7 @@ public class PartitionProvidersTest extends BaseIgniteAbstractTest {
                 .build();
 
         ColocationGroup group = new ColocationGroup(
-                List.of(1L, 2L), List.of("n1", "n2", "n3"),
+                LongList.of(1L, 2L), List.of("n1", "n2", "n3"),
                 assignments,
                 partitionsPerNode
         );
@@ -125,7 +126,7 @@ public class PartitionProvidersTest extends BaseIgniteAbstractTest {
                 .build();
 
         ColocationGroup group = new ColocationGroup(
-                List.of(1L, 2L), List.of("n1", "n2", "n3"),
+                LongList.of(1L, 2L), List.of("n1", "n2", "n3"),
                 assignments
         );
 
@@ -169,7 +170,7 @@ public class PartitionProvidersTest extends BaseIgniteAbstractTest {
                 .build();
 
         ColocationGroup group = new ColocationGroup(
-                List.of(1L, 2L), List.of("n1", "n2", "n3"),
+                LongList.of(1L, 2L), List.of("n1", "n2", "n3"),
                 assignments,
                 Map.of()
         );
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/mapping/MappingServiceImplTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/mapping/MappingServiceImplTest.java
index ee3790aa53c..cda9b718fce 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/mapping/MappingServiceImplTest.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/mapping/MappingServiceImplTest.java
@@ -41,6 +41,7 @@ import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
 import java.util.function.Function;
+import java.util.function.LongSupplier;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 import org.apache.ignite.internal.TestHybridClock;
@@ -127,7 +128,7 @@ public class MappingServiceImplTest extends BaseIgniteAbstractTest {
         List<String> nodeNames = List.of(localNodeName, "NODE1");
 
         // Initialize mapping service.
-        Supplier<Long> logicalTopologyVerSupplier = createChangingTopologySupplier();
+        LongSupplier logicalTopologyVerSupplier = createChangingTopologySupplier();
         TestExecutionDistributionProvider execProvider = Mockito.spy(new TestExecutionDistributionProvider(nodeNames));
 
         MappingServiceImpl mappingService = Mockito.spy(new MappingServiceImpl(
@@ -196,7 +197,7 @@ public class MappingServiceImplTest extends BaseIgniteAbstractTest {
         String localNodeName = "NODE";
         List<String> nodeNames = List.of(localNodeName, "NODE1");
 
-        Supplier<Long> logicalTopologyVerSupplier = createTriggeredTopologySupplier();
+        LongSupplier logicalTopologyVerSupplier = createTriggeredTopologySupplier();
         TestExecutionDistributionProvider execProvider = Mockito.spy(new TestExecutionDistributionProvider(nodeNames));
 
         MappingServiceImpl mappingService = Mockito.spy(new MappingServiceImpl(
@@ -258,7 +259,7 @@ public class MappingServiceImplTest extends BaseIgniteAbstractTest {
         };
 
         // Initialize mapping service.
-        Supplier<Long> logicalTopologyVerSupplier = createStableTopologySupplier();
+        LongSupplier logicalTopologyVerSupplier = createStableTopologySupplier();
         ExecutionDistributionProvider execProvider = Mockito.spy(new TestExecutionDistributionProvider(nodeNames));
 
         MappingServiceImpl mappingService = Mockito.spy(new MappingServiceImpl(
@@ -291,7 +292,7 @@ public class MappingServiceImplTest extends BaseIgniteAbstractTest {
     }
 
     private MappingServiceImpl createMappingService(String localNodeName, List<String> nodeNames, int cacheSize) {
-        Supplier<Long> logicalTopologyVerSupplier = createChangingTopologySupplier();
+        LongSupplier logicalTopologyVerSupplier = createChangingTopologySupplier();
         ExecutionDistributionProvider execProvider = new TestExecutionDistributionProvider(nodeNames);
 
         return new MappingServiceImpl(
@@ -342,15 +343,15 @@ public class MappingServiceImplTest extends BaseIgniteAbstractTest {
         }
     }
 
-    private static Supplier<Long> createStableTopologySupplier() {
+    private static LongSupplier createStableTopologySupplier() {
         return () -> 1L;
     }
 
-    private Supplier<Long> createTriggeredTopologySupplier() {
+    private LongSupplier createTriggeredTopologySupplier() {
         return () -> topologyChange ? ++topologyVer : topologyVer;
     }
 
-    private Supplier<Long> createChangingTopologySupplier() {
+    private LongSupplier createChangingTopologySupplier() {
         return () -> topologyVer++;
     }
 }
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/ModifyNodeExecutionTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/ModifyNodeExecutionTest.java
index 56344e5de16..4f0791b2392 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/ModifyNodeExecutionTest.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/ModifyNodeExecutionTest.java
@@ -35,6 +35,7 @@ import static org.mockito.Mockito.when;
 
 import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
 import it.unimi.dsi.fastutil.longs.Long2ObjectMaps;
+import it.unimi.dsi.fastutil.longs.LongList;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -507,7 +508,7 @@ public class ModifyNodeExecutionTest extends AbstractExecutionTest<RowWrapper> {
 
     @Override
     protected FragmentDescription getFragmentDescription() {
-        ColocationGroup colocationGroup = new ColocationGroup(List.of(), List.of(), Int2ObjectMaps.emptyMap());
+        ColocationGroup colocationGroup = new ColocationGroup(LongList.of(), List.of(), Int2ObjectMaps.emptyMap());
         return new FragmentDescription(0, true, Long2ObjectMaps.singleton(SOURCE_ID, colocationGroup), null, null, null);
     }
 }
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/pruning/PartitionPruningPredicateSelfTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/pruning/PartitionPruningPredicateSelfTest.java
index 0184af5a813..3f54c5f7129 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/pruning/PartitionPruningPredicateSelfTest.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/pruning/PartitionPruningPredicateSelfTest.java
@@ -24,6 +24,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
 import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
+import it.unimi.dsi.fastutil.longs.LongList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
@@ -111,7 +112,7 @@ public class PartitionPruningPredicateSelfTest extends BaseIgniteAbstractTest {
 
         List<String> nodeNames = List.of("n1", "n2", "n3");
         Int2ObjectMap<NodeWithConsistencyToken> assignments = randomAssignments(table, nodeNames);
-        ColocationGroup group = new ColocationGroup(List.of(0L), nodeNames, assignments);
+        ColocationGroup group = new ColocationGroup(LongList.of(0L), nodeNames, assignments);
 
         expectPartitionsPruned(table, columns, new Object[0], group, val);
     }
@@ -159,7 +160,7 @@ public class PartitionPruningPredicateSelfTest extends BaseIgniteAbstractTest {
 
         List<String> nodeNames = List.of("n1", "n2", "n3");
         Int2ObjectMap<NodeWithConsistencyToken> assignments = randomAssignments(table, nodeNames);
-        ColocationGroup group = new ColocationGroup(List.of(0L), nodeNames, assignments);
+        ColocationGroup group = new ColocationGroup(LongList.of(0L), nodeNames, assignments);
 
         expectPartitionsPruned(table, columns, dynamicParameters, group, val);
     }