This is an automated email from the ASF dual-hosted git repository.
morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
The following commit(s) were added to refs/heads/master by this push:
new fb0ecb7 [SQL]fix inline view join mysql choose shuffle join bug
(#4048)
fb0ecb7 is described below
commit fb0ecb70fd8aed5176e986c1e81d4aaf0b1d50d1
Author: wutiangan <[email protected]>
AuthorDate: Wed Jul 8 20:56:24 2020 +0800
[SQL]fix inline view join mysql choose shuffle join bug (#4048)
fix #4047
#3886 has certain relevance to this case。
the sql : `bigtable t1 join mysqltable t2 join mysqltable t3 on t1.k1 =
t3.k1`
1. after reorder:
t1, t2, t3
2. choose join t1 with t2:
t1 join t2 with no conditions, and Doris choose cross join
3. choose join (t1 join on t2) with t3:
in old code, the t2 is mysqlTable, so the cardinality is zero,
and "the cross join t1 with t2" 's cardinality is t1.cardinality multiply
t2.cardinality,
for t2 is mysql, so t2.cardinality is zero, and "the cross join t1 with t2"
is zero.
t3 is mysqltable, t3's cardinality is zero.
**If two tables need to be joined both are zero,we will choose the shuffle
join**
So I change the mysql table ‘s cardinality from 0 to 1, the cross join's
cardinality is not zero.
---
fe/src/main/java/org/apache/doris/planner/MysqlScanNode.java | 4 ++--
fe/src/test/java/org/apache/doris/planner/QueryPlanTest.java | 4 ++++
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/fe/src/main/java/org/apache/doris/planner/MysqlScanNode.java
b/fe/src/main/java/org/apache/doris/planner/MysqlScanNode.java
index 86fa0db..c74bd4c 100644
--- a/fe/src/main/java/org/apache/doris/planner/MysqlScanNode.java
+++ b/fe/src/main/java/org/apache/doris/planner/MysqlScanNode.java
@@ -157,7 +157,7 @@ public class MysqlScanNode extends ScanNode {
numNodes = numNodes <= 0 ? 1 : numNodes;
// this is just to avoid mysql scan node's cardinality being -1. So
that we can calculate the join cost
// normally.
- // We assume that the data volume of all mysql tables is very small,
so set cardinality directly to 0.
- cardinality = cardinality == -1 ? 0 : cardinality;
+ // We assume that the data volume of all mysql tables is very small,
so set cardinality directly to 1.
+ cardinality = cardinality == -1 ? 1 : cardinality;
}
}
diff --git a/fe/src/test/java/org/apache/doris/planner/QueryPlanTest.java
b/fe/src/test/java/org/apache/doris/planner/QueryPlanTest.java
index 8e6f4d3..95fa585 100644
--- a/fe/src/test/java/org/apache/doris/planner/QueryPlanTest.java
+++ b/fe/src/test/java/org/apache/doris/planner/QueryPlanTest.java
@@ -902,5 +902,9 @@ public class QueryPlanTest {
explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext,
queryStr);
Assert.assertTrue(explainString.contains("INNER JOIN (BROADCAST)"));
Assert.assertTrue(explainString.contains("1:SCAN MYSQL"));
+
+ queryStr = "explain select * from jointest t1, mysql_table t2,
mysql_table t3 where t1.k1 = t3.k1";
+ explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext,
queryStr);
+ Assert.assertFalse(explainString.contains("INNER JOIN (PARTITIONED)"));
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]