diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java index 7ea92ee73b384f..86886336d85109 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java @@ -54,11 +54,11 @@ import org.apache.doris.nereids.trees.expressions.SlotReference; import org.apache.doris.nereids.trees.plans.ComputeResultSet; import org.apache.doris.nereids.trees.plans.Plan; +import org.apache.doris.nereids.trees.plans.algebra.CatalogRelation; import org.apache.doris.nereids.trees.plans.commands.ExplainCommand.ExplainLevel; import org.apache.doris.nereids.trees.plans.distribute.DistributePlanner; import org.apache.doris.nereids.trees.plans.distribute.DistributedPlan; import org.apache.doris.nereids.trees.plans.distribute.FragmentIdMapping; -import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan; import org.apache.doris.nereids.trees.plans.logical.LogicalPlan; import org.apache.doris.nereids.trees.plans.logical.LogicalSqlCache; import org.apache.doris.nereids.trees.plans.physical.PhysicalPlan; @@ -272,8 +272,8 @@ private Plan planWithoutLock( // 2. ut test. In ut test, FeConstants.enableInternalSchemaDb is false or FeConstants.runningUnitTest is true if (FeConstants.enableInternalSchemaDb && !FeConstants.runningUnitTest && !cascadesContext.isLeadingDisableJoinReorder()) { - List scans = cascadesContext.getRewritePlan() - .collectToList(LogicalOlapScan.class::isInstance); + List scans = cascadesContext.getRewritePlan() + .collectToList(CatalogRelation.class::isInstance); Optional disableJoinReorderReason = StatsCalculator .disableJoinReorderIfStatsInvalid(scans, cascadesContext); disableJoinReorderReason.ifPresent(statementContext::setDisableJoinReorderReason); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java index d4a9a81fc07c1d..a3c117bb46f8ae 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java @@ -226,32 +226,34 @@ public Map getTotalColumnStatisticMap() { * 2. col stats ndv=0 but minExpr or maxExpr is not null * 3. ndv > 10 * rowCount */ - public static Optional disableJoinReorderIfStatsInvalid(List scans, + public static Optional disableJoinReorderIfStatsInvalid(List scans, CascadesContext context) { StatsCalculator calculator = new StatsCalculator(context); if (ConnectContext.get() == null) { // ut case return Optional.empty(); } - for (LogicalOlapScan scan : scans) { - double rowCount = calculator.getOlapTableRowCount(scan); + for (CatalogRelation scan : scans) { + double rowCount = calculator.getTableRowCount(scan); // row count not available if (rowCount == -1) { LOG.info("disable join reorder since row count not available: " + scan.getTable().getNameWithFullQualifiers()); return Optional.of("table[" + scan.getTable().getName() + "] row count is invalid"); } - // ndv abnormal - Optional reason = calculator.checkNdvValidation(scan, rowCount); - if (reason.isPresent()) { - try { - ConnectContext.get().getSessionVariable().disableNereidsJoinReorderOnce(); - LOG.info("disable join reorder since col stats invalid: " - + reason.get()); - } catch (Exception e) { - LOG.info("disableNereidsJoinReorderOnce failed"); + if (scan instanceof OlapScan) { + // ndv abnormal + Optional reason = calculator.checkNdvValidation((OlapScan) scan, rowCount); + if (reason.isPresent()) { + try { + ConnectContext.get().getSessionVariable().disableNereidsJoinReorderOnce(); + LOG.info("disable join reorder since col stats invalid: " + + reason.get()); + } catch (Exception e) { + LOG.info("disableNereidsJoinReorderOnce failed"); + } + return reason; } - return reason; } } return Optional.empty(); @@ -407,6 +409,14 @@ private void checkIfUnknownStatsUsedAsKey(StatisticsBuilder builder) { } } + private double getTableRowCount(CatalogRelation scan) { + if (scan instanceof OlapScan) { + return getOlapTableRowCount((OlapScan) scan); + } else { + return scan.getTable().getRowCount(); + } + } + /** * if the table is not analyzed and BE does not report row count, return -1 */ @@ -1212,11 +1222,12 @@ private ColumnStatistic getColumnStatistic(TableIf table, String colName, long i */ private Statistics computeCatalogRelation(CatalogRelation catalogRelation) { StatisticsBuilder builder = new StatisticsBuilder(); + double tableRowCount = catalogRelation.getTable().getRowCount(); // for FeUt, use ColumnStatistic.UNKNOWN if (!FeConstants.enableInternalSchemaDb || ConnectContext.get() == null || ConnectContext.get().getSessionVariable().internalSession) { - builder.setRowCount(catalogRelation.getTable().getRowCountForNereids()); + builder.setRowCount(Math.max(1, tableRowCount)); for (Slot slot : catalogRelation.getOutput()) { builder.putColumnStatistics(slot, ColumnStatistic.UNKNOWN); } @@ -1232,8 +1243,8 @@ private Statistics computeCatalogRelation(CatalogRelation catalogRelation) { } } Set slotSet = slotSetBuilder.build(); - double tableRowCount = catalogRelation.getTable().getRowCount(); if (tableRowCount <= 0) { + tableRowCount = 1; // try to get row count from col stats for (SlotReference slot : slotSet) { ColumnStatistic cache = getColumnStatsFromTableCache(catalogRelation, slot);