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

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


The following commit(s) were added to refs/heads/branch-2.0-var by this push:
     new 1c5857cec32 [Enhancement](planner) enbale read data opt on origin 
planner (#26093)
1c5857cec32 is described below

commit 1c5857cec32ad5637b8a104f3a34df1211a91c62
Author: airborne12 <[email protected]>
AuthorDate: Tue Oct 31 09:38:02 2023 +0800

    [Enhancement](planner) enbale read data opt on origin planner (#26093)
---
 .../org/apache/doris/planner/OlapScanNode.java     | 17 +++++
 .../org/apache/doris/planner/OriginalPlanner.java  | 75 +++++++++++++++++++---
 .../java/org/apache/doris/qe/SessionVariable.java  |  6 ++
 3 files changed, 88 insertions(+), 10 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 98490369f03..6c8d35e0588 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
@@ -98,6 +98,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -1207,6 +1208,22 @@ public class OlapScanNode extends ScanNode {
             output.append(getRuntimeFilterExplainString(false));
         }
 
+        if (!outputColumnUniqueIds.isEmpty()) {
+            output.append(prefix).append("scan columns required by project: ");
+            Iterator<Integer> iterator = outputColumnUniqueIds.iterator();
+            while (iterator.hasNext()) {
+                Integer uniqId = iterator.next();
+                for (SlotDescriptor slotDesc : desc.getSlots()) {
+                    if (slotDesc.getColumn() != null && 
slotDesc.getColumn().getUniqueId() == uniqId) {
+                        output.append(slotDesc.getColumn().getName());
+                        if (iterator.hasNext()) {
+                            output.append(", ");
+                        }
+                    }
+                }
+            }
+            output.append("\n");
+        }
         output.append(prefix).append(String.format("partitions=%s/%s, 
tablets=%s/%s", selectedPartitionNum,
                 olapTable.getPartitions().size(), selectedTabletsNum, 
totalTabletsNum));
         // We print up to 3 tablet, and we print "..." if the number is more 
than 3
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/planner/OriginalPlanner.java 
b/fe/fe-core/src/main/java/org/apache/doris/planner/OriginalPlanner.java
index f77aba25dac..ddfbb876a16 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/OriginalPlanner.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/OriginalPlanner.java
@@ -475,6 +475,19 @@ public class OriginalPlanner extends Planner {
         }
     }
 
+    private void processExpr(Expr expr, Set<Integer> outputColumnUniqueIds) {
+        if (expr instanceof SlotRef) {
+            SlotRef slotRef = (SlotRef) expr;
+            if (slotRef.getColumn() != null) {
+                outputColumnUniqueIds.add(slotRef.getColumn().getUniqueId());
+            }
+        }
+        ArrayList<Expr> children = expr.getChildren();
+        for (Expr child : children) {
+            processExpr(child, outputColumnUniqueIds);  // Recursive call for 
each child
+        }
+    }
+
     /**
      * outputColumnUniqueIds contain columns in OrderByExprs and outputExprs,
      * push output column unique id set to olap scan.
@@ -491,19 +504,61 @@ public class OriginalPlanner extends Planner {
     // this opt will only work with nereidsPlanner
     private void pushOutColumnUniqueIdsToOlapScan(PlanFragment rootFragment, 
Analyzer analyzer) {
         Set<Integer> outputColumnUniqueIds = new HashSet<>();
-        // add '-1' to avoid the optimization incorrect work with 
OriginalPlanner,
-        // because in the storage layer will skip this optimization if 
outputColumnUniqueIds contains '-1',
-        // to ensure the optimization only correct work with nereidsPlanner
-        outputColumnUniqueIds.add(-1);
+        if 
(ConnectContext.get().getSessionVariable().enableIndexDataReadOptOnOrigPlanner) 
{
+            ArrayList<Expr> outputExprs = rootFragment.getOutputExprs();
+            for (Expr expr : outputExprs) {
+                processExpr(expr, outputColumnUniqueIds);
+            }
+            for (PlanFragment fragment : fragments) {
+                PlanNode node = fragment.getPlanRoot();
+                PlanNode parent = null;
+                while (node.getChildren().size() != 0) {
+                    for (PlanNode childNode : node.getChildren()) {
+                        List<SlotId> outputSlotIds = 
childNode.getOutputSlotIds();
+                        if (outputSlotIds != null) {
+                            for (SlotId sid : outputSlotIds) {
+                                SlotDescriptor slotDesc = 
analyzer.getSlotDesc(sid);
+                                
outputColumnUniqueIds.add(slotDesc.getUniqueId());
+                            }
+                        }
+                    }
+                    // OlapScanNode is the last node.
+                    // So, just get the two node and check if they are 
SortNode and OlapScan.
+                    parent = node;
+                    node = node.getChildren().get(0);
+                }
 
-        for (PlanFragment fragment : fragments) {
-            PlanNode node = fragment.getPlanRoot();
-            if (!(node instanceof OlapScanNode)) {
-                continue;
+                if (parent instanceof SortNode) {
+                    SortNode sortNode = (SortNode) parent;
+                    List<Expr> orderingExprs = 
sortNode.getSortInfo().getOrigOrderingExprs();
+                    if (orderingExprs != null) {
+                        for (Expr expr : orderingExprs) {
+                            processExpr(expr, outputColumnUniqueIds);
+                        }
+                    }
+                }
+                if (!(node instanceof OlapScanNode)) {
+                    continue;
+                }
+
+                OlapScanNode scanNode = (OlapScanNode) node;
+                scanNode.setOutputColumnUniqueIds(outputColumnUniqueIds);
             }
+        } else {
+            // add '-1' to avoid the optimization incorrect work with 
OriginalPlanner,
+            // because in the storage layer will skip this optimization if 
outputColumnUniqueIds contains '-1',
+            // to ensure the optimization only correct work with nereidsPlanner
+            outputColumnUniqueIds.add(-1);
+
+            for (PlanFragment fragment : fragments) {
+                PlanNode node = fragment.getPlanRoot();
+                if (!(node instanceof OlapScanNode)) {
+                    continue;
+                }
 
-            OlapScanNode scanNode = (OlapScanNode) node;
-            scanNode.setOutputColumnUniqueIds(outputColumnUniqueIds);
+                OlapScanNode scanNode = (OlapScanNode) node;
+                scanNode.setOutputColumnUniqueIds(outputColumnUniqueIds);
+            }
         }
     }
 
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 794d379117d..e0e118e308c 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
@@ -396,6 +396,9 @@ public class SessionVariable implements Serializable, 
Writable {
 
     public static final String INVERTED_INDEX_CONJUNCTION_OPT_THRESHOLD = 
"inverted_index_conjunction_opt_threshold";
 
+    public static final String 
ENABLE_INDEX_DATA_READ_OPTIMIZED_ON_ORIGINAL_PLANNER
+            = "enable_index_data_read_opt_on_orig_planner";
+
     public static final List<String> DEBUG_VARIABLES = ImmutableList.of(
             SKIP_DELETE_PREDICATE,
             SKIP_DELETE_BITMAP,
@@ -1128,6 +1131,9 @@ public class SessionVariable implements Serializable, 
Writable {
                     + " use a skiplist to optimize the intersection."})
     public int invertedIndexConjunctionOptThreshold = 1000;
 
+    @VariableMgr.VarAttr(name = 
ENABLE_INDEX_DATA_READ_OPTIMIZED_ON_ORIGINAL_PLANNER, needForward = true)
+    public boolean enableIndexDataReadOptOnOrigPlanner = false;
+
     @VariableMgr.VarAttr(name = ENABLE_UNIQUE_KEY_PARTIAL_UPDATE, needForward 
= true)
     public boolean enableUniqueKeyPartialUpdate = false;
 


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

Reply via email to