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

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


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

commit 481517ac6aa1506fbe0d4357854461860f760db2
Author: Mingyu Chen <[email protected]>
AuthorDate: Fri Feb 23 21:07:06 2024 +0800

    [fix](plan) only scan node with limit and no predicate can reduce to 1 
instance (#31342)
    
    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 54cec43ea4f..10e311d8d14 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
@@ -1378,6 +1378,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 858abeb489a..be804e87972 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
@@ -735,7 +735,7 @@ public abstract class ScanNode extends PlanNode {
         return Integer.MAX_VALUE;
     }
 
-    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 fc9665d5a0b..458202ced40 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
@@ -2067,9 +2067,9 @@ public class Coordinator implements CoordInterface {
                         if (node.isPresent() && 
(!node.get().shouldDisableSharedScan(context)
                                 || ignoreStorageDataDistribution)) {
                             expectedInstanceNum = 
Math.max(expectedInstanceNum, 1);
-                            // 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.get().haveLimitAndConjunts()) {
+                            if (node.get().shouldUseOneInstance()) {
                                 expectedInstanceNum = 1;
                             }
 
@@ -2080,9 +2080,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.get().haveLimitAndConjunts()) {
+                            if (node.get().shouldUseOneInstance()) {
                                 expectedInstanceNum = 1;
                             }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to