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/doris.git


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

commit 735440eaaee904a817d14aae25bf8b9fb1c1a25d
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 ce124ae2e15..02fb26363a2 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
@@ -1409,6 +1409,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 799c687ea0f..5c24670fee1 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
@@ -2070,9 +2070,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;
                             }
 
@@ -2083,9 +2083,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