From 0ff3073fc4166ccc8ba4bb6f06c0904b88766577 Mon Sep 17 00:00:00 2001 From: jakevin Date: Thu, 1 Jun 2023 13:30:19 +0800 Subject: [PATCH] [improvement](Nereids): limit Memo groupExpression size. (#20272) --- .../nereids/jobs/cascades/OptimizeGroupExpressionJob.java | 4 +++- .../src/main/java/org/apache/doris/nereids/memo/Memo.java | 4 ++++ .../src/main/java/org/apache/doris/qe/SessionVariable.java | 3 +++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/cascades/OptimizeGroupExpressionJob.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/cascades/OptimizeGroupExpressionJob.java index e0612bcbd3..c9fba86d78 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/cascades/OptimizeGroupExpressionJob.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/cascades/OptimizeGroupExpressionJob.java @@ -57,7 +57,9 @@ public class OptimizeGroupExpressionJob extends Job { private List getExplorationRules() { boolean isDisableJoinReorder = context.getCascadesContext().getConnectContext().getSessionVariable() - .isDisableJoinReorder(); + .isDisableJoinReorder() + || context.getCascadesContext().getMemo().getGroupExpressionsSize() > context.getCascadesContext() + .getConnectContext().getSessionVariable().memoMaxGroupExpressionSize; boolean isDpHyp = context.getCascadesContext().getStatementContext().isDpHyp(); boolean isEnableBushyTree = context.getCascadesContext().getConnectContext().getSessionVariable() .isEnableBushyTree(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java index 558fb9e99f..9c4f79dce6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/memo/Memo.java @@ -110,6 +110,10 @@ public class Memo { return groupExpressions; } + public int getGroupExpressionsSize() { + return groupExpressions.size(); + } + private Plan skipProject(Plan plan, Group targetGroup) { // Some top project can't be eliminated if (plan instanceof LogicalProject && ((LogicalProject) plan).canEliminate()) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java index f26e5fc47e..0c9beec9a2 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java @@ -900,6 +900,9 @@ public class SessionVariable implements Serializable, Writable { @VariableMgr.VarAttr(name = DUMP_NEREIDS_MEMO) public boolean dumpNereidsMemo = false; + @VariableMgr.VarAttr(name = "memo_max_group_expression_size") + public int memoMaxGroupExpressionSize = 40000; + @VariableMgr.VarAttr(name = ENABLE_MINIDUMP) public boolean enableMinidump = false;