From 0d77fc484747ea26822abc868e7a11c15994efbb Mon Sep 17 00:00:00 2001 From: xzj7019 <131111794+xzj7019@users.noreply.github.com> Date: Thu, 29 Feb 2024 23:52:19 +0800 Subject: [PATCH] [nereids] explode function stats configurable (#31332) --------- Co-authored-by: zhongjian.xzj --- .../doris/nereids/stats/StatsCalculator.java | 3 +- .../org/apache/doris/qe/SessionVariable.java | 33 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java index ad16d3e8f5..08d4a3e781 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/StatsCalculator.java @@ -957,7 +957,8 @@ public class StatsCalculator extends DefaultPlanVisitor { private Statistics computeGenerate(Generate generate) { Statistics stats = groupExpression.childStatistics(0); - double count = stats.getRowCount() * generate.getGeneratorOutput().size() * 5; + int statsFactor = ConnectContext.get().getSessionVariable().generateStatsFactor; + double count = stats.getRowCount() * generate.getGeneratorOutput().size() * statsFactor; Map columnStatsMap = Maps.newHashMap(); for (Map.Entry entry : stats.columnStatistics().entrySet()) { ColumnStatistic columnStatistic = new ColumnStatisticBuilder(entry.getValue()).setCount(count).build(); 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 3a6f120d50..fe9d47fefd 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 @@ -479,6 +479,8 @@ public class SessionVariable implements Serializable, Writable { public static final String HUGE_TABLE_DEFAULT_SAMPLE_ROWS = "huge_table_default_sample_rows"; public static final String HUGE_TABLE_LOWER_BOUND_SIZE_IN_BYTES = "huge_table_lower_bound_size_in_bytes"; + public static final String GENERATE_STATS_FACTOR = "generate_stats_factor"; + public static final String HUGE_TABLE_AUTO_ANALYZE_INTERVAL_IN_MILLIS = "huge_table_auto_analyze_interval_in_millis"; @@ -740,6 +742,13 @@ public class SessionVariable implements Serializable, Writable { @VariableMgr.VarAttr(name = ENABLE_BUCKET_SHUFFLE_DOWNGRADE, needForward = true) public boolean enableBucketShuffleDownGrade = false; + /** + * explode function row count enlarge factor. + */ + @VariableMgr.VarAttr(name = GENERATE_STATS_FACTOR, checker = "checkGenerateStatsFactor", + setter = "setGenerateStatsFactor") + public int generateStatsFactor = 5; + @VariableMgr.VarAttr(name = PREFER_JOIN_METHOD) public String preferJoinMethod = "broadcast"; @@ -3324,6 +3333,30 @@ public class SessionVariable implements Serializable, Writable { } } + public void checkGenerateStatsFactor(String generateStatsFactor) { + int value = Integer.valueOf(generateStatsFactor); + if (value <= 0) { + UnsupportedOperationException exception = + new UnsupportedOperationException("Generate stats factor " + value + " should greater than 0"); + LOG.warn("Check generate stats factor failed", exception); + throw exception; + } + } + + public void setGenerateStatsFactor(int factor) { + this.generateStatsFactor = factor; + if (factor <= 0) { + LOG.warn("Invalid generate stats factor: {}", factor, new RuntimeException("")); + } + } + + public void setGenerateStatsFactor(String factor) { + this.generateStatsFactor = Integer.valueOf(factor); + if (generateStatsFactor <= 0) { + LOG.warn("Invalid generate stats factor: {}", generateStatsFactor, new RuntimeException("")); + } + } + public boolean getEnableDescribeExtendVariantColumn() { return enableDescribeExtendVariantColumn; }