This is an automated email from the ASF dual-hosted git repository.
morrysnow pushed a commit to branch branch-3.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-3.1 by this push:
new abbcc5232f5 branch-3.1: [fix](mv) Fix sync mv could not be chosen by
cbo stable because stats upload from be not in time #58720 (#58915)
abbcc5232f5 is described below
commit abbcc5232f569af242cb54107503e451341ccba5
Author: seawinde <[email protected]>
AuthorDate: Mon Dec 15 11:24:35 2025 +0800
branch-3.1: [fix](mv) Fix sync mv could not be chosen by cbo stable because
stats upload from be not in time #58720 (#58915)
picked from #58720
---
.../java/org/apache/doris/nereids/stats/StatsCalculator.java | 12 ++++++++++++
.../mv_p0/ssb/multiple_no_where/multiple_no_where.groovy | 2 ++
.../suites/mv_p0/ssb/multiple_ssb/multiple_ssb.groovy | 4 ++++
.../ssb/multiple_ssb_between/multiple_ssb_between.groovy | 5 ++++-
regression-test/suites/mv_p0/ssb/q_1_1/q_1_1.groovy | 1 +
regression-test/suites/mv_p0/ssb/q_2_1/q_2_1.groovy | 1 +
regression-test/suites/mv_p0/ssb/q_3_1/q_3_1.groovy | 1 +
regression-test/suites/mv_p0/ssb/q_4_1/q_4_1.groovy | 1 +
regression-test/suites/mv_p0/ssb/q_4_1_r1/q_4_1_r1.groovy | 1 +
9 files changed, 27 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 57f22c19d18..394c9a4a1b0 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
@@ -502,6 +502,12 @@ public class StatsCalculator extends
DefaultPlanVisitor<Statistics, Void> {
return Optional.empty();
}
+ private boolean isRegisteredRowCount(OlapScan olapScan) {
+ AnalysisManager analysisManager =
Env.getCurrentEnv().getAnalysisManager();
+ TableStatsMeta tableMeta =
analysisManager.findTableStatsStatus(olapScan.getTable().getId());
+ return tableMeta != null && tableMeta.userInjected;
+ }
+
private Statistics computeOlapScan(OlapScan olapScan) {
OlapTable olapTable = olapScan.getTable();
double tableRowCount = getOlapTableRowCount(olapScan);
@@ -520,6 +526,12 @@ public class StatsCalculator extends
DefaultPlanVisitor<Statistics, Void> {
if (selectedPartitionsRowCount == -1) {
selectedPartitionsRowCount = tableRowCount;
}
+ if (isRegisteredRowCount(olapScan)) {
+ // If a row count is injected for the materialized view,
use it to fix the issue where
+ // the materialized view cannot be selected by cbo stable
due to selectedPartitionsRowCount being 0,
+ // which is caused by delayed statistics reporting.
+ selectedPartitionsRowCount = tableRowCount;
+ }
// if estimated mv rowCount is more than actual row count,
fall back to base table stats
if (selectedPartitionsRowCount >=
optStats.get().getRowCount()) {
Statistics derivedStats = optStats.get();
diff --git
a/regression-test/suites/mv_p0/ssb/multiple_no_where/multiple_no_where.groovy
b/regression-test/suites/mv_p0/ssb/multiple_no_where/multiple_no_where.groovy
index a02cd486155..ce418fa6ca3 100644
---
a/regression-test/suites/mv_p0/ssb/multiple_no_where/multiple_no_where.groovy
+++
b/regression-test/suites/mv_p0/ssb/multiple_no_where/multiple_no_where.groovy
@@ -107,6 +107,8 @@ suite ("multiple_no_where") {
qt_select_star "select * from lineorder_flat order by 1,2, P_MFGR;"
sql """analyze table lineorder_flat with sync;"""
+ sql """alter table lineorder_flat modify column C_CITY set stats
('row_count'='7');"""
+ sql """alter table lineorder_flat modify column mv_LO_ORDERKEY set stats
('row_count'='1');"""
sql """set enable_stats=false;"""
mv_rewrite_success("""SELECT SUM(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue
diff --git a/regression-test/suites/mv_p0/ssb/multiple_ssb/multiple_ssb.groovy
b/regression-test/suites/mv_p0/ssb/multiple_ssb/multiple_ssb.groovy
index 441f9fd7a32..9ca2fe5e856 100644
--- a/regression-test/suites/mv_p0/ssb/multiple_ssb/multiple_ssb.groovy
+++ b/regression-test/suites/mv_p0/ssb/multiple_ssb/multiple_ssb.groovy
@@ -154,6 +154,10 @@ suite ("multiple_ssb") {
sql """analyze table lineorder_flat with sync;"""
sql """alter table lineorder_flat modify column LO_ORDERDATE set stats
('row_count'='8');"""
+ sql """alter table lineorder_flat modify column a1 set stats
('row_count'='1');"""
+ sql """alter table lineorder_flat modify column a4 set stats
('row_count'='1');"""
+ sql """alter table lineorder_flat modify column a6 set stats
('row_count'='1');"""
+ sql """alter table lineorder_flat modify column x2 set stats
('row_count'='1');"""
sql """set enable_stats=false;"""
mv_rewrite_success("""SELECT SUM(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue
diff --git
a/regression-test/suites/mv_p0/ssb/multiple_ssb_between/multiple_ssb_between.groovy
b/regression-test/suites/mv_p0/ssb/multiple_ssb_between/multiple_ssb_between.groovy
index 4dfdd748a57..ebeaf7c1674 100644
---
a/regression-test/suites/mv_p0/ssb/multiple_ssb_between/multiple_ssb_between.groovy
+++
b/regression-test/suites/mv_p0/ssb/multiple_ssb_between/multiple_ssb_between.groovy
@@ -153,7 +153,10 @@ suite ("multiple_ssb_between") {
sql """set enable_stats=true;"""
sql """alter table lineorder_flat modify column LO_ORDERDATE set stats
('row_count'='8');"""
-
+ sql """alter table lineorder_flat modify column mv_LO_ORDERKEY set stats
('row_count'='1');"""
+ sql """alter table lineorder_flat modify column mv_P_BRAND set stats
('row_count'='1');"""
+ sql """alter table lineorder_flat modify column mv_C_NATION set stats
('row_count'='1');"""
+
mv_rewrite_success("""SELECT SUM(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue
FROM lineorder_flat
WHERE
diff --git a/regression-test/suites/mv_p0/ssb/q_1_1/q_1_1.groovy
b/regression-test/suites/mv_p0/ssb/q_1_1/q_1_1.groovy
index 5ff94e88522..2bcc8fde8e6 100644
--- a/regression-test/suites/mv_p0/ssb/q_1_1/q_1_1.groovy
+++ b/regression-test/suites/mv_p0/ssb/q_1_1/q_1_1.groovy
@@ -102,6 +102,7 @@ suite ("mv_ssb_q_1_1") {
sql "analyze table lineorder_flat with sync;"
sql """alter table lineorder_flat modify column C_CITY set stats
('row_count'='6');"""
+ sql """alter table lineorder_flat modify column mv_LO_ORDERKEY set stats
('row_count'='1');"""
mv_rewrite_success("""SELECT SUM(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue
FROM lineorder_flat
WHERE
diff --git a/regression-test/suites/mv_p0/ssb/q_2_1/q_2_1.groovy
b/regression-test/suites/mv_p0/ssb/q_2_1/q_2_1.groovy
index 0ac5f0245ef..80daf66626e 100644
--- a/regression-test/suites/mv_p0/ssb/q_2_1/q_2_1.groovy
+++ b/regression-test/suites/mv_p0/ssb/q_2_1/q_2_1.groovy
@@ -94,6 +94,7 @@ suite ("mv_ssb_q_2_1") {
qt_select_star "select * from lineorder_flat order by 1,2,P_MFGR;"
sql """alter table lineorder_flat modify column LO_ORDERDATE set stats
('row_count'='2');"""
+ sql """alter table lineorder_flat modify column mv_P_BRAND set stats
('row_count'='1');"""
mv_rewrite_success("""SELECT
SUM(LO_REVENUE), (LO_ORDERDATE DIV 10000) AS YEAR,
diff --git a/regression-test/suites/mv_p0/ssb/q_3_1/q_3_1.groovy
b/regression-test/suites/mv_p0/ssb/q_3_1/q_3_1.groovy
index 6b333d97050..bffee2042d7 100644
--- a/regression-test/suites/mv_p0/ssb/q_3_1/q_3_1.groovy
+++ b/regression-test/suites/mv_p0/ssb/q_3_1/q_3_1.groovy
@@ -99,6 +99,7 @@ suite ("mv_ssb_q_3_1") {
sql """analyze table lineorder_flat with sync;"""
sql """alter table lineorder_flat modify column LO_ORDERDATE set stats
('row_count'='2');"""
+ sql """alter table lineorder_flat modify column mv_C_NATION set stats
('row_count'='1');"""
mv_rewrite_success("""SELECT
C_NATION,
diff --git a/regression-test/suites/mv_p0/ssb/q_4_1/q_4_1.groovy
b/regression-test/suites/mv_p0/ssb/q_4_1/q_4_1.groovy
index 361f60997e3..f7c1222a638 100644
--- a/regression-test/suites/mv_p0/ssb/q_4_1/q_4_1.groovy
+++ b/regression-test/suites/mv_p0/ssb/q_4_1/q_4_1.groovy
@@ -93,6 +93,7 @@ suite ("mv_ssb_q_4_1") {
sql """analyze table lineorder_flat with sync;"""
sql """alter table lineorder_flat modify column LO_ORDERDATE set stats
('row_count'='2');"""
+ sql """alter table lineorder_flat modify column mv_C_NATION set stats
('row_count'='1');"""
mv_rewrite_success("""SELECT (LO_ORDERDATE DIV 10000) AS YEAR,
C_NATION,
diff --git a/regression-test/suites/mv_p0/ssb/q_4_1_r1/q_4_1_r1.groovy
b/regression-test/suites/mv_p0/ssb/q_4_1_r1/q_4_1_r1.groovy
index a12853573f1..dd8468c5e6e 100644
--- a/regression-test/suites/mv_p0/ssb/q_4_1_r1/q_4_1_r1.groovy
+++ b/regression-test/suites/mv_p0/ssb/q_4_1_r1/q_4_1_r1.groovy
@@ -96,6 +96,7 @@ suite ("q_4_1_r1") {
sql """analyze table lineorder_flat with sync;"""
sql """alter table lineorder_flat modify column LO_ORDERDATE set stats
('row_count'='8');"""
+ sql """alter table lineorder_flat modify column mv_C_NATION set stats
('row_count'='1');"""
sql """set enable_stats=false;"""
mv_rewrite_success("""SELECT (LO_ORDERDATE DIV 10000) AS YEAR,
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]