From 0c8934642e9e1840f455021f458bbbaf3d2bfbb8 Mon Sep 17 00:00:00 2001 From: minghong Date: Tue, 2 Jul 2024 13:54:05 +0800 Subject: [PATCH] [opt](nereids)using mv's derived stats #35721 (#37098) pick from #35721 (cherry picked from commit a481d79b1e258f7b6711157bb0d5e4c224e680e5) ## Proposed changes Issue Number: close #xxx --- .../doris/nereids/stats/StatsCalculator.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) 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 6a8d123405..4d4f68bb29 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 @@ -760,6 +760,21 @@ public class StatsCalculator extends DefaultPlanVisitor { // 2. Consider the influence of runtime filter // 3. Get NDV and column data size from StatisticManger, StatisticManager doesn't support it now. private Statistics computeCatalogRelation(CatalogRelation catalogRelation) { + if (catalogRelation instanceof LogicalOlapScan) { + LogicalOlapScan olap = (LogicalOlapScan) catalogRelation; + if (olap.getSelectedIndexId() != olap.getTable().getBaseIndexId()) { + // mv is selected, return its estimated stats + Optional optStats = cascadesContext.getStatementContext() + .getStatistics(olap.getRelationId()); + if (optStats.isPresent()) { + double actualRowCount = catalogRelation.getTable().getRowCountForNereids(); + if (actualRowCount > optStats.get().getRowCount()) { + return optStats.get(); + } + } + } + } + List output = catalogRelation.getOutput(); ImmutableSet.Builder slotSetBuilder = ImmutableSet.builderWithExpectedSize(output.size()); for (Slot slot : output) {