From 8b617afe43387ca323cacae02895ff276676e233 Mon Sep 17 00:00:00 2001 From: lihangyu <15605149486@163.com> Date: Thu, 23 Mar 2023 17:45:34 +0800 Subject: [PATCH] [Improve](point query) improve column match performance when doing `computeColumnFilter` to prune partition (#17982) Only use key columns when `computeColumnFilter` otherwise for wide tables the match process could be very slow 500 columns table QPS: 6186 -> 13208 --- .../main/java/org/apache/doris/planner/OlapScanNode.java | 6 +++--- .../src/main/java/org/apache/doris/planner/ScanNode.java | 8 ++++++-- 2 files changed, 9 insertions(+), 5 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 d4d7ff4de0..d194e0dc4c 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 @@ -1027,12 +1027,12 @@ public class OlapScanNode extends ScanNode { return result; } - // Only called when Coordinator exec in point query + // Only called when Coordinator exec in high performance point query public List lazyEvaluateRangeLocations() throws UserException { // Lazy evaluation selectedIndexId = olapTable.getBaseIndexId(); - // TODO(lhy) this function is a heavy operation for point query - computeColumnFilter(); + // Only key columns + computeColumnFilter(olapTable.getBaseSchemaKeyColumns()); computePartitionInfo(); scanBackendIds.clear(); scanTabletIds.clear(); 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 888c8fdc3d..14cba2c3e0 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 @@ -140,8 +140,8 @@ public abstract class ScanNode extends PlanNode { } // TODO(ML): move it into PrunerOptimizer - public void computeColumnFilter() { - for (Column column : desc.getTable().getBaseSchema()) { + public void computeColumnFilter(List columns) { + for (Column column : columns) { SlotDescriptor slotDesc = desc.getColumnSlot(column.getName()); if (null == slotDesc) { continue; @@ -161,6 +161,10 @@ public abstract class ScanNode extends PlanNode { } } + public void computeColumnFilter() { + computeColumnFilter(desc.getTable().getBaseSchema()); + } + public static ColumnRange createColumnRange(SlotDescriptor desc, List conjuncts) { ColumnRange result = ColumnRange.create();