From 57dadf50ee4710c66da526b06a8cda0ba3aa9edd Mon Sep 17 00:00:00 2001 From: Collapsar Date: Fri, 27 Nov 2020 22:32:44 +0800 Subject: [PATCH] optimize er left join global (#2334) * optimize er left join global * optimize er left join global * fix checkstyle (cherry picked from commit 2f6b3bfec14854e8e24b7a1f9d0e299a2c52fe55) --- dble_checkstyle_suppression.xml | 2 +- .../com/actiontech/dble/plan/optimizer/ERJoinChooser.java | 8 +++++--- .../dble/plan/optimizer/GlobalTableProcessor.java | 7 ++++--- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/dble_checkstyle_suppression.xml b/dble_checkstyle_suppression.xml index f9426b83b..e2ef88778 100644 --- a/dble_checkstyle_suppression.xml +++ b/dble_checkstyle_suppression.xml @@ -10,7 +10,6 @@ "http://checkstyle.sourceforge.net/dtds/suppressions_1_1.dtd"> - @@ -24,6 +23,7 @@ + \ No newline at end of file diff --git a/src/main/java/com/actiontech/dble/plan/optimizer/ERJoinChooser.java b/src/main/java/com/actiontech/dble/plan/optimizer/ERJoinChooser.java index 96a294529..dd799a14b 100644 --- a/src/main/java/com/actiontech/dble/plan/optimizer/ERJoinChooser.java +++ b/src/main/java/com/actiontech/dble/plan/optimizer/ERJoinChooser.java @@ -77,7 +77,7 @@ public class ERJoinChooser { * left join's ER is different from inner join's * ex:t1,t2 ,if t1 left join t2 on * t1.id=t2.id can be pushed - * < we cna't change left join's structure> + * < we can't change left join's structure> * * @return */ @@ -107,6 +107,7 @@ public class ERJoinChooser { return null; else if (!PlanUtil.isERNode(child) && child.type() != PlanNode.PlanNodeType.TABLE) return null; + if (onItem == null || !onItem.type().equals(Item.ItemType.FIELD_ITEM)) return null; Pair joinColumnInfo = PlanUtil.findColumnInTableLeaf((ItemField) onItem, joinNode); @@ -130,7 +131,7 @@ public class ERJoinChooser { /* ------------------- left join optimizer end -------------------- */ /** - * inner join's ER, rebuild inner joi's unit + * inner join's ER, rebuild inner join's unit * * @return */ @@ -390,7 +391,8 @@ public class ERJoinChooser { private boolean isUnit(PlanNode node) { if (isGlobalTree(node)) return true; - else return node.type() != PlanNode.PlanNodeType.JOIN || node.isWithSubQuery() || !((JoinNode) node).isInnerJoin(); + else + return node.type() != PlanNode.PlanNodeType.JOIN || node.isWithSubQuery() || !((JoinNode) node).isInnerJoin(); } /** diff --git a/src/main/java/com/actiontech/dble/plan/optimizer/GlobalTableProcessor.java b/src/main/java/com/actiontech/dble/plan/optimizer/GlobalTableProcessor.java index 9def8ceb7..a09cb780d 100644 --- a/src/main/java/com/actiontech/dble/plan/optimizer/GlobalTableProcessor.java +++ b/src/main/java/com/actiontech/dble/plan/optimizer/GlobalTableProcessor.java @@ -55,8 +55,7 @@ public final class GlobalTableProcessor { if (PlanUtil.isERNode(tn)) { // treat er join as an un global table tn.setUnGlobalTableCount(1); - Set newSet = new HashSet<>(); - newSet.addAll(tn.getReferedTableNodes().get(0).getNoshardNode()); + Set newSet = new HashSet<>(tn.getReferedTableNodes().get(0).getNoshardNode()); tn.setNoshardNode(newSet); } else { int unGlobalCount = calcUnGlobalCount(tn); @@ -84,7 +83,9 @@ public final class GlobalTableProcessor { if (left.getUnGlobalTableCount() == 0) { // left node is global,left join will not push down tn.setNoshardNode(null); status = false; - } else if (left.type() == PlanNode.PlanNodeType.TABLE || PlanUtil.isERNode(left)) { + } else if (left.type() == PlanNode.PlanNodeType.TABLE || + PlanUtil.isERNode(left) || + left.getNoshardNode() != null && left.getNoshardNode().size() > 0) { if (!isGlobalTableBigEnough(jn)) { tn.setNoshardNode(null); status = false;