This is an automated email from the ASF dual-hosted git repository. amashenkov pushed a commit to branch ignite-21580 in repository https://gitbox.apache.org/repos/asf/ignite-3.git
commit f49027b304c5e453857f0eaceccfecd28ce0d6a0 Author: amashenkov <andrey.mashen...@gmail.com> AuthorDate: Fri Mar 29 19:23:37 2024 +0300 Fix distinct row count calculation. --- .../engine/metadata/IgniteMdDistinctRowCount.java | 27 +++++++++++++++++----- .../internal/sql/engine/rel/IgniteAggregate.java | 8 ++++--- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/metadata/IgniteMdDistinctRowCount.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/metadata/IgniteMdDistinctRowCount.java index 9530ee5059..6b1cce64c2 100644 --- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/metadata/IgniteMdDistinctRowCount.java +++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/metadata/IgniteMdDistinctRowCount.java @@ -17,7 +17,10 @@ package org.apache.ignite.internal.sql.engine.metadata; +import org.apache.calcite.plan.Convention; import org.apache.calcite.plan.volcano.RelSubset; +import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.metadata.CyclicMetadataException; import org.apache.calcite.rel.metadata.ReflectiveRelMetadataProvider; import org.apache.calcite.rel.metadata.RelMdDistinctRowCount; import org.apache.calcite.rel.metadata.RelMetadataProvider; @@ -25,6 +28,7 @@ import org.apache.calcite.rel.metadata.RelMetadataQuery; import org.apache.calcite.rex.RexNode; import org.apache.calcite.util.BuiltInMethod; import org.apache.calcite.util.ImmutableBitSet; +import org.apache.calcite.util.NumberUtil; /** * IgniteMdDistinctRowCount. @@ -44,14 +48,25 @@ public class IgniteMdDistinctRowCount extends RelMdDistinctRowCount { ImmutableBitSet groupKey, RexNode predicate ) { - if (groupKey.cardinality() == 0) { - return 1d; + RelNode best = rel.getBest(); + if (best != null) { + return mq.getDistinctRowCount(best, groupKey, predicate); } - double rowCount = mq.getRowCount(rel); - - rowCount *= 1.0 - Math.pow(.5, groupKey.cardinality()); + if (rel.getConvention() == Convention.NONE) { + return null; + } - return rowCount; + Double d = null; + for (RelNode r2 : rel.getRels()) { + try { + Double d2 = mq.getDistinctRowCount(r2, groupKey, predicate); + d = NumberUtil.min(d, d2); + } catch (CyclicMetadataException e) { + // Ignore this relational expression; there will be non-cyclic ones + // in this set. + } + } + return d; } } diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/IgniteAggregate.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/IgniteAggregate.java index 484ad1f0c8..78a0a3d67b 100644 --- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/IgniteAggregate.java +++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/IgniteAggregate.java @@ -81,11 +81,13 @@ public abstract class IgniteAggregate extends Aggregate implements IgniteRel { for (AggregateCall aggCall : aggCalls) { if (aggCall.isDistinct()) { - Double distinctRowCount = mq.getDistinctRowCount(getInput(), ImmutableBitSet.of(aggCall.getArgList()), null); + ImmutableBitSet aggGroup = ImmutableBitSet.of(aggCall.getArgList()); + Double distinctRowCount = mq.getDistinctRowCount(getInput(), aggGroup, null); - double rows = distinctRowCount == null ? input.estimateRowCount(mq) : distinctRowCount; + double distinctRows = distinctRowCount != null ? distinctRowCount + : mq.getRowCount(getInput()) * (1 - Math.pow(0.5, aggGroup.cardinality())); - mem += IgniteCost.AGG_CALL_MEM_COST * rows / grps; + mem += IgniteCost.AGG_CALL_MEM_COST * distinctRows / grps; } else { mem += IgniteCost.AGG_CALL_MEM_COST; }