diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/FilterEstimation.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/FilterEstimation.java index 915a885a36ad870..70a05f018d8e32e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/FilterEstimation.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/FilterEstimation.java @@ -68,6 +68,7 @@ */ public class FilterEstimation extends ExpressionVisitor { public static final double DEFAULT_INEQUALITY_COEFFICIENT = 0.5; + public static final double RANGE_SELECTIVITY_THRESHOULD = 0.01; public static final double DEFAULT_IN_COEFFICIENT = 1.0 / 3.0; public static final double DEFAULT_HAVING_COEFFICIENT = 0.01; @@ -597,6 +598,8 @@ private Statistics estimateBinaryComparisonFilter(Expression leftExpr, DataType double sel = leftRange.overlapPercentWith(rightRange); if (!(dataType instanceof RangeScalable) && (sel != 0.0 && sel != 1.0)) { sel = DEFAULT_INEQUALITY_COEFFICIENT; + } else if (sel < RANGE_SELECTIVITY_THRESHOULD) { + sel = RANGE_SELECTIVITY_THRESHOULD; } sel = getNotNullSelectivity(leftStats, sel); updatedStatistics = context.statistics.withSel(sel); diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/stats/FilterEstimationTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/stats/FilterEstimationTest.java index 981a7e05b919a6e..e5b39e0a7e2c69f 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/stats/FilterEstimationTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/stats/FilterEstimationTest.java @@ -1301,7 +1301,9 @@ public void testLargeRange() { .setCount(row) .setNdv(10000) .setMinExpr(new IntLiteral(0)) + .setMinValue(0) .setMaxExpr(new IntLiteral(tenB)) + .setMaxValue(tenB) .build(); Statistics stats = new StatisticsBuilder() .setRowCount(row) @@ -1310,6 +1312,6 @@ public void testLargeRange() { Expression pred = new LessThan(a, new IntegerLiteral(50000)); FilterEstimation estimation = new FilterEstimation(); Statistics out = estimation.estimate(pred, stats); - System.out.println(out); + Assertions.assertEquals(out.getRowCount(), row * FilterEstimation.RANGE_SELECTIVITY_THRESHOULD); } }