Files
openGauss-server/src/test/regress/sql/aggregates_part3.sql
2020-06-30 17:38:27 +08:00

122 lines
8.5 KiB
SQL

/*
* This file is used to test three possible paths of hash agg stream paths
*/
-- Part-3
drop schema if exists distribute_aggregates_part3 cascade;
create schema distribute_aggregates_part3;
set current_schema = distribute_aggregates_part3;
-- prepare a temp table for import data
create table tmp_t1(c1 int);
insert into tmp_t1 values (1);
-- Create Table and Insert Data
create table t_agg1(a int, b int, c int, d int, e int, f int, g regproc);
create table t_agg2(a int, b int, c int);
insert into t_agg1 select generate_series(1, 10000), generate_series(1, 10000)%5000, generate_series(1, 10000)%500, generate_series(1, 10000)%5, 500, 3, 'sin' from tmp_t1;
insert into t_agg2 select generate_series(1, 10), generate_series(11, 2, -1), generate_series(3, 12);
/*select * from table_skewness('t_agg1', 'b,c') order by 1, 2, 3;*/
analyze t_agg1;
analyze t_agg2;
-- (3) windowagg
explain (costs off, nodes off) select c, sum(x) from (select c, row_number() over (partition by c, d, e order by d, e) x from t_agg1) group by c;
select c, sum(x) from (select c, row_number() over (partition by c, d, e order by d, e) x from t_agg1) group by c order by c limit 10;
explain (costs off, nodes off) select x, sum(c+d+e) from (select c, d, e, row_number() over (partition by d order by c, e) x from t_agg1) group by x;
select x, sum(c+d+e) from (select c, d, e, row_number() over (partition by d order by c, e) x from t_agg1) group by x order by x limit 10;
-- join
explain (costs off, nodes off) select sum(t_agg1.a) from t_agg1 join t_agg2 on t_agg1.c=t_agg2.b group by t_agg1.c;
select sum(t_agg1.a) from t_agg1 join t_agg2 on t_agg1.c=t_agg2.b group by t_agg1.c order by t_agg1.c limit 10;
explain (costs off, nodes off) select a, b, count(c) from (select t_agg1.c a, t_agg1.d b, t_agg2.b-t_agg2.a c from t_agg1 join t_agg2 on t_agg1.b=t_agg2.c) group by a, b;
select a, b, count(c) from (select t_agg1.c a, t_agg1.d b, t_agg2.b-t_agg2.a c from t_agg1 join t_agg2 on t_agg1.b=t_agg2.c) group by a, b order by a, b limit 10;
explain (costs off, nodes off) select a, b, count(c) from (select t_agg1.c a, t_agg1.d b, sum(t_agg2.b-t_agg2.a) c from t_agg1 join t_agg2 on t_agg1.b=t_agg2.c group by t_agg1.d, t_agg1.c) group by a, b;
select a, b, count(c) from (select t_agg1.c a, t_agg1.d b, sum(t_agg2.b-t_agg2.a) c from t_agg1 join t_agg2 on t_agg1.b=t_agg2.c group by t_agg1.d, t_agg1.c) group by a, b order by a, b limit 10;
explain (costs off, nodes off) select a, b, count(c) from (select t_agg1.c a, t_agg1.d b, sum(t_agg2.b-t_agg2.a) c from t_agg1 join t_agg2 on t_agg1.b=t_agg2.c group by t_agg1.d, t_agg1.c having avg(t_agg2.a-t_agg2.b)>=0) group by a, b having count(c)=1;
select a, b, count(c) from (select t_agg1.c a, t_agg1.d b, sum(t_agg2.b+t_agg2.a) c from t_agg1 join t_agg2 on t_agg1.b=t_agg2.c group by t_agg1.d, t_agg1.c having avg(t_agg2.a-t_agg2.b)>=0) group by a, b having count(c)=1 order by a, b limit 10;
-- distinct pull down
explain (costs off, nodes off) select distinct count(a) as result from t_agg1 group by a order by count(a) using < fetch next 15 rows only;
select distinct count(a) as result from t_agg1 group by a order by count(a) using < fetch next 15 rows only;
explain (costs off, nodes off) select distinct count(d) as result from t_agg1 group by c order by count(d) using < fetch next 15 rows only;
select distinct count(d) as result from t_agg1 group by c order by count(d) using < fetch next 15 rows only;
select * from (select distinct count(d) as result from t_agg1 group by c order by count(d) using < limit all) order by result using < nulls first fetch next 15 rows only;
explain (costs off, nodes off) select * from (select distinct count(a) as result from t_agg1 group by a order by count(a) using < limit all) order by result using < nulls first fetch next 15 rows only;
select * from (select distinct count(a) as result from t_agg1 group by a order by count(a) using < limit all) order by result using < nulls first fetch next 15 rows only;
explain (costs off, nodes off) select * from (select distinct count(d) as result from t_agg1 group by c order by count(d) using < limit all) order by result using < nulls first fetch next 15 rows only;
select * from (select distinct count(d) as result from t_agg1 group by c order by count(d) using < limit all) order by result using < nulls first fetch next 15 rows only;
set enable_hashagg=off;
explain (costs off, nodes off) select all * from (select distinct case when b%2=1 then 'id=1' when b%2=0 then 'id=0' else 'id=2' end as result from t_agg1 order by 1);
select all * from (select distinct case when b%2=1 then 'id=1' when b%2=0 then 'id=0' else 'id=2' end as result from t_agg1 order by 1) order by 1;
explain (costs off, nodes off) select all * from (select case when b%2=1 then 'id=1' when b%2=0 then 'id=0' else 'id=2' end as result from t_agg1 group by result order by 1);
select all * from (select case when b%2=1 then 'id=1' when b%2=0 then 'id=0' else 'id=2' end as result from t_agg1 group by 1 order by 1) order by 1;
explain (costs off, nodes off) select sum(x) from (select sum(a) x from t_agg1 group by b);
select sum(x) from (select sum(a) x from t_agg1 group by b);
reset enable_hashagg;
explain (costs off, nodes off) select x from (select d, sum(a) x from t_agg1 group by 1);
select x from (select d, sum(a) x from t_agg1 group by 1) order by 1;
explain (costs off, nodes off) select x from (select g, sum(a) x from t_agg1 group by 1);
select x from (select g, sum(a) x from t_agg1 group by 1) order by 1;
set plan_mode_seed=2;
explain (costs off, nodes off) SELECT DISTINCT * FROM ( SELECT DISTINCT SUM(b) as result1 FROM t_agg1 where b <= 8 group by b having b < 10 order by result1 ASC OFFSET 1 ROW FETCH NEXT 30 ROW ONLY ) AS RESULT where result1 !=(3+3-1) group by result1 order by 1;
SELECT DISTINCT * FROM ( SELECT DISTINCT SUM(b) as result1 FROM t_agg1 where b <= 8 group by b having b < 10 order by result1 ASC OFFSET 1 ROW FETCH NEXT 30 ROW ONLY ) AS RESULT where result1 !=(3+3-1) group by result1 order by 1;
explain (costs off, nodes off) SELECT ALL * FROM (SELECT DISTINCT CASE WHEN d=1 THEN 'ID1' WHEN d=2 THEN 'ID2' ELSE 'ID0' END as result FROM t_agg1 where d is not null group by d order by 1 OFFSET 1 ROW FETCH NEXT 25 ROW ONLY ) ;
SELECT ALL * FROM (SELECT DISTINCT CASE WHEN d=1 THEN 'ID1' WHEN d=2 THEN 'ID2' ELSE 'ID0' END as result FROM t_agg1 where d is not null group by d order by 1 OFFSET 1 ROW FETCH NEXT 25 ROW ONLY ) ;
reset plan_mode_seed;
-- Clean Table
drop table t_agg1;
drop table t_agg2;
create table distkey_choose(a int, b int, c int);
insert into distkey_choose select generate_series(1, 100), generate_series(2, 101), generate_series(1, 20000) % 400 from tmp_t1;
analyze distkey_choose;
explain (verbose on, costs off) select b, case when c = 1 then 1 else 2 end from distkey_choose group by 1, 2;
explain (verbose on, costs off) select substr(c, 1, 2), a+b, b from distkey_choose group by 1, 2, 3;
explain (verbose on, costs off) select substr(c, 1, 1)||substr(c, 2, 1)||substr(c, 3, 1)||substr(c, 4, 1), a+b, b from distkey_choose group by 1, 2, 3;
explain (verbose on, costs off) select c>b, b from distkey_choose group by 1, 2;
explain (verbose on, costs off) select distinct count(a), count(b) from distkey_choose group by a;
explain (verbose on, costs off) select distinct count(1), count(2) from distkey_choose group by a;
explain (verbose on, costs off) select coalesce(t2.a, 0), t1.b, t1.c+5 from distkey_choose t1 left join distkey_choose t2 on t1.a=t2.a and t2.a=1 group by 1, 2, 3;
explain (verbose on, costs off) select t1.b, t2.a+5, t1.c+5 from distkey_choose t1 inner join distkey_choose t2 on t1.a=t2.a group by 1, 2, 3;
drop table distkey_choose;
CREATE TABLE sales_transaction_line
(
sales_tran_id number(38,10) null,
tran_line_status_cd clob null,
tran_line_sales_type_cd char(100) null
)with (orientation=row);
explain (costs off, nodes off)
SELECT
CAST(TRAN_LINE_STATUS_CD AS char) c1,
CAST(TRAN_LINE_STATUS_CD AS char) c2,
TRAN_LINE_SALES_TYPE_CD c3,
DENSE_RANK() OVER (order by TRAN_LINE_SALES_TYPE_CD)
FROM sales_transaction_line
GROUP BY c1,c3 ;
explain (costs off, nodes off)
SELECT
CAST(TRAN_LINE_STATUS_CD AS char) c1,
CAST(TRAN_LINE_STATUS_CD AS char) c2,
TRAN_LINE_SALES_TYPE_CD c3,
DENSE_RANK() OVER (order by TRAN_LINE_SALES_TYPE_CD)
FROM sales_transaction_line
GROUP BY c1,c2,c3 ;
SELECT
CAST(TRAN_LINE_STATUS_CD AS char) c1,
CAST(TRAN_LINE_STATUS_CD AS char) c2,
TRAN_LINE_SALES_TYPE_CD c3,
DENSE_RANK() OVER (order by TRAN_LINE_SALES_TYPE_CD)
FROM sales_transaction_line
GROUP BY c2,c3;
reset current_schema;
drop schema if exists distribute_aggregates_part3 cascade;