diff --git a/fe/fe-core/src/main/java/com/starrocks/qe/feedback/analyzer/StreamingAggTuningAnalyzer.java b/fe/fe-core/src/main/java/com/starrocks/qe/feedback/analyzer/StreamingAggTuningAnalyzer.java index 4da7c86e4d92d9..8f9724a51b8d6c 100644 --- a/fe/fe-core/src/main/java/com/starrocks/qe/feedback/analyzer/StreamingAggTuningAnalyzer.java +++ b/fe/fe-core/src/main/java/com/starrocks/qe/feedback/analyzer/StreamingAggTuningAnalyzer.java @@ -81,7 +81,7 @@ public Void visitPhysicalHashAggregate(OptExpression optExpression, Void context BlockingAggNode blockingAggNode = findBlockingAggNode(skeletonNode); if (blockingAggNode != null) { double blockingOutputRows = blockingAggNode.getNodeExecStats().getPullRows(); - if (blockingOutputRows < inputRows && (inputRows / streamingOutputRows) < STREAMING_AGGREGATION_THRESHOLD + if (blockingOutputRows < inputRows && (inputRows / streamingOutputRows) > STREAMING_AGGREGATION_THRESHOLD && (inputRows / blockingOutputRows) > AGGREGATION_THRESHOLD) { tuningGuides.addTuningGuide(skeletonNode.getNodeId(), new StreamingAggTuningGuide((StreamingAggNode) skeletonNode)); diff --git a/test/sql/test_feedback/R/test_agg_feedback b/test/sql/test_feedback/R/test_agg_feedback new file mode 100644 index 00000000000000..227aee23e0fe28 --- /dev/null +++ b/test/sql/test_feedback/R/test_agg_feedback @@ -0,0 +1,143 @@ +-- name: test_agg_feedback +CREATE TABLE `pre_agg_case` ( + `c0` int(11) NULL COMMENT "", + `c1` char(50) NULL COMMENT "", + `c2` int(11) NULL COMMENT "", + `c3` int(11) NULL COMMENT "" +) ENGINE=OLAP +DUPLICATE KEY(`c0`) +COMMENT "OLAP" +DISTRIBUTED BY HASH(`c0`) BUCKETS 5 +PROPERTIES ( +"compression" = "LZ4", +"fast_schema_evolution" = "true", +"replicated_storage" = "true", +"replication_num" = "1" +); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +-- result: +-- !result +analyze full table pre_agg_case with sync mode; +-- result: +[REGEX].*pre_agg_case analyze status OK +-- !result +set enable_plan_advisor=true; +-- result: +-- !result +set enable_plan_analyzer=true; +-- result: +-- !result +set enable_global_runtime_filter = false; +-- result: +-- !result +function: assert_explain_not_contains("select count(*) from pre_agg_case group by c3", "StreamingAggTuningGuide") +-- result: +None +-- !result +add into plan advisor select count(*) from pre_agg_case group by c3; +-- result: +[REGEX]Add query into plan advisor in FE +-- !result +function: assert_explain_contains("select count(*) from pre_agg_case group by c3", "StreamingAggTuningGuide") +-- result: +None +-- !result +clear plan advisor; +-- result: +[REGEX]Clear all plan advisor in FE +-- !result diff --git a/test/sql/test_feedback/R/test_feedback b/test/sql/test_feedback/R/test_join_feedback similarity index 89% rename from test/sql/test_feedback/R/test_feedback rename to test/sql/test_feedback/R/test_join_feedback index 000076919959b1..198895a7163c5c 100644 --- a/test/sql/test_feedback/R/test_feedback +++ b/test/sql/test_feedback/R/test_join_feedback @@ -1,4 +1,4 @@ --- name: test_feedback +-- name: test_join_feedback CREATE TABLE `c1_skew` ( `c0` int(11) NULL COMMENT "", `c1` char(50) NULL COMMENT "", @@ -53,10 +53,6 @@ function: assert_explain_contains("select count(*) from (select * from c1_skew t -- result: None -- !result -function: assert_trace_values_contains("select count(*) from (select * from c1_skew t1 join (select * from c1_skew where c1 = 'f') t2 on t1.c2 = t2.c2) t", "RightChildEstimationErrorTuningGuide") --- result: -None --- !result clear plan advisor; -- result: [REGEX]Clear all plan advisor in FE.* diff --git a/test/sql/test_feedback/T/test_agg_feedback b/test/sql/test_feedback/T/test_agg_feedback new file mode 100644 index 00000000000000..6d852a5a7a3dc1 --- /dev/null +++ b/test/sql/test_feedback/T/test_agg_feedback @@ -0,0 +1,58 @@ +-- name: test_agg_feedback +CREATE TABLE `pre_agg_case` ( + `c0` int(11) NULL COMMENT "", + `c1` char(50) NULL COMMENT "", + `c2` int(11) NULL COMMENT "", + `c3` int(11) NULL COMMENT "" +) ENGINE=OLAP +DUPLICATE KEY(`c0`) +COMMENT "OLAP" +DISTRIBUTED BY HASH(`c0`) BUCKETS 5 +PROPERTIES ( +"compression" = "LZ4", +"fast_schema_evolution" = "true", +"replicated_storage" = "true", +"replication_num" = "1" +); + +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); +insert into pre_agg_case select generate_series, generate_series, generate_series, generate_series from TABLE(generate_series(1, 50)); + +analyze full table pre_agg_case with sync mode; +set enable_plan_advisor=true; +set enable_plan_analyzer=true; +set enable_global_runtime_filter = false; +function: assert_explain_not_contains("select count(*) from pre_agg_case group by c3", "StreamingAggTuningGuide") +add into plan advisor select count(*) from pre_agg_case group by c3; +function: assert_explain_contains("select count(*) from pre_agg_case group by c3", "StreamingAggTuningGuide") +clear plan advisor; diff --git a/test/sql/test_feedback/T/test_feedback b/test/sql/test_feedback/T/test_join_feedback similarity index 88% rename from test/sql/test_feedback/T/test_feedback rename to test/sql/test_feedback/T/test_join_feedback index 56bf9722554951..920d82729ea142 100644 --- a/test/sql/test_feedback/T/test_feedback +++ b/test/sql/test_feedback/T/test_join_feedback @@ -1,4 +1,4 @@ --- name: test_feedback +-- name: test_join_feedback CREATE TABLE `c1_skew` ( `c0` int(11) NULL COMMENT "", `c1` char(50) NULL COMMENT "", @@ -26,6 +26,4 @@ set enable_global_runtime_filter = false; function: assert_explain_not_contains("select count(*) from (select * from c1_skew t1 join (select * from c1_skew where c1 = 'f') t2 on t1.c2 = t2.c2) t", "RightChildEstimationErrorTuningGuide") add into plan advisor select count(*) from (select * from c1_skew t1 join (select * from c1_skew where c1 = 'f') t2 on t1.c2 = t2.c2) t; function: assert_explain_contains("select count(*) from (select * from c1_skew t1 join (select * from c1_skew where c1 = 'f') t2 on t1.c2 = t2.c2) t", "RightChildEstimationErrorTuningGuide") -function: assert_trace_values_contains("select count(*) from (select * from c1_skew t1 join (select * from c1_skew where c1 = 'f') t2 on t1.c2 = t2.c2) t", "RightChildEstimationErrorTuningGuide") - clear plan advisor;