From 3d0ac0ce88648ab03c0176b7750813e7b99534f6 Mon Sep 17 00:00:00 2001 From: minghong Date: Fri, 31 May 2024 16:24:13 +0800 Subject: [PATCH 1/3] using mv's derived stats --- .../org/apache/doris/nereids/stats/StatsCalculator.java | 9 +++++++++ 1 file changed, 9 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 b2ccb684a3b6b7..add72f0e8f6f69 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 @@ -754,6 +754,15 @@ private ColumnStatistic getColumnStatistic(TableIf table, String colName, long i // 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) catalogRelation).isIndexSelected()) { + // mv is selected, return its estimated stats + Optional optStats = cascadesContext.getStatementContext() + .getStatistics(((LogicalOlapScan) catalogRelation).getRelationId()); + if (optStats.isPresent()) { + return optStats.get(); + } + } + List output = catalogRelation.getOutput(); ImmutableSet.Builder slotSetBuilder = ImmutableSet.builderWithExpectedSize(output.size()); for (Slot slot : output) { From 47567a36c88212ae8c819514a58625a4653eb166 Mon Sep 17 00:00:00 2001 From: minghong Date: Tue, 4 Jun 2024 11:38:50 +0800 Subject: [PATCH 2/3] is mv used --- .../doris/nereids/stats/StatsCalculator.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) 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 add72f0e8f6f69..26cb09c12fa971 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 @@ -754,12 +754,15 @@ private ColumnStatistic getColumnStatistic(TableIf table, String colName, long i // 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) catalogRelation).isIndexSelected()) { - // mv is selected, return its estimated stats - Optional optStats = cascadesContext.getStatementContext() - .getStatistics(((LogicalOlapScan) catalogRelation).getRelationId()); - if (optStats.isPresent()) { - return optStats.get(); + 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()) { + return optStats.get(); + } } } From a37e32bdda3bcadcc6248db46c1b3088e919294b Mon Sep 17 00:00:00 2001 From: minghong Date: Tue, 4 Jun 2024 17:13:58 +0800 Subject: [PATCH 3/3] mv.row > table.row --- .../java/org/apache/doris/nereids/stats/StatsCalculator.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 26cb09c12fa971..04e71b53d03095 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 @@ -761,7 +761,10 @@ private Statistics computeCatalogRelation(CatalogRelation catalogRelation) { Optional optStats = cascadesContext.getStatementContext() .getStatistics(olap.getRelationId()); if (optStats.isPresent()) { - return optStats.get(); + double actualRowCount = catalogRelation.getTable().getRowCountForNereids(); + if (actualRowCount > optStats.get().getRowCount()) { + return optStats.get(); + } } } }