[feature](nereids) using rollup column stats (#30852)

This commit is contained in:
minghong
2024-02-06 17:02:41 +08:00
committed by yiguolei
parent f95d0cf802
commit cb43ac8ab2

View File

@ -44,6 +44,7 @@ import org.apache.doris.nereids.trees.plans.algebra.EmptyRelation;
import org.apache.doris.nereids.trees.plans.algebra.Filter;
import org.apache.doris.nereids.trees.plans.algebra.Generate;
import org.apache.doris.nereids.trees.plans.algebra.Limit;
import org.apache.doris.nereids.trees.plans.algebra.OlapScan;
import org.apache.doris.nereids.trees.plans.algebra.PartitionTopN;
import org.apache.doris.nereids.trees.plans.algebra.Project;
import org.apache.doris.nereids.trees.plans.algebra.Repeat;
@ -608,7 +609,7 @@ public class StatsCalculator extends DefaultPlanVisitor<Statistics, Void> {
return new FilterEstimation().estimate(filter.getPredicate(), stats);
}
private ColumnStatistic getColumnStatistic(TableIf table, String colName) {
private ColumnStatistic getColumnStatistic(TableIf table, String colName, long idxId) {
ConnectContext connectContext = ConnectContext.get();
if (connectContext != null && connectContext.getSessionVariable().internalSession) {
return ColumnStatistic.UNKNOWN;
@ -633,9 +634,8 @@ public class StatsCalculator extends DefaultPlanVisitor<Statistics, Void> {
return ColumnStatistic.UNKNOWN;
}
} else {
// TODO. Get index id for materialized view.
return Env.getCurrentEnv().getStatisticsCache().getColumnStatistics(
catalogId, dbId, table.getId(), -1, colName);
catalogId, dbId, table.getId(), idxId, colName);
}
}
@ -649,8 +649,17 @@ public class StatsCalculator extends DefaultPlanVisitor<Statistics, Void> {
TableIf table = catalogRelation.getTable();
double rowCount = catalogRelation.getTable().estimatedRowCount();
boolean hasUnknownCol = false;
long idxId = -1;
if (catalogRelation instanceof OlapScan) {
OlapScan olapScan = (OlapScan) catalogRelation;
if (olapScan.getTable().getBaseIndexId() != olapScan.getSelectedIndexId()) {
idxId = olapScan.getSelectedIndexId();
}
}
for (SlotReference slotReference : slotSet) {
String colName = slotReference.getName();
String colName = slotReference.getColumn().isPresent()
? slotReference.getColumn().get().getName()
: slotReference.getName();
boolean shouldIgnoreThisCol = StatisticConstants.shouldIgnoreCol(table, slotReference.getColumn().get());
if (colName == null) {
@ -661,7 +670,7 @@ public class StatsCalculator extends DefaultPlanVisitor<Statistics, Void> {
|| shouldIgnoreThisCol) {
cache = ColumnStatistic.UNKNOWN;
} else {
cache = getColumnStatistic(table, colName);
cache = getColumnStatistic(table, colName, idxId);
}
if (cache.avgSizeByte <= 0) {
cache = new ColumnStatisticBuilder(cache)