*************** Case 1 *************** SQL: select /*+topk(20 6)*/ avg(c1), avg(c2), avg(c3) from t1_topk where c2 <10 group by c2 limit 5; ============================================================== |ID|OPERATOR |NAME |EST. ROWS|COST| -------------------------------------------------------------- |0 |LIMIT | |5 |228 | |1 | PX COORDINATOR | |5 |228 | |2 | EXCHANGE OUT DISTR |:EX10001|5 |224 | |3 | LIMIT | |5 |215 | |4 | MERGE GROUP BY | |5 |214 | |5 | EXCHANGE IN MERGE SORT DISTR| |4 |214 | |6 | EXCHANGE OUT DISTR (HASH) |:EX10000|4 |212 | |7 | MERGE GROUP BY | |4 |208 | |8 | SORT | |3 |208 | |9 | PX PARTITION ITERATOR | |90 |158 | |10| TABLE SCAN |t1_topk |90 |158 | ============================================================== Outputs & filters: ------------------------------------- 0 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))]), filter(nil), limit(5), offset(nil) 1 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil) 2 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), dop=1 3 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), limit(5), offset(nil) 4 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]) 5 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil), sort_keys([t1_topk.c2, ASC]) 6 - (#keys=1, [t1_topk.c2]), output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil), dop=1 7 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]) 8 - output([t1_topk.c2], [t1_topk.c1], [t1_topk.c3]), filter(nil), sort_keys([t1_topk.c2, ASC]) 9 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), force partition granule. 10 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter([t1_topk.c2 < ?]), access([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), partitions(p[0-1]), is_index_back=false, filter_before_indexback[false], range_key([t1_topk.c1]), range(MIN ; MAX)always true Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA <<<<<<< HEAD GBY_PUSHDOWN(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= USE_HASH_AGGREGATION(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:90, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] Parameters: ------------------------------------- {obj:{"BIGINT":10}, accuracy:{length:2, precision:2, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}} *************** Case 1(end) ************** *************** Case 2 *************** SQL: select /*+topk(20 6)*/ avg(c1), avg(c2), avg(c3) from t1_topk where c2 <10 group by c2 order by avg(c1); ============================================================= |ID|OPERATOR |NAME |EST. ROWS|COST| ------------------------------------------------------------- |0 |PX COORDINATOR MERGE SORT | |70 |572 | |1 | EXCHANGE OUT DISTR |:EX10001|70 |516 | |2 | SORT | |70 |390 | |3 | MERGE GROUP BY | |70 |355 | |4 | EXCHANGE IN MERGE SORT DISTR| |70 |341 | |5 | EXCHANGE OUT DISTR (HASH) |:EX10000|70 |304 | |6 | MERGE GROUP BY | |70 |223 | |7 | SORT | |90 |208 | |8 | PX PARTITION ITERATOR | |90 |158 | |9 | TABLE SCAN |t1_topk |90 |158 | ============================================================= Outputs & filters: ------------------------------------- <<<<<<< HEAD 0 - output([INTERNAL_FUNCTION(T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0)), T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0)), T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1)))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0)), ASC]) 1 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [INTERNAL_FUNCTION(T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0)), T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0)), T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1)))]), filter(nil), dop=1 2 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0)), ASC]) 3 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]) 4 - output([T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil), sort_keys([t1_topk.c2, ASC]) 5 - (#keys=1, [t1_topk.c2]), output([T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil), dop=1 6 - output([T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]) 7 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), sort_keys([t1_topk.c2, ASC]) 8 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), ======= 0 - output([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c2)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))]), filter(nil), sort_keys([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1), ASC]) 1 - output([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c2)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))]), filter(nil), dop=1 2 - output([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c2)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))]), filter(nil), sort_keys([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1), ASC]) 3 - output([T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [T_FUN_COUNT(t1_topk.c3)]) 4 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil) 5 - (#keys=1, [t1_topk.c2]), output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), dop=1 6 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), >>>>>>> 4ace446e738... fix aggr convert lost origin type force partition granule. 9 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter([t1_topk.c2 < ?]), access([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), partitions(p[0-1]), is_index_back=false, filter_before_indexback[false], range_key([t1_topk.c1]), range(MIN ; MAX)always true Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA <<<<<<< HEAD GBY_PUSHDOWN(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= USE_HASH_AGGREGATION(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:90, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] Parameters: ------------------------------------- {obj:{"BIGINT":10}, accuracy:{length:2, precision:2, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}} *************** Case 2(end) ************** *************** Case 3 *************** SQL: select /*+topk(20 6)*/ avg(c1), avg(c2), avg(c3) from t1_topk where c2 <10 order by avg(c1) limit 5; ======================================================= |ID|OPERATOR |NAME |EST. ROWS|COST| ------------------------------------------------------- |0 |LIMIT | |1 |171 | |1 | SCALAR GROUP BY | |1 |171 | |2 | PX COORDINATOR | |1 |171 | |3 | EXCHANGE OUT DISTR |:EX10000|1 |170 | |4 | MERGE GROUP BY | |1 |169 | |5 | PX PARTITION ITERATOR| |90 |158 | |6 | TABLE SCAN |t1_topk |90 |158 | ======================================================= Outputs & filters: ------------------------------------- <<<<<<< HEAD 0 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))]), filter(nil), limit(5), offset(nil) 1 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), group(nil), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]) 2 - output([T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil) 3 - output([T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil), dop=1 4 - output([T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil), group(nil), agg_func([T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]) ======= 0 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [cast(T_FUN_SUM(T_FUN_SUM(t1_topk.c3)) / T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3)), DOUBLE(-1, -1))]), filter(nil), limit(5), offset(nil) 1 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c3))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))]), filter(nil), group(nil), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c3))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))]) 2 - output([T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [T_FUN_COUNT(t1_topk.c3)]), filter(nil) 3 - output([T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [T_FUN_COUNT(t1_topk.c3)]), filter(nil), dop=1 4 - output([T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [T_FUN_COUNT(t1_topk.c3)]), filter(nil), group(nil), agg_func([T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [T_FUN_COUNT(t1_topk.c3)]) >>>>>>> 4ace446e738... fix aggr convert lost origin type 5 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), force partition granule. 6 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter([t1_topk.c2 < ?]), access([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), partitions(p[0-1]), is_index_back=false, filter_before_indexback[false], range_key([t1_topk.c1]), range(MIN ; MAX)always true Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA <<<<<<< HEAD GBY_PUSHDOWN(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= NO_USE_HASH_AGGREGATION(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:90, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] Parameters: ------------------------------------- {obj:{"BIGINT":10}, accuracy:{length:2, precision:2, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}} *************** Case 3(end) ************** *************** Case 4 *************** SQL: select /*+topk(20 6)*/ avg(c1), avg(c2), avg(c3) from t1_topk where c2 <10 group by c2 order by avg(c1) limit 5 for update nowait; ============================================================== |ID|OPERATOR |NAME |EST. ROWS|COST| -------------------------------------------------------------- |0 |LIMIT | |5 |374 | |1 | PX COORDINATOR MERGE SORT | |5 |374 | |2 | EXCHANGE OUT DISTR |:EX10001|5 |370 | |3 | TOP-N SORT | |5 |361 | |4 | MERGE GROUP BY | |70 |355 | |5 | EXCHANGE IN MERGE SORT DISTR| |70 |341 | |6 | EXCHANGE OUT DISTR (HASH) |:EX10000|70 |304 | |7 | MERGE GROUP BY | |70 |223 | |8 | SORT | |90 |208 | |9 | PX PARTITION ITERATOR | |90 |158 | |10| TABLE SCAN |t1_topk |90 |158 | ============================================================== Outputs & filters: ------------------------------------- <<<<<<< HEAD 0 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))]), filter(nil), limit(5), offset(nil) 1 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0)), ASC]) 2 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), dop=1 3 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0)), ASC]), topn(5) 4 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]) 5 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil), sort_keys([t1_topk.c2, ASC]) 6 - (#keys=1, [t1_topk.c2]), output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil), dop=1 7 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]) 8 - output([t1_topk.c2], [t1_topk.c1], [t1_topk.c3]), filter(nil), sort_keys([t1_topk.c2, ASC]) ======= 0 - output([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c2)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))]), filter(nil) 1 - output([T_FUN_SUM(t1_topk.c1)], [t1_topk.c1], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [t1_topk.c2], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [t1_topk.c3], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)]), filter(nil), limit(5), offset(nil) 2 - output([T_FUN_SUM(t1_topk.c1)], [t1_topk.c1], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [t1_topk.c2], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [t1_topk.c3], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)]), filter(nil), sort_keys([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1), ASC]) 3 - output([T_FUN_SUM(t1_topk.c1)], [t1_topk.c1], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [t1_topk.c2], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [t1_topk.c3], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)]), filter(nil), dop=1 4 - output([T_FUN_SUM(t1_topk.c1)], [t1_topk.c1], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [t1_topk.c2], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [t1_topk.c3], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)]), filter(nil), limit(5), offset(nil) 5 - output([T_FUN_SUM(t1_topk.c1)], [t1_topk.c1], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [t1_topk.c2], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [t1_topk.c3], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)]), filter(nil), sort_keys([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1), ASC]), topn(5) 6 - output([T_FUN_SUM(t1_topk.c1)], [t1_topk.c1], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [t1_topk.c2], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [t1_topk.c3], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [T_FUN_COUNT(t1_topk.c3)]) 7 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil) 8 - (#keys=1, [t1_topk.c2]), output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), dop=1 >>>>>>> 4ace446e738... fix aggr convert lost origin type 9 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), force partition granule. 10 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter([t1_topk.c2 < ?]), access([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), partitions(p[0-1]), is_index_back=false, filter_before_indexback[false], range_key([t1_topk.c1]), range(MIN ; MAX)always true Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA <<<<<<< HEAD GBY_PUSHDOWN(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= USE_HASH_AGGREGATION(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:90, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] Parameters: ------------------------------------- {obj:{"BIGINT":10}, accuracy:{length:2, precision:2, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}} *************** Case 4(end) ************** *************** Case 5 *************** SQL: select avg(c1), avg(c2), avg(c3) from t1_topk where c2 <10 group by c2 order by avg(c1) limit 5; ============================================================== |ID|OPERATOR |NAME |EST. ROWS|COST| -------------------------------------------------------------- |0 |LIMIT | |5 |374 | |1 | PX COORDINATOR MERGE SORT | |5 |374 | |2 | EXCHANGE OUT DISTR |:EX10001|5 |370 | |3 | TOP-N SORT | |5 |361 | |4 | MERGE GROUP BY | |70 |355 | |5 | EXCHANGE IN MERGE SORT DISTR| |70 |341 | |6 | EXCHANGE OUT DISTR (HASH) |:EX10000|70 |304 | |7 | MERGE GROUP BY | |70 |223 | |8 | SORT | |90 |208 | |9 | PX PARTITION ITERATOR | |90 |158 | |10| TABLE SCAN |t1_topk |90 |158 | ============================================================== Outputs & filters: ------------------------------------- <<<<<<< HEAD 0 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))]), filter(nil), limit(5), offset(nil) 1 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0)), ASC]) 2 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), dop=1 3 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0)), ASC]), topn(5) 4 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]) 5 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil), sort_keys([t1_topk.c2, ASC]) 6 - (#keys=1, [t1_topk.c2]), output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil), dop=1 7 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]) 8 - output([t1_topk.c2], [t1_topk.c1], [t1_topk.c3]), filter(nil), sort_keys([t1_topk.c2, ASC]) 9 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), ======= 0 - output([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c2)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))]), filter(nil), limit(5), offset(nil) 1 - output([T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)]), filter(nil), sort_keys([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1), ASC]) 2 - output([T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)]), filter(nil), dop=1 3 - output([T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)]), filter(nil), limit(5), offset(nil) 4 - output([T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)]), filter(nil), sort_keys([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1), ASC]), topn(5) 5 - output([T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [T_FUN_COUNT(t1_topk.c3)]) 6 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil) 7 - (#keys=1, [t1_topk.c2]), output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), dop=1 8 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), >>>>>>> 4ace446e738... fix aggr convert lost origin type force partition granule. 10 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter([t1_topk.c2 < ?]), access([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), partitions(p[0-1]), is_index_back=false, filter_before_indexback[false], range_key([t1_topk.c1]), range(MIN ; MAX)always true Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA <<<<<<< HEAD GBY_PUSHDOWN(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= USE_HASH_AGGREGATION(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:90, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] Parameters: ------------------------------------- {obj:{"BIGINT":10}, accuracy:{length:2, precision:2, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}} *************** Case 5(end) ************** *************** Case 6 *************** SQL: select /*+topk(20 6)*/ sql_calc_found_rows avg(c2), avg(c3) from t1_topk where c2 <10 group by c2 order by avg(c1) limit 5; ============================================================== |ID|OPERATOR |NAME |EST. ROWS|COST| -------------------------------------------------------------- |0 |LIMIT | |5 |574 | |1 | PX COORDINATOR MERGE SORT | |70 |572 | |2 | EXCHANGE OUT DISTR |:EX10001|70 |516 | |3 | SORT | |70 |390 | |4 | MERGE GROUP BY | |70 |355 | |5 | EXCHANGE IN MERGE SORT DISTR| |70 |341 | |6 | EXCHANGE OUT DISTR (HASH) |:EX10000|70 |304 | |7 | MERGE GROUP BY | |70 |223 | |8 | SORT | |90 |208 | |9 | PX PARTITION ITERATOR | |90 |158 | |10| TABLE SCAN |t1_topk |90 |158 | ============================================================== Outputs & filters: ------------------------------------- <<<<<<< HEAD 0 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))]), filter(nil), limit(5), offset(nil) 1 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0)), ASC]) 2 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), dop=1 3 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0)), ASC]) 4 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]) 5 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)]), filter(nil), sort_keys([t1_topk.c2, ASC]) 6 - (#keys=1, [t1_topk.c2]), output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)]), filter(nil), dop=1 7 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)]) 8 - output([t1_topk.c2], [t1_topk.c3], [t1_topk.c1]), filter(nil), sort_keys([t1_topk.c2, ASC]) 9 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), ======= 0 - output([T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c2)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))]), filter(nil), limit(5), offset(nil) 1 - output([T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)]), filter(nil), sort_keys([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1), ASC]) 2 - output([T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)]), filter(nil), dop=1 3 - output([T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)]), filter(nil), sort_keys([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1), ASC]) 4 - output([T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)]) 5 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil) 6 - (#keys=1, [t1_topk.c2]), output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), dop=1 7 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), >>>>>>> 4ace446e738... fix aggr convert lost origin type force partition granule. 10 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter([t1_topk.c2 < ?]), access([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), partitions(p[0-1]), is_index_back=false, filter_before_indexback[false], range_key([t1_topk.c1]), range(MIN ; MAX)always true Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA <<<<<<< HEAD GBY_PUSHDOWN(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= USE_HASH_AGGREGATION(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:90, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] Parameters: ------------------------------------- {obj:{"BIGINT":10}, accuracy:{length:2, precision:2, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}} *************** Case 6(end) ************** *************** Case 7 *************** SQL: select /*+topk(20 6)*/ avg(c1), avg(c2), avg(c3) from t1_topk where c2 <10 group by c2 order by (select c1 from t1_topk where c2 = 1) limit 5; ============================================================== |ID|OPERATOR |NAME |EST. ROWS|COST| -------------------------------------------------------------- |0 |LIMIT | |5 |389 | |1 | SUBPLAN FILTER | |5 |389 | |2 | PX COORDINATOR | |5 |231 | |3 | EXCHANGE OUT DISTR |:EX10001|5 |227 | |4 | MERGE GROUP BY | |5 |218 | |5 | EXCHANGE IN MERGE SORT DISTR| |6 |217 | |6 | EXCHANGE OUT DISTR (HASH) |:EX10000|6 |215 | |7 | MERGE GROUP BY | |6 |209 | |8 | SORT | |6 |208 | |9 | PX PARTITION ITERATOR | |90 |158 | |10| TABLE SCAN |t1_topk |90 |158 | |11| PX COORDINATOR | |2 |158 | |12| EXCHANGE OUT DISTR |:EX20000|2 |158 | |13| PX PARTITION ITERATOR | |2 |158 | |14| TABLE SCAN |t1_topk |2 |158 | ============================================================== Outputs & filters: ------------------------------------- <<<<<<< HEAD 0 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))]), filter(nil), limit(5), offset(nil) 1 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), ======= 0 - output([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c2)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))]), filter(nil), limit(5), offset(nil) 1 - output([T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [T_FUN_COUNT(t1_topk.c3)]), filter(nil), >>>>>>> 4ace446e738... fix aggr convert lost origin type exec_params_(nil), onetime_exprs_([subquery(1)]), init_plan_idxs_(nil) 2 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil) 3 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), dop=1 4 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]) 5 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil), sort_keys([t1_topk.c2, ASC]) 6 - (#keys=1, [t1_topk.c2]), output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil), dop=1 7 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]) 8 - output([t1_topk.c2], [t1_topk.c1], [t1_topk.c3]), filter(nil), sort_keys([t1_topk.c2, ASC]) 9 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), force partition granule. 10 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter([t1_topk.c2 < ?]), access([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), partitions(p[0-1]), is_index_back=false, filter_before_indexback[false], range_key([t1_topk.c1]), range(MIN ; MAX)always true 11 - output([t1_topk.c1]), filter(nil) 12 - output([t1_topk.c1]), filter(nil), dop=1 13 - output([t1_topk.c1]), filter(nil), force partition granule. 14 - output([t1_topk.c1]), filter([t1_topk.c2 = 1]), access([t1_topk.c1], [t1_topk.c2]), partitions(p[0-1]), is_index_back=false, filter_before_indexback[false], range_key([t1_topk.c1]), range(MIN ; MAX)always true Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA <<<<<<< HEAD GBY_PUSHDOWN(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") FULL(@"SEL$2" "opt"."t1_topk"@"SEL$2") OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= USE_HASH_AGGREGATION(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") FULL(@"SEL$2" "opt"."t1_topk"@"SEL$2") >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:90, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:1, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] Parameters: ------------------------------------- {obj:{"BIGINT":10}, accuracy:{length:2, precision:2, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}} *************** Case 7(end) ************** *************** Case 8 *************** SQL: select /*+topk(20 6)*/ distinct avg(c1), avg(c2), avg(c3) from t1_topk where c2 <10 group by c2 order by avg(c1) limit 5; =================================================================== |ID|OPERATOR |NAME |EST. ROWS|COST| ------------------------------------------------------------------- |0 |LIMIT | |5 |418 | |1 | PX COORDINATOR MERGE SORT | |5 |418 | |2 | EXCHANGE OUT DISTR |:EX10002|5 |414 | |3 | LIMIT | |5 |405 | |4 | MERGE DISTINCT | |5 |405 | |5 | EXCHANGE IN MERGE SORT DISTR | |5 |404 | |6 | EXCHANGE OUT DISTR (HASH) |:EX10001|5 |400 | |7 | MERGE DISTINCT | |5 |391 | |8 | SORT | |5 |390 | |9 | MERGE GROUP BY | |70 |355 | |10| EXCHANGE IN MERGE SORT DISTR| |70 |341 | |11| EXCHANGE OUT DISTR (HASH) |:EX10000|70 |304 | |12| MERGE GROUP BY | |70 |223 | |13| SORT | |90 |208 | |14| PX PARTITION ITERATOR | |90 |158 | |15| TABLE SCAN |t1_topk |90 |158 | =================================================================== Outputs & filters: ------------------------------------- <<<<<<< HEAD 0 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))]), filter(nil), limit(5), offset(nil) 1 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0)), ASC]) 2 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))]), filter(nil), dop=1 3 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))]), filter(nil), limit(5), offset(nil) 4 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))]), filter(nil), distinct([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))]) 5 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0)), ASC], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0)), ASC], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1)), ASC]) 6 - (#keys=3, [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))]), output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))]), filter(nil), dop=1 7 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))]), filter(nil), distinct([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))]) 8 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0)), ASC], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0)), ASC], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1)), ASC]) 9 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]) 10 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil), sort_keys([t1_topk.c2, ASC]) 11 - (#keys=1, [t1_topk.c2]), output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil), dop=1 12 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]) 13 - output([t1_topk.c2], [t1_topk.c1], [t1_topk.c3]), filter(nil), sort_keys([t1_topk.c2, ASC]) 14 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), ======= 0 - output([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c2)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))]), filter(nil), limit(5), offset(nil) 1 - output([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c2)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))]), filter(nil), sort_keys([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1), ASC]) 2 - output([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c2)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))]), filter(nil), dop=1 3 - output([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c2)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))]), filter(nil), limit(5), offset(nil) 4 - output([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c2)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))]), filter(nil), distinct([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c2)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))]) 5 - output([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c2)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))]), filter(nil), sort_keys([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1), ASC], [T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c2), ASC], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1)), ASC]) 6 - output([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c2)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))]), filter(nil) 7 - (#keys=3, [T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c2)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))]), output([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c2)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))]), filter(nil), dop=1 8 - output([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c2)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [T_FUN_COUNT(t1_topk.c3)]) 9 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil) 10 - (#keys=1, [t1_topk.c2]), output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), dop=1 11 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), >>>>>>> 4ace446e738... fix aggr convert lost origin type force partition granule. 15 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter([t1_topk.c2 < ?]), access([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), partitions(p[0-1]), is_index_back=false, filter_before_indexback[false], range_key([t1_topk.c1]), range(MIN ; MAX)always true Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA <<<<<<< HEAD DISTINCT_PUSHDOWN(@"SEL$1") GBY_PUSHDOWN(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= USE_HASH_AGGREGATION(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:90, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] Parameters: ------------------------------------- {obj:{"BIGINT":10}, accuracy:{length:2, precision:2, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}} *************** Case 8(end) ************** *************** Case 9 *************** SQL: select /*+topk(20 6)*/ sum(c1), avg(c2), group_concat(c3, c1) from t1_topk where c2 <10 group by c2 order by avg(c1) limit 5; ============================================================= |ID|OPERATOR |NAME |EST. ROWS|COST| ------------------------------------------------------------- |0 |LIMIT | |5 |6434| |1 | PX COORDINATOR MERGE SORT | |5 |6434| |2 | EXCHANGE OUT DISTR |:EX10001|5 |4883| |3 | TOP-N SORT | |5 |1391| |4 | MERGE GROUP BY | |70 |291 | |5 | SORT | |90 |277 | |6 | EXCHANGE IN DISTR | |90 |227 | |7 | EXCHANGE OUT DISTR (HASH)|:EX10000|90 |205 | |8 | PX PARTITION ITERATOR | |90 |158 | |9 | TABLE SCAN |t1_topk |90 |158 | ============================================================= Outputs & filters: ------------------------------------- 0 - output([T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2) / cast(T_FUN_COUNT(t1_topk.c2), DECIMAL(20, 0))], [T_FUN_GROUP_CONCAT(t1_topk.c3, cast(t1_topk.c1, VARCHAR(65536)))]), filter(nil), limit(5), offset(nil) 1 - output([T_FUN_SUM(t1_topk.c1)], [T_FUN_GROUP_CONCAT(t1_topk.c3, cast(t1_topk.c1, VARCHAR(65536)))], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)]), filter(nil), sort_keys([T_FUN_SUM(t1_topk.c1) / cast(T_FUN_COUNT(t1_topk.c1), DECIMAL(20, 0)), ASC]) 2 - output([T_FUN_SUM(t1_topk.c1)], [T_FUN_GROUP_CONCAT(t1_topk.c3, cast(t1_topk.c1, VARCHAR(65536)))], [T_FUN_SUM(t1_topk.c1) / cast(T_FUN_COUNT(t1_topk.c1), DECIMAL(20, 0))], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)]), filter(nil), dop=1 3 - output([T_FUN_SUM(t1_topk.c1)], [T_FUN_GROUP_CONCAT(t1_topk.c3, cast(t1_topk.c1, VARCHAR(65536)))], [T_FUN_SUM(t1_topk.c1) / cast(T_FUN_COUNT(t1_topk.c1), DECIMAL(20, 0))], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)]), filter(nil), sort_keys([T_FUN_SUM(t1_topk.c1) / cast(T_FUN_COUNT(t1_topk.c1), DECIMAL(20, 0)), ASC]), topn(5) 4 - output([T_FUN_SUM(t1_topk.c1)], [T_FUN_GROUP_CONCAT(t1_topk.c3, cast(t1_topk.c1, VARCHAR(65536)))], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c1)], [T_FUN_GROUP_CONCAT(t1_topk.c3, cast(t1_topk.c1, VARCHAR(65536)))], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)]) 5 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), sort_keys([t1_topk.c2, ASC]) 6 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil) 7 - (#keys=1, [t1_topk.c2]), output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), dop=1 8 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), force partition granule. 9 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter([t1_topk.c2 < ?]), access([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), partitions(p[0-1]), is_index_back=false, filter_before_indexback[false], range_key([t1_topk.c1]), range(MIN ; MAX)always true Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA <<<<<<< HEAD FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= NO_USE_HASH_AGGREGATION(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:90, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] Parameters: ------------------------------------- {obj:{"BIGINT":10}, accuracy:{length:2, precision:2, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}} *************** Case 9(end) ************** *************** Case 10 *************** SQL: select /*+topk(20 6)*/ avg(c1), avg(c2), avg(c3) from (select * from t1_topk where c2 <10) as a group by a.c2 order by avg(a.c1) limit 5; ============================================================== |ID|OPERATOR |NAME |EST. ROWS|COST| -------------------------------------------------------------- |0 |LIMIT | |5 |374 | |1 | PX COORDINATOR MERGE SORT | |5 |374 | |2 | EXCHANGE OUT DISTR |:EX10001|5 |370 | |3 | TOP-N SORT | |5 |361 | |4 | MERGE GROUP BY | |70 |355 | |5 | EXCHANGE IN MERGE SORT DISTR| |70 |341 | |6 | EXCHANGE OUT DISTR (HASH) |:EX10000|70 |304 | |7 | MERGE GROUP BY | |70 |223 | |8 | SORT | |90 |208 | |9 | PX PARTITION ITERATOR | |90 |158 | |10| TABLE SCAN |t1_topk |90 |158 | ============================================================== Outputs & filters: ------------------------------------- <<<<<<< HEAD 0 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))]), filter(nil), limit(5), offset(nil) 1 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0)), ASC]) 2 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), dop=1 3 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0)), ASC]), topn(5) 4 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]) 5 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil), sort_keys([t1_topk.c2, ASC]) 6 - (#keys=1, [t1_topk.c2]), output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil), dop=1 7 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]) 8 - output([t1_topk.c2], [t1_topk.c1], [t1_topk.c3]), filter(nil), sort_keys([t1_topk.c2, ASC]) 9 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), ======= 0 - output([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c2)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))]), filter(nil), limit(5), offset(nil) 1 - output([T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)]), filter(nil), sort_keys([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1), ASC]) 2 - output([T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)]), filter(nil), dop=1 3 - output([T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)]), filter(nil), limit(5), offset(nil) 4 - output([T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)]), filter(nil), sort_keys([T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1), ASC]), topn(5) 5 - output([T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(t1_topk.c3)], [T_FUN_COUNT(t1_topk.c3)]) 6 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil) 7 - (#keys=1, [t1_topk.c2]), output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), dop=1 8 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), >>>>>>> 4ace446e738... fix aggr convert lost origin type force partition granule. 10 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter([t1_topk.c2 < ?]), access([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), partitions(p[0-1]), is_index_back=false, filter_before_indexback[false], range_key([t1_topk.c1]), range(MIN ; MAX)always true Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA <<<<<<< HEAD GBY_PUSHDOWN(@"SEL$CFEA49FE") FULL(@"SEL$CFEA49FE" "opt"."t1_topk"@"SEL$2") MERGE(@"SEL$2" > "SEL$1") OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= USE_HASH_AGGREGATION(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:90, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] Parameters: ------------------------------------- {obj:{"BIGINT":10}, accuracy:{length:2, precision:2, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}} *************** Case 10(end) ************** *************** Case 11 *************** SQL: select /*+topk(20 6)*/ distinct avg(t1_topk.c1), avg(t1_topk.c2), avg(t1_topk.c3) from t1_topk , t2_topk group by t1_topk.c2 order by avg(t1_topk.c1) limit 5; ================================================================= |ID|OPERATOR |NAME |EST. ROWS|COST | ----------------------------------------------------------------- |0 |LIMIT | |5 |10333| |1 | MERGE DISTINCT | |5 |10333| |2 | SORT | |5 |10332| |3 | HASH GROUP BY | |75 |10295| |4 | NESTED-LOOP JOIN CARTESIAN | |20000 |3350 | |5 | PX COORDINATOR | |100 |587 | |6 | EXCHANGE OUT DISTR |:EX10001|100 |553 | |7 | SUBPLAN SCAN |VIEW1 |100 |478 | |8 | HASH GROUP BY | |100 |477 | |9 | EXCHANGE IN DISTR | |100 |417 | |10| EXCHANGE OUT DISTR (HASH)|:EX10000|100 |364 | |11| HASH GROUP BY | |100 |247 | |12| PX PARTITION ITERATOR | |200 |155 | |13| TABLE SCAN |t1_topk |200 |155 | |14| MATERIAL | |200 |188 | |15| PX COORDINATOR | |200 |187 | |16| EXCHANGE OUT DISTR |:EX20000|200 |176 | |17| PX PARTITION ITERATOR | |200 |155 | |18| TABLE SCAN |t2_topk |200 |155 | ================================================================= Outputs & filters: ------------------------------------- <<<<<<< HEAD 0 - output([T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0))], [T_FUN_SUM(VIEW1.T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))]), filter(nil), limit(5), offset(nil) 1 - output([T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0))], [T_FUN_SUM(VIEW1.T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))]), filter(nil), distinct([T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0))], [T_FUN_SUM(VIEW1.T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))]) 2 - output([T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0))], [T_FUN_SUM(VIEW1.T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))]), filter(nil), sort_keys([T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0)), ASC], [T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0)), ASC], [T_FUN_SUM(VIEW1.T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1)), ASC]) 3 - output([T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(VIEW1.T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), group([VIEW1.t1_topk.c2]), agg_func([T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(VIEW1.T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]) 4 - output([VIEW1.T_FUN_SUM(t1_topk.c1)], [VIEW1.T_FUN_COUNT(t1_topk.c1)], [VIEW1.T_FUN_SUM(t1_topk.c2)], [VIEW1.T_FUN_COUNT(t1_topk.c2)], [VIEW1.T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [VIEW1.T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [VIEW1.t1_topk.c2]), filter(nil), ======= 0 - output([T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c1)) / T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c2)) / T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c2))], [cast(T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c3)) / T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c3)), DOUBLE(-1, -1))]), filter(nil), limit(5), offset(nil) 1 - output([T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c1)) / T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c2)) / T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c2))], [cast(T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c3)) / T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c3)), DOUBLE(-1, -1))]), filter(nil), distinct([T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c1)) / T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c2)) / T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c2))], [cast(T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c3)) / T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c3)), DOUBLE(-1, -1))]) 2 - output([T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c1)) / T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c2)) / T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c2))], [cast(T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c3)) / T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c3)), DOUBLE(-1, -1))]), filter(nil), sort_keys([T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c1)) / T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c1)), ASC], [T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c2)) / T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c2)), ASC], [cast(T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c3)) / T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c3)), DOUBLE(-1, -1)), ASC]) 3 - output([T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c1)) / T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c2)) / T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c2))], [cast(T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c3)) / T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c3)), DOUBLE(-1, -1))]), filter(nil), group([VIEW1.t1_topk.c2]), agg_func([T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(VIEW1.T_FUN_SUM(t1_topk.c3))], [T_FUN_COUNT_SUM(VIEW1.T_FUN_COUNT(t1_topk.c3))]) 4 - output([VIEW1.T_FUN_SUM(t1_topk.c1)], [VIEW1.T_FUN_COUNT(t1_topk.c1)], [VIEW1.T_FUN_SUM(t1_topk.c2)], [VIEW1.T_FUN_COUNT(t1_topk.c2)], [VIEW1.T_FUN_SUM(t1_topk.c3)], [VIEW1.T_FUN_COUNT(t1_topk.c3)], [VIEW1.t1_topk.c2]), filter(nil), sort_keys([VIEW1.t1_topk.c2, ASC]) 5 - output([VIEW1.T_FUN_SUM(t1_topk.c1)], [VIEW1.T_FUN_COUNT(t1_topk.c1)], [VIEW1.T_FUN_SUM(t1_topk.c2)], [VIEW1.T_FUN_COUNT(t1_topk.c2)], [VIEW1.T_FUN_SUM(t1_topk.c3)], [VIEW1.T_FUN_COUNT(t1_topk.c3)], [VIEW1.t1_topk.c2]), filter(nil), >>>>>>> 4ace446e738... fix aggr convert lost origin type conds(nil), nl_params_(nil), batch_join=false 5 - output([VIEW1.T_FUN_SUM(t1_topk.c1)], [VIEW1.T_FUN_COUNT(t1_topk.c1)], [VIEW1.T_FUN_SUM(t1_topk.c2)], [VIEW1.T_FUN_COUNT(t1_topk.c2)], [VIEW1.T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [VIEW1.T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [VIEW1.t1_topk.c2]), filter(nil) 6 - output([VIEW1.T_FUN_SUM(t1_topk.c1)], [VIEW1.T_FUN_COUNT(t1_topk.c1)], [VIEW1.T_FUN_SUM(t1_topk.c2)], [VIEW1.T_FUN_COUNT(t1_topk.c2)], [VIEW1.T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [VIEW1.T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [VIEW1.t1_topk.c2]), filter(nil), dop=1 7 - output([VIEW1.t1_topk.c2], [VIEW1.T_FUN_SUM(t1_topk.c1)], [VIEW1.T_FUN_COUNT(t1_topk.c1)], [VIEW1.T_FUN_SUM(t1_topk.c2)], [VIEW1.T_FUN_COUNT(t1_topk.c2)], [VIEW1.T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [VIEW1.T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil), access([VIEW1.t1_topk.c2], [VIEW1.T_FUN_SUM(t1_topk.c1)], [VIEW1.T_FUN_COUNT(t1_topk.c1)], [VIEW1.T_FUN_SUM(t1_topk.c2)], [VIEW1.T_FUN_COUNT(t1_topk.c2)], [VIEW1.T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [VIEW1.T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]) 8 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]) 9 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil) 10 - (#keys=1, [t1_topk.c2]), output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil), dop=1 11 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]) 12 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), force partition granule. 13 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), access([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), partitions(p[0-1]), is_index_back=false, range_key([t1_topk.c1]), range(MIN ; MAX)always true 14 - output(nil), filter(nil) 15 - output(nil), filter(nil) 16 - output(nil), filter(nil), dop=1 17 - output(nil), filter(nil), force partition granule. 18 - output(nil), filter(nil), access([t2_topk.c1]), partitions(p[0-1]), is_index_back=false, range_key([t2_topk.c1]), range(MIN ; MAX)always true Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA <<<<<<< HEAD USE_HASH_AGGREGATION(@"SEL$94AA298F") LEADING(@"SEL$94AA298F" ("VIEW1"@"SEL$1" "opt"."t2_topk"@"SEL$1")) USE_NL(@"SEL$94AA298F" "opt"."t2_topk"@"SEL$1") PQ_DISTRIBUTE(@"SEL$94AA298F" "opt"."t2_topk"@"SEL$1" LOCAL LOCAL) USE_NL_MATERIALIZATION(@"SEL$94AA298F" "opt"."t2_topk"@"SEL$1") GBY_PUSHDOWN(@"SEL$94AA298D") USE_HASH_AGGREGATION(@"SEL$94AA298D") FULL(@"SEL$94AA298D" "opt"."t1_topk"@"SEL$1") FULL(@"SEL$94AA298F" "opt"."t2_topk"@"SEL$1") PLACE_GROUP_BY(@"SEL$1") OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= NO_USE_HASH_AGGREGATION(@"SEL$1") LEADING(@"SEL$1" ("VIEW1"@"SEL$1" "opt.t2_topk"@"SEL$1" )) USE_NL(@"SEL$1" ("opt.t2_topk"@"SEL$1" )) PQ_DISTRIBUTE(@"SEL$1" ("opt.t2_topk"@"SEL$1" ) LOCAL LOCAL) USE_NL_MATERIALIZATION(@"SEL$1" ("opt.t2_topk"@"SEL$1" )) NO_USE_HASH_AGGREGATION(@"SEL$2") FULL(@"SEL$2" "opt"."t1_topk"@"SEL$2") FULL(@"SEL$1" "opt"."t2_topk"@"SEL$1") >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:200, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] t2_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:200, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t2_topk] Parameters: ------------------------------------- *************** Case 11(end) ************** *************** Case 12 *************** SQL: select /*+topk(1 2) use_hash_aggregation*/ c3, avg(c1), sum(c2), sum(c1) + sum(c2), count(c3), min(c3), max(c1), sum(c2)/count(c1), sum(c3)/sum(c1) from t1_topk where c2 <10 group by c2 order by c3 limit 1; ============================================================ |ID|OPERATOR |NAME |EST. ROWS|COST| ------------------------------------------------------------ |0 |LIMIT | |1 |465 | |1 | PX COORDINATOR MERGE SORT | |1 |465 | |2 | EXCHANGE OUT DISTR |:EX10001|1 |464 | |3 | TOP-N SORT | |1 |462 | |4 | HASH GROUP BY | |70 |457 | |5 | EXCHANGE IN DISTR | |70 |413 | |6 | EXCHANGE OUT DISTR (HASH)|:EX10000|70 |365 | |7 | SORT | |70 |260 | |8 | HASH GROUP BY | |70 |206 | |9 | PX PARTITION ITERATOR | |90 |158 | |10| TABLE SCAN |t1_topk |90 |158 | ============================================================ Outputs & filters: ------------------------------------- 0 - output([t1_topk.c3], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_SUM(T_FUN_SUM(t1_topk.c1)), DOUBLE(-1, -1))]), filter(nil), limit(1), offset(nil) 1 - output([t1_topk.c3], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), sort_keys([t1_topk.c3, ASC]) 2 - output([t1_topk.c3], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), dop=1 3 - output([t1_topk.c3], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), sort_keys([t1_topk.c3, ASC]), topn(1) 4 - output([t1_topk.c3], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]) 5 - output([t1_topk.c3], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil) 6 - (#keys=1, [t1_topk.c2]), output([t1_topk.c3], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), dop=1 7 - output([t1_topk.c3], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), sort_keys([t1_topk.c3, ASC]), minimum_row_count:2 top_precision:1 , limit(1), offset(nil) 8 - output([t1_topk.c3], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))]) 9 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), force partition granule. 10 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter([t1_topk.c2 < ?]), access([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), partitions(p[0-1]), is_index_back=false, filter_before_indexback[false], range_key([t1_topk.c1]), range(MIN ; MAX)always true Used Hint: ------------------------------------- /*+ USE_HASH_AGGREGATION */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA GBY_PUSHDOWN(@"SEL$1") USE_HASH_AGGREGATION(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") <<<<<<< HEAD OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:90, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] Parameters: ------------------------------------- {obj:{"BIGINT":10}, accuracy:{length:2, precision:2, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}} *************** Case 12(end) ************** *************** Case 13 *************** SQL: select /*+topk(1 1)*/ c3, avg(c1), sum(c2), sum(c1) + sum(c2), count(c3), min(c3), max(c1), sum(c2)/count(c1), sum(c3)/sum(c1) from t1_topk where c2 <10 group by c2 order by c3 limit 1; ============================================================== |ID|OPERATOR |NAME |EST. ROWS|COST| -------------------------------------------------------------- |0 |LIMIT | |1 |398 | |1 | PX COORDINATOR MERGE SORT | |1 |398 | |2 | EXCHANGE OUT DISTR |:EX10001|1 |397 | |3 | TOP-N SORT | |1 |395 | |4 | MERGE GROUP BY | |70 |390 | |5 | EXCHANGE IN MERGE SORT DISTR| |1 |385 | |6 | EXCHANGE OUT DISTR (HASH) |:EX10000|1 |385 | |7 | TOPK | |70 |280 | |8 | SORT | |70 |278 | |9 | MERGE GROUP BY | |70 |224 | |10| SORT | |90 |208 | |11| PX PARTITION ITERATOR | |90 |158 | |12| TABLE SCAN |t1_topk |90 |158 | ============================================================== Outputs & filters: ------------------------------------- 0 - output([t1_topk.c3], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_SUM(T_FUN_SUM(t1_topk.c1)), DOUBLE(-1, -1))]), filter(nil), limit(1), offset(nil) 1 - output([t1_topk.c3], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), sort_keys([t1_topk.c3, ASC]) 2 - output([t1_topk.c3], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), dop=1 3 - output([t1_topk.c3], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), sort_keys([t1_topk.c3, ASC]), topn(1) 4 - output([t1_topk.c3], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]) 5 - output([t1_topk.c3], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), sort_keys([t1_topk.c2, ASC]) 6 - (#keys=1, [t1_topk.c2]), output([t1_topk.c3], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), dop=1 7 - output([t1_topk.c3], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), minimum_row_count:1 top_precision:1 limit(1), offset(nil) 8 - output([t1_topk.c3], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), sort_keys([t1_topk.c3, ASC]) 9 - output([t1_topk.c3], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))]) 10 - output([t1_topk.c3], [t1_topk.c2], [t1_topk.c1]), filter(nil), sort_keys([t1_topk.c2, ASC]) 11 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), force partition granule. 12 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter([t1_topk.c2 < ?]), access([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), partitions(p[0-1]), is_index_back=false, filter_before_indexback[false], range_key([t1_topk.c1]), range(MIN ; MAX)always true Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA <<<<<<< HEAD FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= USE_HASH_AGGREGATION(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:90, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] Parameters: ------------------------------------- {obj:{"BIGINT":10}, accuracy:{length:2, precision:2, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}} *************** Case 13(end) ************** *************** Case 14 *************** SQL: select /*+topk(1 1)*/ c3, avg(c1), sum(c2), sum(c1) + sum(c2), count(c3), min(c3), max(c1), sum(c2)/count(c1), sum(c3)/sum(c1) from t1_topk where c2 <12 group by c2 order by c3 limit 1 offset 4; ============================================================== |ID|OPERATOR |NAME |EST. ROWS|COST| -------------------------------------------------------------- |0 |LIMIT | |1 |467 | |1 | PX COORDINATOR MERGE SORT | |5 |466 | |2 | EXCHANGE OUT DISTR |:EX10001|5 |461 | |3 | TOP-N SORT | |5 |448 | |4 | MERGE GROUP BY | |79 |432 | |5 | EXCHANGE IN MERGE SORT DISTR| |5 |426 | |6 | EXCHANGE OUT DISTR (HASH) |:EX10000|5 |423 | |7 | TOPK | |79 |304 | |8 | SORT | |79 |303 | |9 | MERGE GROUP BY | |79 |240 | |10| SORT | |108 |220 | |11| PX PARTITION ITERATOR | |108 |158 | |12| TABLE SCAN |t1_topk |108 |158 | ============================================================== Outputs & filters: ------------------------------------- 0 - output([t1_topk.c3], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_SUM(T_FUN_SUM(t1_topk.c1)), DOUBLE(-1, -1))]), filter(nil), limit(1), offset(?) 1 - output([t1_topk.c3], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), sort_keys([t1_topk.c3, ASC]) 2 - output([t1_topk.c3], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), dop=1 3 - output([t1_topk.c3], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), sort_keys([t1_topk.c3, ASC]), topn(1 + ?) 4 - output([t1_topk.c3], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]) 5 - output([t1_topk.c3], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), sort_keys([t1_topk.c2, ASC]) 6 - (#keys=1, [t1_topk.c2]), output([t1_topk.c3], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), dop=1 7 - output([t1_topk.c3], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), minimum_row_count:1 top_precision:1 limit(1), offset(?) 8 - output([t1_topk.c3], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), sort_keys([t1_topk.c3, ASC]) 9 - output([t1_topk.c3], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))]) 10 - output([t1_topk.c3], [t1_topk.c2], [t1_topk.c1]), filter(nil), sort_keys([t1_topk.c2, ASC]) 11 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), force partition granule. 12 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter([t1_topk.c2 < ?]), access([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), partitions(p[0-1]), is_index_back=false, filter_before_indexback[false], range_key([t1_topk.c1]), range(MIN ; MAX)always true Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA <<<<<<< HEAD FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= USE_HASH_AGGREGATION(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:108, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] Parameters: ------------------------------------- {obj:{"BIGINT":12}, accuracy:{length:2, precision:2, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}}, {obj:{"BIGINT":4}, accuracy:{length:1, precision:1, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}} *************** Case 14(end) ************** *************** Case 15 *************** SQL: select /*+topk(1 1)*/ c3, avg(c1), sum(c2), sum(c1) + sum(c2), count(c3), min(c3), max(c1), sum(c2)/count(c1), sum(c3)/sum(c1) from t1_topk where c2 <12 group by c2 order by c3 limit 1 offset 1000; ============================================================== |ID|OPERATOR |NAME |EST. ROWS|COST| -------------------------------------------------------------- |0 |LIMIT | |0 |819 | |1 | PX COORDINATOR MERGE SORT | |79 |817 | |2 | EXCHANGE OUT DISTR |:EX10001|79 |729 | |3 | TOP-N SORT | |79 |533 | |4 | MERGE GROUP BY | |79 |495 | |5 | EXCHANGE IN MERGE SORT DISTR| |79 |476 | |6 | EXCHANGE OUT DISTR (HASH) |:EX10000|79 |423 | |7 | TOPK | |79 |304 | |8 | SORT | |79 |303 | |9 | MERGE GROUP BY | |79 |240 | |10| SORT | |108 |220 | |11| PX PARTITION ITERATOR | |108 |158 | |12| TABLE SCAN |t1_topk |108 |158 | ============================================================== Outputs & filters: ------------------------------------- 0 - output([t1_topk.c3], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_SUM(T_FUN_SUM(t1_topk.c1)), DOUBLE(-1, -1))]), filter(nil), limit(1), offset(?) 1 - output([t1_topk.c3], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), sort_keys([t1_topk.c3, ASC]) 2 - output([t1_topk.c3], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), dop=1 3 - output([t1_topk.c3], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), sort_keys([t1_topk.c3, ASC]), topn(1 + ?) 4 - output([t1_topk.c3], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]) 5 - output([t1_topk.c3], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), sort_keys([t1_topk.c2, ASC]) 6 - (#keys=1, [t1_topk.c2]), output([t1_topk.c3], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), dop=1 7 - output([t1_topk.c3], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), minimum_row_count:1 top_precision:1 limit(1), offset(?) 8 - output([t1_topk.c3], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), sort_keys([t1_topk.c3, ASC]) 9 - output([t1_topk.c3], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))]) 10 - output([t1_topk.c3], [t1_topk.c2], [t1_topk.c1]), filter(nil), sort_keys([t1_topk.c2, ASC]) 11 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), force partition granule. 12 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter([t1_topk.c2 < ?]), access([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), partitions(p[0-1]), is_index_back=false, filter_before_indexback[false], range_key([t1_topk.c1]), range(MIN ; MAX)always true Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA <<<<<<< HEAD FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= USE_HASH_AGGREGATION(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:108, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] Parameters: ------------------------------------- {obj:{"BIGINT":12}, accuracy:{length:2, precision:2, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}}, {obj:{"BIGINT":1000}, accuracy:{length:4, precision:4, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}} *************** Case 15(end) ************** *************** Case 16 *************** SQL: select /*+topk(1 1)*/ c3, avg(c1), sum(c2), sum(c1) + sum(c2), count(c3), min(c3), max(c1), sum(c2)/count(c1), sum(c3)/sum(c1) from t1_topk where c2 <10 group by c2 order by c3 limit 0; ============================================================== |ID|OPERATOR |NAME |EST. ROWS|COST| -------------------------------------------------------------- |0 |LIMIT | |0 |395 | |1 | PX COORDINATOR MERGE SORT | |0 |395 | |2 | EXCHANGE OUT DISTR |:EX10001|0 |395 | |3 | TOP-N SORT | |0 |395 | |4 | MERGE GROUP BY | |70 |390 | |5 | EXCHANGE IN MERGE SORT DISTR| |1 |385 | |6 | EXCHANGE OUT DISTR (HASH) |:EX10000|1 |385 | |7 | TOPK | |70 |280 | |8 | SORT | |70 |278 | |9 | MERGE GROUP BY | |70 |224 | |10| SORT | |90 |208 | |11| PX PARTITION ITERATOR | |90 |158 | |12| TABLE SCAN |t1_topk |90 |158 | ============================================================== Outputs & filters: ------------------------------------- 0 - output([t1_topk.c3], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_SUM(T_FUN_SUM(t1_topk.c1)), DOUBLE(-1, -1))]), filter(nil), limit(0), offset(nil) 1 - output([t1_topk.c3], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), sort_keys([t1_topk.c3, ASC]) 2 - output([t1_topk.c3], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), dop=1 3 - output([t1_topk.c3], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), sort_keys([t1_topk.c3, ASC]), topn(0) 4 - output([t1_topk.c3], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]) 5 - output([t1_topk.c3], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), sort_keys([t1_topk.c2, ASC]) 6 - (#keys=1, [t1_topk.c2]), output([t1_topk.c3], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), dop=1 7 - output([t1_topk.c3], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), minimum_row_count:1 top_precision:1 limit(0), offset(nil) 8 - output([t1_topk.c3], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), sort_keys([t1_topk.c3, ASC]) 9 - output([t1_topk.c3], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))]) 10 - output([t1_topk.c3], [t1_topk.c2], [t1_topk.c1]), filter(nil), sort_keys([t1_topk.c2, ASC]) 11 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), force partition granule. 12 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter([t1_topk.c2 < ?]), access([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), partitions(p[0-1]), is_index_back=false, filter_before_indexback[false], range_key([t1_topk.c1]), range(MIN ; MAX)always true Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA <<<<<<< HEAD FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= USE_HASH_AGGREGATION(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:90, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] Parameters: ------------------------------------- {obj:{"BIGINT":10}, accuracy:{length:2, precision:2, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}} *************** Case 16(end) ************** *************** Case 17 *************** SQL: select /*+topk(1 1)*/ c2, avg(c1), sum(c2), sum(c1) + sum(c2), count(c3), min(c3), max(c1), sum(c2)/count(c1), sum(c3)/sum(c1) from t1_topk where c2 <10 group by c2 order by avg(c3), sum(c1)/sum(c2) limit 5; ============================================================== |ID|OPERATOR |NAME |EST. ROWS|COST| -------------------------------------------------------------- |0 |LIMIT | |5 |417 | |1 | PX COORDINATOR MERGE SORT | |5 |417 | |2 | EXCHANGE OUT DISTR |:EX10001|5 |411 | |3 | TOP-N SORT | |5 |398 | |4 | MERGE GROUP BY | |70 |388 | |5 | EXCHANGE IN MERGE SORT DISTR| |5 |382 | |6 | EXCHANGE OUT DISTR (HASH) |:EX10000|5 |379 | |7 | TOPK | |70 |268 | |8 | SORT | |70 |267 | |9 | MERGE GROUP BY | |70 |226 | |10| SORT | |90 |208 | |11| PX PARTITION ITERATOR | |90 |158 | |12| TABLE SCAN |t1_topk |90 |158 | ============================================================== Outputs & filters: ------------------------------------- <<<<<<< HEAD 0 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_SUM(T_FUN_SUM(t1_topk.c1)), DOUBLE(-1, -1))]), filter(nil), limit(5), offset(nil) 1 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1)), ASC], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / T_FUN_SUM(T_FUN_SUM(t1_topk.c2)), ASC]) 2 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), dop=1 3 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1)), ASC], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / T_FUN_SUM(T_FUN_SUM(t1_topk.c2)), ASC]), topn(5) 4 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]) 5 - output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), sort_keys([t1_topk.c2, ASC]) 6 - (#keys=1, [t1_topk.c2]), output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), dop=1 7 - output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), minimum_row_count:1 top_precision:1 limit(5), offset(nil) 8 - output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), sort_keys([T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))) / cast(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))), DOUBLE(-1, -1)), ASC], [T_FUN_SUM(t1_topk.c1) / T_FUN_SUM(t1_topk.c2), ASC]) 9 - output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]) 10 - output([t1_topk.c2], [t1_topk.c3], [t1_topk.c1]), filter(nil), sort_keys([t1_topk.c2, ASC]) 11 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), ======= 0 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3) / T_FUN_SUM(t1_topk.c1)]), filter(nil), limit(5), offset(nil) 1 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) / T_FUN_SUM(t1_topk.c2)]), filter(nil), sort_keys([cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1)), ASC], [T_FUN_SUM(t1_topk.c1) / T_FUN_SUM(t1_topk.c2), ASC]) 2 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) / T_FUN_SUM(t1_topk.c2)]), filter(nil), dop=1 3 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) / T_FUN_SUM(t1_topk.c2)]), filter(nil), limit(5), offset(nil) 4 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) / T_FUN_SUM(t1_topk.c2)]), filter(nil), sort_keys([cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1)), ASC], [T_FUN_SUM(t1_topk.c1) / T_FUN_SUM(t1_topk.c2), ASC]), topn(5) 5 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) / T_FUN_SUM(t1_topk.c2)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)]) 6 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil) 7 - (#keys=1, [t1_topk.c2]), output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), dop=1 8 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), >>>>>>> 4ace446e738... fix aggr convert lost origin type force partition granule. 12 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter([t1_topk.c2 < ?]), access([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), partitions(p[0-1]), is_index_back=false, filter_before_indexback[false], range_key([t1_topk.c1]), range(MIN ; MAX)always true Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA <<<<<<< HEAD FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= USE_HASH_AGGREGATION(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:90, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] Parameters: ------------------------------------- {obj:{"BIGINT":10}, accuracy:{length:2, precision:2, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}} *************** Case 17(end) ************** *************** Case 18 *************** SQL: select /*+topk(1 1)*/ c1, avg(c1), sum(c2), sum(c1) + sum(c2), count(c3), min(c3), max(c1), sum(c2)/count(c1), sum(c3)/sum(c1) from t1_topk where c2 <10 group by c2 order by avg(c3) desc, sum(c1)/sum(c2) limit 5; ============================================================== |ID|OPERATOR |NAME |EST. ROWS|COST| -------------------------------------------------------------- |0 |LIMIT | |5 |417 | |1 | PX COORDINATOR MERGE SORT | |5 |417 | |2 | EXCHANGE OUT DISTR |:EX10001|5 |411 | |3 | TOP-N SORT | |5 |398 | |4 | MERGE GROUP BY | |70 |388 | |5 | EXCHANGE IN MERGE SORT DISTR| |5 |382 | |6 | EXCHANGE OUT DISTR (HASH) |:EX10000|5 |379 | |7 | TOPK | |70 |268 | |8 | SORT | |70 |267 | |9 | MERGE GROUP BY | |70 |226 | |10| SORT | |90 |208 | |11| PX PARTITION ITERATOR | |90 |158 | |12| TABLE SCAN |t1_topk |90 |158 | ============================================================== Outputs & filters: ------------------------------------- <<<<<<< HEAD 0 - output([t1_topk.c1], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_SUM(T_FUN_SUM(t1_topk.c1)), DOUBLE(-1, -1))]), filter(nil), limit(5), offset(nil) 1 - output([t1_topk.c1], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / T_FUN_SUM(T_FUN_SUM(t1_topk.c2)), ASC]) 2 - output([t1_topk.c1], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), dop=1 3 - output([t1_topk.c1], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / T_FUN_SUM(T_FUN_SUM(t1_topk.c2)), ASC]), topn(5) 4 - output([t1_topk.c1], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]) 5 - output([t1_topk.c1], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [t1_topk.c2], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), sort_keys([t1_topk.c2, ASC]) 6 - (#keys=1, [t1_topk.c2]), output([t1_topk.c1], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [t1_topk.c2], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), dop=1 7 - output([t1_topk.c1], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [t1_topk.c2], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), minimum_row_count:1 top_precision:1 limit(5), offset(nil) 8 - output([t1_topk.c1], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [t1_topk.c2], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), sort_keys([T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))) / cast(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(t1_topk.c1) / T_FUN_SUM(t1_topk.c2), ASC]) 9 - output([t1_topk.c1], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [t1_topk.c2], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]) 10 - output([t1_topk.c1], [t1_topk.c3], [t1_topk.c2]), filter(nil), sort_keys([t1_topk.c2, ASC]) 11 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), ======= 0 - output([t1_topk.c1], [T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3) / T_FUN_SUM(t1_topk.c1)]), filter(nil), limit(5), offset(nil) 1 - output([t1_topk.c1], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) / T_FUN_SUM(t1_topk.c2)]), filter(nil), sort_keys([cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(t1_topk.c1) / T_FUN_SUM(t1_topk.c2), ASC]) 2 - output([t1_topk.c1], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) / T_FUN_SUM(t1_topk.c2)]), filter(nil), dop=1 3 - output([t1_topk.c1], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) / T_FUN_SUM(t1_topk.c2)]), filter(nil), limit(5), offset(nil) 4 - output([t1_topk.c1], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) / T_FUN_SUM(t1_topk.c2)]), filter(nil), sort_keys([cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(t1_topk.c1) / T_FUN_SUM(t1_topk.c2), ASC]), topn(5) 5 - output([t1_topk.c1], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) / T_FUN_SUM(t1_topk.c2)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)]) 6 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil) 7 - (#keys=1, [t1_topk.c2]), output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), dop=1 8 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), >>>>>>> 4ace446e738... fix aggr convert lost origin type force partition granule. 12 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter([t1_topk.c2 < ?]), access([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), partitions(p[0-1]), is_index_back=false, filter_before_indexback[false], range_key([t1_topk.c1]), range(MIN ; MAX)always true Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA <<<<<<< HEAD FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= USE_HASH_AGGREGATION(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:90, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] Parameters: ------------------------------------- {obj:{"BIGINT":10}, accuracy:{length:2, precision:2, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}} *************** Case 18(end) ************** *************** Case 19 *************** SQL: select /*+topk(1 1)*/ c2, avg(c1), sum(c2), sum(c1) + sum(c2), count(c3), min(c3), max(c1), sum(c2)/count(c1), sum(c3)/sum(c1) from t1_topk where c2 <10 group by c2 order by avg(c3) desc, sum(c1)/sum(c2) + avg(c2) limit 5; ============================================================== |ID|OPERATOR |NAME |EST. ROWS|COST| -------------------------------------------------------------- |0 |LIMIT | |5 |427 | |1 | PX COORDINATOR MERGE SORT | |5 |427 | |2 | EXCHANGE OUT DISTR |:EX10001|5 |420 | |3 | TOP-N SORT | |5 |406 | |4 | MERGE GROUP BY | |70 |396 | |5 | EXCHANGE IN MERGE SORT DISTR| |5 |390 | |6 | EXCHANGE OUT DISTR (HASH) |:EX10000|5 |387 | |7 | TOPK | |70 |270 | |8 | SORT | |70 |268 | |9 | MERGE GROUP BY | |70 |228 | |10| SORT | |90 |208 | |11| PX PARTITION ITERATOR | |90 |158 | |12| TABLE SCAN |t1_topk |90 |158 | ============================================================== Outputs & filters: ------------------------------------- <<<<<<< HEAD 0 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_SUM(T_FUN_SUM(t1_topk.c1)), DOUBLE(-1, -1))]), filter(nil), limit(5), offset(nil) 1 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0)), ASC]) 2 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), dop=1 3 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2)), DECIMAL(20, 0)), ASC]), topn(5) 4 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c2))]) 5 - output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), sort_keys([t1_topk.c2, ASC]) 6 - (#keys=1, [t1_topk.c2]), output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), dop=1 7 - output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), minimum_row_count:1 top_precision:1 limit(5), offset(nil) 8 - output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), sort_keys([T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))) / cast(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(t1_topk.c1) / T_FUN_SUM(t1_topk.c2) + T_FUN_SUM(t1_topk.c2) / cast(T_FUN_COUNT(t1_topk.c2), DECIMAL(20, 0)), ASC]) 9 - output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c2)]) 10 - output([t1_topk.c2], [t1_topk.c3], [t1_topk.c1]), filter(nil), sort_keys([t1_topk.c2, ASC]) 11 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), ======= 0 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3) / T_FUN_SUM(t1_topk.c1)]), filter(nil), limit(5), offset(nil) 1 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) / T_FUN_SUM(t1_topk.c2) + T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c2)]), filter(nil), sort_keys([cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(t1_topk.c1) / T_FUN_SUM(t1_topk.c2) + T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c2), ASC]) 2 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) / T_FUN_SUM(t1_topk.c2) + T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c2)]), filter(nil), dop=1 3 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) / T_FUN_SUM(t1_topk.c2) + T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c2)]), filter(nil), limit(5), offset(nil) 4 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) / T_FUN_SUM(t1_topk.c2) + T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c2)]), filter(nil), sort_keys([cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(t1_topk.c1) / T_FUN_SUM(t1_topk.c2) + T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c2), ASC]), topn(5) 5 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) / T_FUN_SUM(t1_topk.c2) + T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c2)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [T_FUN_COUNT(t1_topk.c2)]) 6 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil) 7 - (#keys=1, [t1_topk.c2]), output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), dop=1 8 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), >>>>>>> 4ace446e738... fix aggr convert lost origin type force partition granule. 12 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter([t1_topk.c2 < ?]), access([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), partitions(p[0-1]), is_index_back=false, filter_before_indexback[false], range_key([t1_topk.c1]), range(MIN ; MAX)always true Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA <<<<<<< HEAD FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= USE_HASH_AGGREGATION(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:90, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] Parameters: ------------------------------------- {obj:{"BIGINT":10}, accuracy:{length:2, precision:2, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}} *************** Case 19(end) ************** *************** Case 20 *************** SQL: select /*+topk(0 0)*/ c2, sum(c2), sum(c1) + sum(c2), count(c3), min(c3), max(c1), sum(c2)/count(c1), sum(c3)/sum(c1) from t1_topk where c2 <12 group by c2 order by avg(c3) desc, sum(c1)+sum(c2) limit 5; ============================================================== |ID|OPERATOR |NAME |EST. ROWS|COST| -------------------------------------------------------------- |0 |LIMIT | |5 |474 | |1 | PX COORDINATOR MERGE SORT | |5 |474 | |2 | EXCHANGE OUT DISTR |:EX10001|5 |468 | |3 | TOP-N SORT | |5 |455 | |4 | MERGE GROUP BY | |79 |444 | |5 | EXCHANGE IN MERGE SORT DISTR| |79 |424 | |6 | EXCHANGE OUT DISTR (HASH) |:EX10000|79 |367 | |7 | MERGE GROUP BY | |79 |242 | |8 | SORT | |108 |220 | |9 | PX PARTITION ITERATOR | |108 |158 | |10| TABLE SCAN |t1_topk |108 |158 | ============================================================== Outputs & filters: ------------------------------------- <<<<<<< HEAD 0 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_SUM(T_FUN_SUM(t1_topk.c1)), DOUBLE(-1, -1))]), filter(nil), limit(5), offset(nil) 1 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2)), ASC]) 2 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), dop=1 3 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2)), ASC]), topn(5) 4 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]) 5 - output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), sort_keys([t1_topk.c2, ASC]) 6 - (#keys=1, [t1_topk.c2]), output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), dop=1 7 - output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]) 8 - output([t1_topk.c2], [t1_topk.c3], [t1_topk.c1]), filter(nil), sort_keys([t1_topk.c2, ASC]) 9 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), ======= 0 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3) / T_FUN_SUM(t1_topk.c1)]), filter(nil), limit(5), offset(nil) 1 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2)]), filter(nil), sort_keys([cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2), ASC]) 2 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2)]), filter(nil), dop=1 3 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2)]), filter(nil), limit(5), offset(nil) 4 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2)]), filter(nil), sort_keys([cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2), ASC]), topn(5) 5 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)]) 6 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil) 7 - (#keys=1, [t1_topk.c2]), output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), dop=1 8 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), >>>>>>> 4ace446e738... fix aggr convert lost origin type force partition granule. 10 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter([t1_topk.c2 < ?]), access([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), partitions(p[0-1]), is_index_back=false, filter_before_indexback[false], range_key([t1_topk.c1]), range(MIN ; MAX)always true Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA <<<<<<< HEAD GBY_PUSHDOWN(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= USE_HASH_AGGREGATION(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:108, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] Parameters: ------------------------------------- {obj:{"BIGINT":12}, accuracy:{length:2, precision:2, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}} *************** Case 20(end) ************** *************** Case 21 *************** SQL: select /*+topk(50 0)*/ c2, sum(c2), sum(c1) + sum(c2), count(c3), min(c3), max(c1), sum(c2)/count(c1), sum(c3)/sum(c1) from t1_topk where c2 <12 group by c2 order by avg(c3) desc, sum(c1)+sum(c2) limit 5; ============================================================== |ID|OPERATOR |NAME |EST. ROWS|COST| -------------------------------------------------------------- |0 |LIMIT | |5 |487 | |1 | PX COORDINATOR MERGE SORT | |5 |487 | |2 | EXCHANGE OUT DISTR |:EX10001|5 |481 | |3 | TOP-N SORT | |5 |467 | |4 | MERGE GROUP BY | |79 |457 | |5 | EXCHANGE IN MERGE SORT DISTR| |40 |444 | |6 | EXCHANGE OUT DISTR (HASH) |:EX10000|40 |416 | |7 | TOPK | |79 |290 | |8 | SORT | |79 |289 | |9 | MERGE GROUP BY | |79 |242 | |10| SORT | |108 |220 | |11| PX PARTITION ITERATOR | |108 |158 | |12| TABLE SCAN |t1_topk |108 |158 | ============================================================== Outputs & filters: ------------------------------------- <<<<<<< HEAD 0 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_SUM(T_FUN_SUM(t1_topk.c1)), DOUBLE(-1, -1))]), filter(nil), limit(5), offset(nil) 1 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2)), ASC]) 2 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), dop=1 3 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2)), ASC]), topn(5) 4 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]) 5 - output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), sort_keys([t1_topk.c2, ASC]) 6 - (#keys=1, [t1_topk.c2]), output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), dop=1 7 - output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), minimum_row_count:0 top_precision:50 limit(5), offset(nil) 8 - output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), sort_keys([T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))) / cast(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2), ASC]) 9 - output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]) 10 - output([t1_topk.c2], [t1_topk.c3], [t1_topk.c1]), filter(nil), sort_keys([t1_topk.c2, ASC]) 11 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), ======= 0 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3) / T_FUN_SUM(t1_topk.c1)]), filter(nil), limit(5), offset(nil) 1 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2)]), filter(nil), sort_keys([cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2), ASC]) 2 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2)]), filter(nil), dop=1 3 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2)]), filter(nil), limit(5), offset(nil) 4 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2)]), filter(nil), sort_keys([cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2), ASC]), topn(5) 5 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)]) 6 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil) 7 - (#keys=1, [t1_topk.c2]), output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), dop=1 8 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), >>>>>>> 4ace446e738... fix aggr convert lost origin type force partition granule. 12 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter([t1_topk.c2 < ?]), access([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), partitions(p[0-1]), is_index_back=false, filter_before_indexback[false], range_key([t1_topk.c1]), range(MIN ; MAX)always true Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA <<<<<<< HEAD FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= USE_HASH_AGGREGATION(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:108, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] Parameters: ------------------------------------- {obj:{"BIGINT":12}, accuracy:{length:2, precision:2, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}} *************** Case 21(end) ************** *************** Case 22 *************** SQL: select /*+topk(10000 1)*/ c2, sum(c2), sum(c1) + sum(c2), count(c3), min(c3), max(c1), sum(c2)/count(c1), sum(c3)/sum(c1) from t1_topk where c2 <12 group by c2 order by avg(c3) desc, sum(c1)+sum(c2) limit 5; ============================================================== |ID|OPERATOR |NAME |EST. ROWS|COST| -------------------------------------------------------------- |0 |LIMIT | |5 |522 | |1 | PX COORDINATOR MERGE SORT | |5 |522 | |2 | EXCHANGE OUT DISTR |:EX10001|5 |516 | |3 | TOP-N SORT | |5 |503 | |4 | MERGE GROUP BY | |79 |492 | |5 | EXCHANGE IN MERGE SORT DISTR| |79 |472 | |6 | EXCHANGE OUT DISTR (HASH) |:EX10000|79 |416 | |7 | TOPK | |79 |290 | |8 | SORT | |79 |289 | |9 | MERGE GROUP BY | |79 |242 | |10| SORT | |108 |220 | |11| PX PARTITION ITERATOR | |108 |158 | |12| TABLE SCAN |t1_topk |108 |158 | ============================================================== Outputs & filters: ------------------------------------- <<<<<<< HEAD 0 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_SUM(T_FUN_SUM(t1_topk.c1)), DOUBLE(-1, -1))]), filter(nil), limit(5), offset(nil) 1 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2)), ASC]) 2 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), dop=1 3 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2)), ASC]), topn(5) 4 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]) 5 - output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), sort_keys([t1_topk.c2, ASC]) 6 - (#keys=1, [t1_topk.c2]), output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), dop=1 7 - output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), minimum_row_count:1 top_precision:10000 limit(5), offset(nil) 8 - output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), sort_keys([T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))) / cast(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2), ASC]) 9 - output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]) 10 - output([t1_topk.c2], [t1_topk.c3], [t1_topk.c1]), filter(nil), sort_keys([t1_topk.c2, ASC]) 11 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), ======= 0 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3) / T_FUN_SUM(t1_topk.c1)]), filter(nil), limit(5), offset(nil) 1 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2)]), filter(nil), sort_keys([cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2), ASC]) 2 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2)]), filter(nil), dop=1 3 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2)]), filter(nil), limit(5), offset(nil) 4 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2)]), filter(nil), sort_keys([cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2), ASC]), topn(5) 5 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)]) 6 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil) 7 - (#keys=1, [t1_topk.c2]), output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), dop=1 8 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), >>>>>>> 4ace446e738... fix aggr convert lost origin type force partition granule. 12 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter([t1_topk.c2 < ?]), access([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), partitions(p[0-1]), is_index_back=false, filter_before_indexback[false], range_key([t1_topk.c1]), range(MIN ; MAX)always true Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA <<<<<<< HEAD FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= USE_HASH_AGGREGATION(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:108, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] Parameters: ------------------------------------- {obj:{"BIGINT":12}, accuracy:{length:2, precision:2, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}} *************** Case 22(end) ************** *************** Case 23 *************** SQL: select /*+topk(1 10000)*/ c2, sum(c2), sum(c1) + sum(c2), count(c3), min(c3), max(c1), sum(c2)/count(c1), sum(c3)/sum(c1) from t1_topk where c2 <12 group by c2 order by avg(c3) desc, sum(c1)+sum(c2) limit 5; ============================================================== |ID|OPERATOR |NAME |EST. ROWS|COST| -------------------------------------------------------------- |0 |LIMIT | |5 |522 | |1 | PX COORDINATOR MERGE SORT | |5 |522 | |2 | EXCHANGE OUT DISTR |:EX10001|5 |516 | |3 | TOP-N SORT | |5 |503 | |4 | MERGE GROUP BY | |79 |492 | |5 | EXCHANGE IN MERGE SORT DISTR| |79 |472 | |6 | EXCHANGE OUT DISTR (HASH) |:EX10000|79 |416 | |7 | TOPK | |79 |290 | |8 | SORT | |79 |289 | |9 | MERGE GROUP BY | |79 |242 | |10| SORT | |108 |220 | |11| PX PARTITION ITERATOR | |108 |158 | |12| TABLE SCAN |t1_topk |108 |158 | ============================================================== Outputs & filters: ------------------------------------- <<<<<<< HEAD 0 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_SUM(T_FUN_SUM(t1_topk.c1)), DOUBLE(-1, -1))]), filter(nil), limit(5), offset(nil) 1 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2)), ASC]) 2 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), dop=1 3 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2)), ASC]), topn(5) 4 - output([t1_topk.c2], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))], [T_FUN_COUNT_SUM(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))))]) 5 - output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), sort_keys([t1_topk.c2, ASC]) 6 - (#keys=1, [t1_topk.c2]), output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), dop=1 7 - output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), minimum_row_count:10000 top_precision:1 limit(5), offset(nil) 8 - output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), sort_keys([T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))) / cast(T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1))), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2), ASC]) 9 - output([t1_topk.c2], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_SUM(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(cast(t1_topk.c3, DOUBLE(-1, -1)))]) 10 - output([t1_topk.c2], [t1_topk.c3], [t1_topk.c1]), filter(nil), sort_keys([t1_topk.c2, ASC]) 11 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), ======= 0 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2) / T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3) / T_FUN_SUM(t1_topk.c1)]), filter(nil), limit(5), offset(nil) 1 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2)]), filter(nil), sort_keys([cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2), ASC]) 2 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2)]), filter(nil), dop=1 3 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2)]), filter(nil), limit(5), offset(nil) 4 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2)]), filter(nil), sort_keys([cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1)), DESC], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2), ASC]), topn(5) 5 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)], [cast(T_FUN_SUM(t1_topk.c3) / T_FUN_COUNT(t1_topk.c3), DOUBLE(-1, -1))], [T_FUN_SUM(t1_topk.c1) + T_FUN_SUM(t1_topk.c2)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c3)]) 6 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil) 7 - (#keys=1, [t1_topk.c2]), output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), dop=1 8 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter(nil), >>>>>>> 4ace446e738... fix aggr convert lost origin type force partition granule. 12 - output([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), filter([t1_topk.c2 < ?]), access([t1_topk.c1], [t1_topk.c2], [t1_topk.c3]), partitions(p[0-1]), is_index_back=false, filter_before_indexback[false], range_key([t1_topk.c1]), range(MIN ; MAX)always true Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA <<<<<<< HEAD FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= USE_HASH_AGGREGATION(@"SEL$1") FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:108, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] Parameters: ------------------------------------- {obj:{"BIGINT":12}, accuracy:{length:2, precision:2, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}} *************** Case 23(end) ************** *************** Case 24 *************** SQL: select * from (select /*+topk(0 4)*/ avg(c1) from t1_topk where c2 <10 group by c2 order by sum(c2) limit 5) as a; ============================================================== |ID|OPERATOR |NAME |EST. ROWS|COST| -------------------------------------------------------------- |0 |LIMIT | |5 |295 | |1 | PX COORDINATOR MERGE SORT | |5 |295 | |2 | EXCHANGE OUT DISTR |:EX10001|5 |293 | |3 | TOP-N SORT | |5 |289 | |4 | MERGE GROUP BY | |70 |285 | |5 | EXCHANGE IN MERGE SORT DISTR| |5 |283 | |6 | EXCHANGE OUT DISTR (HASH) |:EX10000|5 |282 | |7 | TOPK | |70 |248 | |8 | SORT | |70 |247 | |9 | MERGE GROUP BY | |70 |216 | |10| SORT | |90 |207 | |11| PX PARTITION ITERATOR | |90 |158 | |12| TABLE SCAN |t1_topk |90 |158 | ============================================================== Outputs & filters: ------------------------------------- 0 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))]), filter(nil), limit(5), offset(nil) 1 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(t1_topk.c2)), ASC]) 2 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), dop=1 3 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(t1_topk.c2)), ASC]), topn(5) 4 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]) 5 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)]), filter(nil), sort_keys([t1_topk.c2, ASC]) 6 - (#keys=1, [t1_topk.c2]), output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)]), filter(nil), dop=1 7 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)]), filter(nil), minimum_row_count:4 top_precision:0 limit(5), offset(nil) 8 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)]), filter(nil), sort_keys([T_FUN_SUM(t1_topk.c2), ASC]) 9 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)]) 10 - output([t1_topk.c2], [t1_topk.c1]), filter(nil), sort_keys([t1_topk.c2, ASC]) 11 - output([t1_topk.c1], [t1_topk.c2]), filter(nil), force partition granule. 12 - output([t1_topk.c1], [t1_topk.c2]), filter([t1_topk.c2 < ?]), access([t1_topk.c1], [t1_topk.c2]), partitions(p[0-1]), is_index_back=false, filter_before_indexback[false], range_key([t1_topk.c1]), range(MIN ; MAX)always true Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA <<<<<<< HEAD FULL(@"SEL$F53088DF" "opt"."t1_topk"@"SEL$2") MERGE(@"SEL$2" < "SEL$1") OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= USE_HASH_AGGREGATION(@"SEL$2") FULL(@"SEL$2" "opt"."t1_topk"@"SEL$2") >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:90, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] Parameters: ------------------------------------- {obj:{"BIGINT":10}, accuracy:{length:2, precision:2, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}} *************** Case 24(end) ************** *************** Case 25 *************** SQL: select c1 from t1_topk where c1 < any (select /*+topk(0 4)*/ avg(c1) from t1_topk where c2 <10 group by c2 order by sum(c2) limit 5); ================================================================= |ID|OPERATOR |NAME |EST. ROWS|COST| ----------------------------------------------------------------- |0 |NESTED-LOOP SEMI JOIN | |67 |565 | |1 | PX COORDINATOR | |200 |187 | |2 | EXCHANGE OUT DISTR |:EX10000|200 |176 | |3 | PX PARTITION ITERATOR | |200 |155 | |4 | TABLE SCAN |t1_topk |200 |155 | |5 | MATERIAL | |5 |295 | |6 | SUBPLAN SCAN |VIEW1 |5 |295 | |7 | LIMIT | |5 |295 | |8 | PX COORDINATOR MERGE SORT | |5 |295 | |9 | EXCHANGE OUT DISTR |:EX20001|5 |293 | |10| TOP-N SORT | |5 |289 | |11| MERGE GROUP BY | |70 |285 | |12| EXCHANGE IN MERGE SORT DISTR| |5 |283 | |13| EXCHANGE OUT DISTR (HASH) |:EX20000|5 |282 | |14| TOPK | |70 |248 | |15| SORT | |70 |247 | |16| MERGE GROUP BY | |70 |216 | |17| SORT | |90 |207 | |18| PX PARTITION ITERATOR | |90 |158 | |19| TABLE SCAN |t1_topk |90 |158 | ================================================================= Outputs & filters: ------------------------------------- 0 - output([t1_topk.c1]), filter(nil), conds([cast(t1_topk.c1, DECIMAL(11, 0)) < VIEW1.avg(c1)]), nl_params_(nil), batch_join=false 1 - output([t1_topk.c1]), filter(nil) 2 - output([t1_topk.c1]), filter(nil), dop=1 3 - output([t1_topk.c1]), filter(nil), force partition granule. 4 - output([t1_topk.c1]), filter(nil), access([t1_topk.c1]), partitions(p[0-1]), is_index_back=false, range_key([t1_topk.c1]), range(MIN ; MAX)always true 5 - output([VIEW1.avg(c1)]), filter(nil) 6 - output([VIEW1.avg(c1)]), filter(nil), access([VIEW1.avg(c1)]) 7 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))]), filter(nil), limit(5), offset(nil) 8 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(t1_topk.c2)), ASC]) 9 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), dop=1 10 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(t1_topk.c2)), ASC]), topn(5) 11 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]) 12 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)]), filter(nil), sort_keys([t1_topk.c2, ASC]) 13 - (#keys=1, [t1_topk.c2]), output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)]), filter(nil), dop=1 14 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)]), filter(nil), minimum_row_count:4 top_precision:0 limit(5), offset(nil) 15 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)]), filter(nil), sort_keys([T_FUN_SUM(t1_topk.c2), ASC]) 16 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)]) 17 - output([t1_topk.c2], [t1_topk.c1]), filter(nil), sort_keys([t1_topk.c2, ASC]) 18 - output([t1_topk.c1], [t1_topk.c2]), filter(nil), force partition granule. 19 - output([t1_topk.c1], [t1_topk.c2]), filter([t1_topk.c2 < ?]), access([t1_topk.c1], [t1_topk.c2]), partitions(p[0-1]), is_index_back=false, filter_before_indexback[false], range_key([t1_topk.c1]), range(MIN ; MAX)always true Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA <<<<<<< HEAD LEADING(@"SEL$6FCAE2AA" ("opt"."t1_topk"@"SEL$1" "VIEW1"@"SEL$1")) USE_NL(@"SEL$6FCAE2AA" "VIEW1"@"SEL$1") PQ_DISTRIBUTE(@"SEL$6FCAE2AA" "VIEW1"@"SEL$1" LOCAL LOCAL) USE_NL_MATERIALIZATION(@"SEL$6FCAE2AA" "VIEW1"@"SEL$1") FULL(@"SEL$6FCAE2AA" "opt"."t1_topk"@"SEL$1") FULL(@"SEL$2" "opt"."t1_topk"@"SEL$2") UNNEST(@"SEL$2") OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= LEADING(@"SEL$1" ("opt.t1_topk"@"SEL$1" "VIEW1"@"SEL$1" )) USE_NL(@"SEL$1" ("VIEW1"@"SEL$1" )) PQ_DISTRIBUTE(@"SEL$1" ("VIEW1"@"SEL$1" ) LOCAL LOCAL) USE_NL_MATERIALIZATION(@"SEL$1" ("VIEW1"@"SEL$1" )) FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") USE_HASH_AGGREGATION(@"SEL$2") FULL(@"SEL$2" "opt"."t1_topk"@"SEL$2") >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:200, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:90, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] Parameters: ------------------------------------- {obj:{"BIGINT":10}, accuracy:{length:2, precision:2, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}} *************** Case 25(end) ************** *************** Case 26 *************** SQL: select /*+topk(0 4), no_use_px*/ avg(c1) from t1_topk where c2 <10 group by c2 order by sum(c2) limit 5 union (select /*+topk(0 10)*/ sum(c1) from t1_topk where c2 <10 group by c2 order by sum(c2) limit 7); ================================================================== |ID|OPERATOR |NAME |EST. ROWS|COST| ------------------------------------------------------------------ |0 |TEMP TABLE TRANSFORMATION | |12 |381 | |1 | PX COORDINATOR | |70 |355 | |2 | EXCHANGE OUT DISTR |:EX10001 |70 |330 | |3 | TEMP TABLE INSERT |TEMP1 |70 |276 | |4 | MERGE GROUP BY | |70 |273 | |5 | EXCHANGE IN MERGE SORT DISTR| |70 |265 | |6 | EXCHANGE OUT DISTR (HASH) |:EX10000 |70 |250 | |7 | MERGE GROUP BY | |70 |216 | |8 | SORT | |90 |207 | |9 | PX PARTITION ITERATOR | |90 |158 | |10| TABLE SCAN |t1_topk |90 |158 | |11| HASH UNION DISTINCT | |12 |26 | |12| LIMIT | |5 |10 | |13| PX COORDINATOR MERGE SORT | |5 |10 | |14| EXCHANGE OUT DISTR |:EX20000 |5 |10 | |15| TOP-N SORT | |5 |8 | |16| TEMP TABLE ACCESS |VIEW1(TEMP1)|70 |4 | |17| LIMIT | |7 |11 | |18| PX COORDINATOR MERGE SORT | |7 |11 | |19| EXCHANGE OUT DISTR |:EX30000 |7 |10 | |20| TOP-N SORT | |7 |8 | |21| TEMP TABLE ACCESS |VIEW2(TEMP1)|70 |4 | ================================================================== Outputs & filters: ------------------------------------- 0 - output([UNION([1])]), filter(nil) 1 - output(nil), filter(nil) 2 - output(nil), filter(nil), dop=1 3 - output(nil), filter(nil) 4 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]) 5 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)]), filter(nil), sort_keys([t1_topk.c2, ASC]) 6 - (#keys=1, [t1_topk.c2]), output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)]), filter(nil), dop=1 7 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)]) 8 - output([t1_topk.c2], [t1_topk.c1]), filter(nil), sort_keys([t1_topk.c2, ASC]) 9 - output([t1_topk.c1], [t1_topk.c2]), filter(nil), force partition granule. 10 - output([t1_topk.c1], [t1_topk.c2]), filter([t1_topk.c2 < ?]), access([t1_topk.c1], [t1_topk.c2]), partitions(p[0-1]), is_index_back=false, filter_before_indexback[false], range_key([t1_topk.c1]), range(MIN ; MAX)always true 11 - output([UNION([1])]), filter(nil) 12 - output([VIEW1.T_FUN_SUM(t1_topk.c1) / cast(VIEW1.T_FUN_COUNT(t1_topk.c1), DECIMAL(20, 0))]), filter(nil), limit(5), offset(nil) 13 - output([VIEW1.T_FUN_SUM(t1_topk.c1)], [VIEW1.T_FUN_COUNT(t1_topk.c1)]), filter(nil), sort_keys([VIEW1.T_FUN_SUM(t1_topk.c2), ASC]) 14 - output([VIEW1.T_FUN_SUM(t1_topk.c2)], [VIEW1.T_FUN_SUM(t1_topk.c1)], [VIEW1.T_FUN_COUNT(t1_topk.c1)]), filter(nil), dop=1 15 - output([VIEW1.T_FUN_SUM(t1_topk.c2)], [VIEW1.T_FUN_SUM(t1_topk.c1)], [VIEW1.T_FUN_COUNT(t1_topk.c1)]), filter(nil), sort_keys([VIEW1.T_FUN_SUM(t1_topk.c2), ASC]), topn(5) 16 - output([VIEW1.T_FUN_SUM(t1_topk.c2)], [VIEW1.T_FUN_SUM(t1_topk.c1)], [VIEW1.T_FUN_COUNT(t1_topk.c1)]), filter(nil), access([VIEW1.T_FUN_SUM(t1_topk.c2)], [VIEW1.T_FUN_SUM(t1_topk.c1)], [VIEW1.T_FUN_COUNT(t1_topk.c1)]) 17 - output([VIEW2.T_FUN_SUM(t1_topk.c1)]), filter(nil), limit(7), offset(nil) 18 - output([VIEW2.T_FUN_SUM(t1_topk.c1)]), filter(nil), sort_keys([VIEW2.T_FUN_SUM(t1_topk.c2), ASC]) 19 - output([VIEW2.T_FUN_SUM(t1_topk.c1)], [VIEW2.T_FUN_SUM(t1_topk.c2)]), filter(nil), dop=1 20 - output([VIEW2.T_FUN_SUM(t1_topk.c1)], [VIEW2.T_FUN_SUM(t1_topk.c2)]), filter(nil), sort_keys([VIEW2.T_FUN_SUM(t1_topk.c2), ASC]), topn(7) 21 - output([VIEW2.T_FUN_SUM(t1_topk.c1)], [VIEW2.T_FUN_SUM(t1_topk.c2)]), filter(nil), access([VIEW2.T_FUN_SUM(t1_topk.c1)], [VIEW2.T_FUN_SUM(t1_topk.c2)]) Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA <<<<<<< HEAD GBY_PUSHDOWN(@"SEL$21FA2A17") FULL(@"SEL$21FA2A17" "opt"."t1_topk"@"SEL$1") USE_HASH_SET(@"SET$7AED123F") MATERIALIZE(@"SET$1" ("SEL$1", "SEL$2")) OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= USE_HASH_AGGREGATION(@"SEL$4") FULL(@"SEL$4" "opt"."t1_topk"@"SEL$4") >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:90, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] Parameters: ------------------------------------- {obj:{"BIGINT":10}, accuracy:{length:2, precision:2, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}}, {obj:{"BIGINT":10}, accuracy:{length:2, precision:2, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}} *************** Case 26(end) ************** *************** Case 27 *************** SQL: select c1 from t1_topk where (select /*+topk(0 10)*/ avg(c1) from t1_topk where c2 <10 group by c2 order by sum(c2) limit 1) > 1 ; =============================================================== |ID|OPERATOR |NAME |EST. ROWS|COST| --------------------------------------------------------------- |0 |SUBPLAN FILTER | |200 |480 | |1 | PX COORDINATOR | |200 |187 | |2 | EXCHANGE OUT DISTR |:EX10000|200 |176 | |3 | PX PARTITION ITERATOR | |200 |155 | |4 | TABLE SCAN |t1_topk |200 |155 | |5 | LIMIT | |1 |290 | |6 | PX COORDINATOR MERGE SORT | |1 |290 | |7 | EXCHANGE OUT DISTR |:EX20001|1 |290 | |8 | TOP-N SORT | |1 |289 | |9 | MERGE GROUP BY | |70 |286 | |10| EXCHANGE IN MERGE SORT DISTR| |10 |284 | |11| EXCHANGE OUT DISTR (HASH) |:EX20000|10 |282 | |12| TOPK | |70 |248 | |13| SORT | |70 |247 | |14| MERGE GROUP BY | |70 |216 | |15| SORT | |90 |207 | |16| PX PARTITION ITERATOR | |90 |158 | |17| TABLE SCAN |t1_topk |90 |158 | =============================================================== Outputs & filters: ------------------------------------- 0 - output([t1_topk.c1]), filter(nil), exec_params_(nil), onetime_exprs_([subquery(1) > ?]), init_plan_idxs_(nil) 1 - output([t1_topk.c1]), filter(nil) 2 - output([t1_topk.c1]), filter(nil), dop=1 3 - output([t1_topk.c1]), filter(nil), force partition granule. 4 - output([t1_topk.c1]), filter(nil), startup_filter([?]), access([t1_topk.c1]), partitions(p[0-1]), is_index_back=false, range_key([t1_topk.c1]), range(MIN ; MAX)always true 5 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))]), filter(nil), limit(1), offset(nil) 6 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(t1_topk.c2)), ASC]) 7 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), dop=1 8 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), sort_keys([T_FUN_SUM(T_FUN_SUM(t1_topk.c2)), ASC]), topn(1) 9 - output([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))]) 10 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)]), filter(nil), sort_keys([t1_topk.c2, ASC]) 11 - (#keys=1, [t1_topk.c2]), output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)]), filter(nil), dop=1 12 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)]), filter(nil), minimum_row_count:10 top_precision:0 limit(1), offset(nil) 13 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)]), filter(nil), sort_keys([T_FUN_SUM(t1_topk.c2), ASC]) 14 - output([t1_topk.c2], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(t1_topk.c2)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)]) 15 - output([t1_topk.c2], [t1_topk.c1]), filter(nil), sort_keys([t1_topk.c2, ASC]) 16 - output([t1_topk.c1], [t1_topk.c2]), filter(nil), force partition granule. 17 - output([t1_topk.c1], [t1_topk.c2]), filter([t1_topk.c2 < ?]), access([t1_topk.c1], [t1_topk.c2]), partitions(p[0-1]), is_index_back=false, filter_before_indexback[false], range_key([t1_topk.c1]), range(MIN ; MAX)always true Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA FULL(@"SEL$1" "opt"."t1_topk"@"SEL$1") <<<<<<< HEAD FULL(@"SEL$2" "opt"."t1_topk"@"SEL$2") OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= USE_HASH_AGGREGATION(@"SEL$2") FULL(@"SEL$2" "opt"."t1_topk"@"SEL$2") >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:200, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:90, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] Parameters: ------------------------------------- {obj:{"BIGINT":10}, accuracy:{length:2, precision:2, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}}, {obj:{"BIGINT":1}, accuracy:{length:1, precision:1, scale:0}, flag:1, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"BIGINT", collation:"binary", coercibility:"NUMERIC"}}, {obj:{"DECIMAL":"1"}, accuracy:{length:-1, precision:-1, scale:-1}, flag:0, raw_text_pos:-1, raw_text_len:-1, param_meta:{type:"DECIMAL", collation:"binary", coercibility:"NUMERIC"}} *************** Case 27(end) ************** *************** Case 28 *************** SQL: select * from (select /*+topk(10 5)*/ c3, c1, avg(c1), sum(c2), sum(c1) + sum(c2), count(c3), min(c3), max(c1), sum(c2)/count(c1), sum(c3)/sum(c1) from t1_topk group by c2 order by c3 limit 7) as a left join t2_topk on a.c1 = t2_topk.c1 left join t3_topk on t3_topk.c1 = a.c1; ======================================================================= |ID|OPERATOR |NAME |EST. ROWS|COST| ----------------------------------------------------------------------- |0 |PX COORDINATOR | |7 |780 | |1 | EXCHANGE OUT DISTR |:EX10004|7 |772 | |2 | NESTED-LOOP OUTER JOIN | |7 |753 | |3 | EXCHANGE IN DISTR | |7 |706 | |4 | EXCHANGE OUT DISTR (PKEY) |:EX10003|7 |700 | |5 | NESTED-LOOP OUTER JOIN | |7 |684 | |6 | EXCHANGE IN DISTR | |7 |637 | |7 | EXCHANGE OUT DISTR (PKEY) |:EX10002|7 |632 | |8 | SUBPLAN SCAN |a |7 |621 | |9 | LIMIT | |7 |620 | |10| EXCHANGE IN MERGE SORT DISTR | |7 |620 | |11| EXCHANGE OUT DISTR |:EX10001|7 |613 | |12| TOP-N SORT | |7 |595 | |13| MERGE GROUP BY | |100 |571 | |14| EXCHANGE IN MERGE SORT DISTR| |10 |563 | |15| EXCHANGE OUT DISTR (HASH) |:EX10000|10 |557 | |16| TOPK | |100 |406 | |17| SORT | |100 |404 | |18| MERGE GROUP BY | |100 |321 | |19| SORT | |200 |285 | |20| PX PARTITION ITERATOR | |200 |155 | |21| TABLE SCAN |t1_topk |200 |155 | |22| PX PARTITION ITERATOR | |1 |12 | |23| TABLE GET |t2_topk |1 |12 | |24| PX PARTITION ITERATOR | |1 |12 | |25| TABLE GET |t3_topk |1 |12 | ======================================================================= Outputs & filters: ------------------------------------- 0 - output([INTERNAL_FUNCTION(a.c3, a.c1, a.avg(c1), a.sum(c2), a.sum(c1) + sum(c2), a.count(c3), a.min(c3), a.max(c1), a.sum(c2)/count(c1), a.sum(c3)/sum(c1), t2_topk.c1, t2_topk.c2, t2_topk.c3, t3_topk.c1, t3_topk.c2, t3_topk.c3)]), filter(nil) 1 - output([INTERNAL_FUNCTION(a.c3, a.c1, a.avg(c1), a.sum(c2), a.sum(c1) + sum(c2), a.count(c3), a.min(c3), a.max(c1), a.sum(c2)/count(c1), a.sum(c3)/sum(c1), t2_topk.c1, t2_topk.c2, t2_topk.c3, t3_topk.c1, t3_topk.c2, t3_topk.c3)]), filter(nil), dop=1 2 - output([a.c1], [a.c3], [a.avg(c1)], [a.sum(c2)], [a.sum(c1) + sum(c2)], [a.count(c3)], [a.min(c3)], [a.max(c1)], [a.sum(c2)/count(c1)], [a.sum(c3)/sum(c1)], [t2_topk.c1], [t2_topk.c2], [t2_topk.c3], [t3_topk.c1], [t3_topk.c2], [t3_topk.c3]), filter(nil), conds(nil), nl_params_([a.c1]), batch_join=false 3 - output([a.c1], [PARTITION_ID], [a.c3], [a.avg(c1)], [a.sum(c2)], [a.sum(c1) + sum(c2)], [a.count(c3)], [a.min(c3)], [a.max(c1)], [a.sum(c2)/count(c1)], [a.sum(c3)/sum(c1)], [t2_topk.c1], [t2_topk.c2], [t2_topk.c3]), filter(nil) 4 - (#keys=1, [a.c1]), output([a.c1], [PARTITION_ID], [a.c3], [a.avg(c1)], [a.sum(c2)], [a.sum(c1) + sum(c2)], [a.count(c3)], [a.min(c3)], [a.max(c1)], [a.sum(c2)/count(c1)], [a.sum(c3)/sum(c1)], [t2_topk.c1], [t2_topk.c2], [t2_topk.c3]), filter(nil), dop=1 5 - output([a.c1], [a.c3], [a.avg(c1)], [a.sum(c2)], [a.sum(c1) + sum(c2)], [a.count(c3)], [a.min(c3)], [a.max(c1)], [a.sum(c2)/count(c1)], [a.sum(c3)/sum(c1)], [t2_topk.c1], [t2_topk.c2], [t2_topk.c3]), filter(nil), conds(nil), nl_params_([a.c1]), batch_join=false 6 - output([a.c1], [PARTITION_ID], [a.c3], [a.avg(c1)], [a.sum(c2)], [a.sum(c1) + sum(c2)], [a.count(c3)], [a.min(c3)], [a.max(c1)], [a.sum(c2)/count(c1)], [a.sum(c3)/sum(c1)]), filter(nil) 7 - (#keys=1, [a.c1]), output([a.c1], [PARTITION_ID], [a.c3], [a.avg(c1)], [a.sum(c2)], [a.sum(c1) + sum(c2)], [a.count(c3)], [a.min(c3)], [a.max(c1)], [a.sum(c2)/count(c1)], [a.sum(c3)/sum(c1)]), filter(nil), is_single, dop=1 8 - output([a.c1], [a.c3], [a.avg(c1)], [a.sum(c2)], [a.sum(c1) + sum(c2)], [a.count(c3)], [a.min(c3)], [a.max(c1)], [a.sum(c2)/count(c1)], [a.sum(c3)/sum(c1)]), filter(nil), access([a.c1], [a.c3], [a.avg(c1)], [a.sum(c2)], [a.sum(c1) + sum(c2)], [a.count(c3)], [a.min(c3)], [a.max(c1)], [a.sum(c2)/count(c1)], [a.sum(c3)/sum(c1)]) 9 - output([t1_topk.c3], [t1_topk.c1], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1)) + T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2)) / cast(T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1)), DECIMAL(20, 0))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))) / cast(T_FUN_SUM(T_FUN_SUM(t1_topk.c1)), DOUBLE(-1, -1))]), filter(nil), limit(7), offset(nil) 10 - output([t1_topk.c3], [t1_topk.c1], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), sort_keys([t1_topk.c3, ASC]) 11 - output([t1_topk.c3], [t1_topk.c1], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), dop=1 12 - output([t1_topk.c3], [t1_topk.c1], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), sort_keys([t1_topk.c3, ASC]), topn(7) 13 - output([t1_topk.c3], [t1_topk.c1], [T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(T_FUN_SUM(t1_topk.c2))], [T_FUN_SUM(T_FUN_SUM(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c3))], [T_FUN_MIN(T_FUN_MIN(t1_topk.c3))], [T_FUN_MAX(T_FUN_MAX(t1_topk.c1))], [T_FUN_COUNT_SUM(T_FUN_COUNT(t1_topk.c1))], [T_FUN_SUM(T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1))))]) 14 - output([t1_topk.c3], [t1_topk.c1], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), sort_keys([t1_topk.c2, ASC]) 15 - (#keys=1, [t1_topk.c2]), output([t1_topk.c3], [t1_topk.c1], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), dop=1 16 - output([t1_topk.c3], [t1_topk.c1], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), minimum_row_count:5 top_precision:10 limit(7), offset(nil) 17 - output([t1_topk.c3], [t1_topk.c1], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), sort_keys([t1_topk.c3, ASC]) 18 - output([t1_topk.c3], [t1_topk.c1], [t1_topk.c2], [T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)]), filter(nil), group([t1_topk.c2]), agg_func([T_FUN_SUM(t1_topk.c2)], [T_FUN_SUM(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c3)], [T_FUN_MIN(t1_topk.c3)], [T_FUN_MAX(t1_topk.c1)], [T_FUN_COUNT(t1_topk.c1)], [T_FUN_SUM(cast(t1_topk.c3, DOUBLE(-1, -1)))]) 19 - output([t1_topk.c3], [t1_topk.c1], [t1_topk.c2]), filter(nil), sort_keys([t1_topk.c2, ASC]) 20 - output([t1_topk.c1], [t1_topk.c3], [t1_topk.c2]), filter(nil), force partition granule. 21 - output([t1_topk.c1], [t1_topk.c3], [t1_topk.c2]), filter(nil), access([t1_topk.c1], [t1_topk.c3], [t1_topk.c2]), partitions(p[0-1]), is_index_back=false, range_key([t1_topk.c1]), range(MIN ; MAX)always true 22 - output([t2_topk.c1], [t2_topk.c2], [t2_topk.c3]), filter(nil), affinitize, force partition granule. 23 - output([t2_topk.c1], [t2_topk.c2], [t2_topk.c3]), filter(nil), access([t2_topk.c1], [t2_topk.c2], [t2_topk.c3]), partitions(p[0-1]), is_index_back=false, range_key([t2_topk.c1]), range(MIN ; MAX), range_cond([? = t2_topk.c1]) 24 - output([t3_topk.c1], [t3_topk.c2], [t3_topk.c3]), filter(nil), affinitize, force partition granule. 25 - output([t3_topk.c1], [t3_topk.c2], [t3_topk.c3]), filter(nil), access([t3_topk.c1], [t3_topk.c2], [t3_topk.c3]), partitions(p[0-1]), is_index_back=false, range_key([t3_topk.c1]), range(MIN ; MAX), range_cond([t3_topk.c1 = ?]) Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA <<<<<<< HEAD LEADING(@"SEL$1" (("a"@"SEL$1" "opt"."t2_topk"@"SEL$1") "opt"."t3_topk"@"SEL$1")) USE_NL(@"SEL$1" "opt"."t3_topk"@"SEL$1") PQ_DISTRIBUTE(@"SEL$1" "opt"."t3_topk"@"SEL$1" PARTITION NONE) USE_NL(@"SEL$1" "opt"."t2_topk"@"SEL$1") PQ_DISTRIBUTE(@"SEL$1" "opt"."t2_topk"@"SEL$1" PARTITION NONE) FULL(@"SEL$2" "opt"."t1_topk"@"SEL$2") FULL(@"SEL$1" "opt"."t2_topk"@"SEL$1") FULL(@"SEL$1" "opt"."t3_topk"@"SEL$1") OPTIMIZER_FEATURES_ENABLE('4.0.0.0') ======= LEADING(@"SEL$1" (("a"@"SEL$1" "opt.t2_topk"@"SEL$1" )"opt.t3_topk"@"SEL$1" )) USE_HASH(@"SEL$1" ("opt.t3_topk"@"SEL$1" )) PQ_DISTRIBUTE(@"SEL$1" ("opt.t3_topk"@"SEL$1" ) PARTITION NONE) USE_HASH(@"SEL$1" ("opt.t2_topk"@"SEL$1" )) PQ_DISTRIBUTE(@"SEL$1" ("opt.t2_topk"@"SEL$1" ) PARTITION NONE) USE_HASH_AGGREGATION(@"SEL$2") FULL(@"SEL$2" "opt"."t1_topk"@"SEL$2") FULL(@"SEL$1" "opt"."t2_topk"@"SEL$1") FULL(@"SEL$1" "opt"."t3_topk"@"SEL$1") >>>>>>> implement spm part1 END_OUTLINE_DATA */ Plan Type: ------------------------------------- DISTRIBUTED Optimization Info: ------------------------------------- t1_topk:table_rows:200, physical_range_rows:200, logical_range_rows:200, index_back_rows:0, output_rows:200, est_method:default_stat, optimization_method=cost_based, avaiable_index_name[t1_topk] t2_topk:table_rows:200, physical_range_rows:1, logical_range_rows:1, index_back_rows:0, output_rows:1, est_method:default_stat, optimization_method=rule_based, heuristic_rule=unique_index_without_indexback t3_topk:table_rows:200, physical_range_rows:1, logical_range_rows:1, index_back_rows:0, output_rows:1, est_method:default_stat, optimization_method=rule_based, heuristic_rule=unique_index_without_indexback Parameters: ------------------------------------- *************** Case 28(end) **************