[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.
This commit is contained in:
Mingyu Chen
2024-02-23 21:07:06 +08:00
committed by yiguolei
parent 49842eecc5
commit 481517ac6a
3 changed files with 8 additions and 6 deletions

View File

@ -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) {

View File

@ -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();
}
}

View File

@ -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;
}