This is an automated email from the ASF dual-hosted git repository.

morningman pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new 666a7d05650 [fix](plan) only scan node with limit and no predicate can 
reduce to 1 instance (#31342) (#31606)
666a7d05650 is described below

commit 666a7d056506393087794be529a7c9e83114451c
Author: Mingyu Chen <morning...@163.com>
AuthorDate: Fri Mar 1 14:03:24 2024 +0800

    [fix](plan) only scan node with limit and no predicate can reduce to 1 
instance (#31342) (#31606)
    
    This PR #25952 introduce a opt that if a scan node has limit and 
predicates, use only 1 instance to save cup and memory.
    But this is wrong because we can not guarantee that the predicates can 
truly help to prune the data.
    So I modify the logic to remove this opt.
    Now, only scan node with limit and NO predicate can reduce to only 1 
instance.
---
 .../src/main/java/org/apache/doris/planner/OlapScanNode.java      | 2 ++
 fe/fe-core/src/main/java/org/apache/doris/planner/ScanNode.java   | 4 ++--
 fe/fe-core/src/main/java/org/apache/doris/qe/Coordinator.java     | 8 ++++----
 3 files changed, 8 insertions(+), 6 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java 
b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java
index 49d961be5c8..68be7541043 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java
@@ -1344,6 +1344,8 @@ public class OlapScanNode extends ScanNode {
     // If scan is key search, should not enable the shared scan opt to prevent 
the performance problem
     // 1. where contain the eq or in expr of key column slot
     // 2. key column slot is distribution column and first column
+    // FIXME: this is not a good check, we can not guarantee that the 
predicate we check can truly
+    // help to prune the data, so we should check the predicate's effect on 
the data.
     protected boolean isKeySearch() {
         List<SlotRef> whereSlot = Lists.newArrayList();
         for (Expr conjunct : conjuncts) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/ScanNode.java 
b/fe/fe-core/src/main/java/org/apache/doris/planner/ScanNode.java
index 648eac047d4..99184df1453 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/ScanNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/ScanNode.java
@@ -708,7 +708,7 @@ public abstract class ScanNode extends PlanNode {
         return isKeySearch() || !enableShardScan;
     }
 
-    public boolean haveLimitAndConjunts() {
-        return hasLimit() && !conjuncts.isEmpty();
+    public boolean shouldUseOneInstance() {
+        return hasLimit() && conjuncts.isEmpty();
     }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/Coordinator.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/Coordinator.java
index d0f03aa00e1..96ed3649007 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/Coordinator.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/Coordinator.java
@@ -1752,9 +1752,9 @@ public class Coordinator implements CoordInterface {
                                 //the scan instance num should not larger than 
the tablets num
                                 expectedInstanceNum = 
Math.min(perNodeScanRanges.size(), parallelExecInstanceNum);
                             }
-                            // if have limit and conjunts, only need 1 
instance to save cpu and
+                            // if have limit and no conjuncts, only need 1 
instance to save cpu and
                             // mem resource
-                            if (node.isPresent() && 
node.get().haveLimitAndConjunts()) {
+                            if (node.isPresent() && 
node.get().shouldUseOneInstance()) {
                                 expectedInstanceNum = 1;
                             }
 
@@ -1765,9 +1765,9 @@ public class Coordinator implements CoordInterface {
                             int expectedInstanceNum = 
Math.min(parallelExecInstanceNum,
                                     leftMostNode.getNumInstances());
                             expectedInstanceNum = 
Math.max(expectedInstanceNum, 1);
-                            // if have limit and conjunts, only need 1 
instance to save cpu and
+                            // if have limit and conjuncts, only need 1 
instance to save cpu and
                             // mem resource
-                            if (node.isPresent() && 
node.get().haveLimitAndConjunts()) {
+                            if (node.isPresent() && 
node.get().shouldUseOneInstance()) {
                                 expectedInstanceNum = 1;
                             }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to