[FEAT MERGE] implement dynamic sampling

This commit is contained in:
wangt1xiuyi
2023-04-27 12:15:28 +00:00
committed by ob-robot
parent 56f85c9c76
commit f745b47cbc
86 changed files with 6754 additions and 2282 deletions

View File

@ -3562,21 +3562,21 @@ CREATE TABLE `pujydypf` (
EXPLAIN select /*+use_merge(t1 t2), leading(t1 t2 t3)*/ t1.hldgddm, t2.pzjzqzh, t2.pzjzdjydy, t3.pjyjydy, t3.pjyscdm from cghldinf t1 left join puzdjypf t2 on t2.pzjzqzh = t1.hldgddm left join pujydypf t3 on t2.pzjzdjydy = t3.pjyjydy and t3.pjyscdm = '01' where hldgddm = 'A100013208';
Query Plan
===============================================================================
|ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)|
-------------------------------------------------------------------------------
|0 |PX COORDINATOR | |1 |13 |
|1 |└─EXCHANGE OUT DISTR |:EX10001|1 |12 |
|2 | └─HASH OUTER JOIN | |1 |11 |
|3 | ├─EXCHANGE IN DISTR | |1 |6 |
|4 | │ └─EXCHANGE OUT DISTR (PKEY) |:EX10000|1 |6 |
|5 | │ └─NESTED-LOOP OUTER JOIN CARTESIAN | |1 |5 |
|6 | │ ├─TABLE FULL SCAN |t1 |1 |2 |
|7 | │ └─MATERIAL | |1 |3 |
|8 | │ └─TABLE GET |t2 |1 |3 |
|9 | └─PX PARTITION ITERATOR | |1 |4 |
|10| └─TABLE FULL SCAN |t3 |1 |4 |
===============================================================================
===================================================================================
|ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)|
-----------------------------------------------------------------------------------
|0 |PX COORDINATOR | |2 |18 |
|1 |└─EXCHANGE OUT DISTR |:EX10001 |2 |16 |
|2 | └─HASH OUTER JOIN | |2 |13 |
|3 | ├─EXCHANGE IN DISTR | |2 |8 |
|4 | │ └─EXCHANGE OUT DISTR (PKEY) |:EX10000 |2 |7 |
|5 | │ └─NESTED-LOOP OUTER JOIN CARTESIAN | |2 |5 |
|6 | │ ├─TABLE FULL SCAN |t1(HLDINDEX)|2 |2 |
|7 | │ └─MATERIAL | |1 |3 |
|8 | │ └─TABLE GET |t2 |1 |3 |
|9 | └─PX PARTITION ITERATOR | |1 |4 |
|10| └─TABLE FULL SCAN |t3 |1 |4 |
===================================================================================
Outputs & filters:
-------------------------------------
0 - output([INTERNAL_FUNCTION(t1.HLDGDDM, t2.PZJZQZH, t2.PZJZDJYDY, t3.PJYJYDY, t3.PJYSCDM)]), filter(nil), rowset=256
@ -3592,7 +3592,7 @@ Outputs & filters:
6 - output([t1.HLDGDDM]), filter([t1.HLDGDDM = 'A100013208']), rowset=256
access([t1.HLDGDDM]), partitions(p5)
is_index_back=false, is_global_index=false, filter_before_indexback[false],
range_key([t1.HLDTGDM], [t1.HLDGDDM]), range(MIN,MIN ; MAX,MAX)always true
range_key([t1.HLDKMLB], [t1.HLDTGDM], [t1.HLDGDDM]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
7 - output([t2.PZJZDJYDY], [t2.PZJZQZH]), filter(nil), rowset=256
8 - output([t2.PZJZQZH], [t2.PZJZDJYDY]), filter(nil), rowset=256
access([t2.PZJZQZH], [t2.PZJZDJYDY]), partitions(p5)
@ -3614,24 +3614,24 @@ select /*+use_merge(t1 t2), leading(t1 t2 t3)*/ t1.hldgddm, t2.pzjzqzh, t2.pzjzd
+------------+------------+-----------+---------+---------+
EXPLAIN select /*+no_rewrite, use_merge(t1 t2), leading(t1 t2 t3)*/ t1.hldgddm, t2.pzjzqzh, t2.pzjzdjydy, t3.pjyjydy, t3.pjyscdm from cghldinf t1 left join puzdjypf t2 on t2.pzjzqzh = t1.hldgddm left join pujydypf t3 on t2.pzjzdjydy = t3.pjyjydy and t3.pjyscdm = '01' where hldgddm = 'A100013208';
Query Plan
===========================================================================
|ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)|
---------------------------------------------------------------------------
|0 |PX COORDINATOR | |1 |33 |
|1 |└─EXCHANGE OUT DISTR |:EX10002|1 |32 |
|2 | └─HASH OUTER JOIN | |1 |31 |
|3 | ├─EXCHANGE IN DISTR | |1 |27 |
|4 | │ └─EXCHANGE OUT DISTR (PKEY) |:EX10001|1 |26 |
|5 | │ └─MERGE OUTER JOIN | |1 |25 |
|6 | │ ├─EXCHANGE IN DISTR | |1 |3 |
|7 | │ │ └─EXCHANGE OUT DISTR (PKEY)|:EX10000|1 |3 |
|8 | │ │ └─TABLE FULL SCAN |t1 |1 |2 |
|9 | │ └─SORT | |1 |23 |
|10| │ └─PX PARTITION ITERATOR | |1 |22 |
|11| │ └─TABLE FULL SCAN |t2 |1 |22 |
|12| └─PX PARTITION ITERATOR | |1 |4 |
|13| └─TABLE FULL SCAN |t3 |1 |4 |
===========================================================================
===============================================================================
|ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)|
-------------------------------------------------------------------------------
|0 |PX COORDINATOR | |2 |38 |
|1 |└─EXCHANGE OUT DISTR |:EX10002 |2 |37 |
|2 | └─HASH OUTER JOIN | |2 |33 |
|3 | ├─EXCHANGE IN DISTR | |2 |29 |
|4 | │ └─EXCHANGE OUT DISTR (PKEY) |:EX10001 |2 |28 |
|5 | │ └─MERGE OUTER JOIN | |2 |26 |
|6 | │ ├─EXCHANGE IN DISTR | |2 |3 |
|7 | │ │ └─EXCHANGE OUT DISTR (PKEY)|:EX10000 |2 |3 |
|8 | │ │ └─TABLE FULL SCAN |t1(HLDINDEX)|2 |2 |
|9 | │ └─SORT | |1 |23 |
|10| │ └─PX PARTITION ITERATOR | |1 |22 |
|11| │ └─TABLE FULL SCAN |t2 |1 |22 |
|12| └─PX PARTITION ITERATOR | |1 |4 |
|13| └─TABLE FULL SCAN |t3 |1 |4 |
===============================================================================
Outputs & filters:
-------------------------------------
0 - output([INTERNAL_FUNCTION(t1.HLDGDDM, t2.PZJZQZH, t2.PZJZDJYDY, t3.PJYJYDY, t3.PJYSCDM)]), filter(nil), rowset=256
@ -3651,7 +3651,7 @@ Outputs & filters:
8 - output([t1.HLDGDDM]), filter([t1.HLDGDDM = 'A100013208']), rowset=256
access([t1.HLDGDDM]), partitions(p5)
is_index_back=false, is_global_index=false, filter_before_indexback[false],
range_key([t1.HLDTGDM], [t1.HLDGDDM]), range(MIN,MIN ; MAX,MAX)always true
range_key([t1.HLDKMLB], [t1.HLDTGDM], [t1.HLDGDDM]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
9 - output([t2.PZJZDJYDY], [t2.PZJZQZH]), filter(nil), rowset=256
sort_keys([t2.PZJZQZH, ASC]), local merge sort
10 - output([t2.PZJZQZH], [t2.PZJZDJYDY]), filter(nil), rowset=256
@ -3737,6 +3737,7 @@ Optimization Info:
output_rows:0
avaiable_index_name:[t1]
stats version:0
dynamic sampling level:1
B:
table_rows:1
physical_range_rows:1
@ -3745,6 +3746,7 @@ Optimization Info:
output_rows:1
avaiable_index_name:[t2]
stats version:0
dynamic sampling level:1
Plan Type:
LOCAL
@ -3811,6 +3813,7 @@ Optimization Info:
avaiable_index_name:[c1, t1]
unstable_index_name:[t1]
stats version:0
dynamic sampling level:1
B:
table_rows:1
physical_range_rows:1
@ -3820,6 +3823,7 @@ Optimization Info:
avaiable_index_name:[c2, t2]
pruned_index_name:[t2]
stats version:0
dynamic sampling level:1
Plan Type:
LOCAL
@ -3834,12 +3838,12 @@ Query Plan
-----------------------------------------------------------------
|0 |SCALAR GROUP BY | |1 |15 |
|1 |└─PX COORDINATOR | |1 |15 |
|2 | └─EXCHANGE OUT DISTR |:EX10000|1 |14 |
|2 | └─EXCHANGE OUT DISTR |:EX10000|1 |15 |
|3 | └─MERGE GROUP BY | |1 |14 |
|4 | └─PX PARTITION ITERATOR| |1 |14 |
|5 | └─HASH JOIN | |1 |14 |
|6 | ├─TABLE FULL SCAN |A |1 |7 |
|7 | └─TABLE FULL SCAN |B |1 |7 |
|6 | ├─TABLE FULL SCAN |B |1 |7 |
|7 | └─TABLE FULL SCAN |A |1 |7 |
=================================================================
Outputs & filters:
-------------------------------------
@ -3854,14 +3858,14 @@ Outputs & filters:
partition wise, force partition granule
5 - output(nil), filter(nil), rowset=256
equal_conds([A.c1 = B.c2]), other_conds(nil)
6 - output([A.c1]), filter([A.c1 >= 5630905], [A.c1 < 5631105], [A.c2 < 5631105], [A.c1 = A.c2]), rowset=256
access([A.c1], [A.c2]), partitions(p[0-3])
is_index_back=false, is_global_index=false, filter_before_indexback[false,false,false,false],
range_key([A.__pk_increment]), range(MIN ; MAX)always true
7 - output([B.c2]), filter([B.c2 < 5631105], [B.c2 >= 5630905]), rowset=256
6 - output([B.c2]), filter([B.c2 < 5631105], [B.c2 >= 5630905]), rowset=256
access([B.c2]), partitions(p[0-3])
is_index_back=false, is_global_index=false, filter_before_indexback[false,false],
range_key([B.__pk_increment]), range(MIN ; MAX)always true
7 - output([A.c1]), filter([A.c1 >= 5630905], [A.c1 < 5631105], [A.c2 < 5631105], [A.c1 = A.c2]), rowset=256
access([A.c1], [A.c2]), partitions(p[0-3])
is_index_back=false, is_global_index=false, filter_before_indexback[false,false,false,false],
range_key([A.__pk_increment]), range(MIN ; MAX)always true
Used Hint:
-------------------------------------
/*+
@ -3876,33 +3880,35 @@ Outline Data:
/*+
BEGIN_OUTLINE_DATA
GBY_PUSHDOWN(@"SEL$0208448F")
LEADING(@"SEL$0208448F" ("db_predicate_deduce"."A"@"SEL$1" "db_predicate_deduce"."B"@"SEL$1"))
USE_HASH(@"SEL$0208448F" "db_predicate_deduce"."B"@"SEL$1")
PQ_DISTRIBUTE(@"SEL$0208448F" "db_predicate_deduce"."B"@"SEL$1" NONE NONE)
FULL(@"SEL$0208448F" "db_predicate_deduce"."A"@"SEL$1")
LEADING(@"SEL$0208448F" ("db_predicate_deduce"."B"@"SEL$1" "db_predicate_deduce"."A"@"SEL$1"))
USE_HASH(@"SEL$0208448F" "db_predicate_deduce"."A"@"SEL$1")
PQ_DISTRIBUTE(@"SEL$0208448F" "db_predicate_deduce"."A"@"SEL$1" NONE NONE)
FULL(@"SEL$0208448F" "db_predicate_deduce"."B"@"SEL$1")
FULL(@"SEL$0208448F" "db_predicate_deduce"."A"@"SEL$1")
PRED_DEDUCE(@"SEL$1")
OPTIMIZER_FEATURES_ENABLE('4.0.0.0')
END_OUTLINE_DATA
*/
Optimization Info:
-------------------------------------
A:
table_rows:1
physical_range_rows:1
logical_range_rows:1
index_back_rows:0
output_rows:0
avaiable_index_name:[t1]
stats version:0
B:
table_rows:1
physical_range_rows:1
logical_range_rows:1
index_back_rows:0
output_rows:0
output_rows:1
avaiable_index_name:[t2]
stats version:0
dynamic sampling level:1
A:
table_rows:1
physical_range_rows:1
logical_range_rows:1
index_back_rows:0
output_rows:1
avaiable_index_name:[t1]
stats version:0
dynamic sampling level:1
Plan Type:
DISTRIBUTED
@ -4109,7 +4115,7 @@ Query Plan
=================================================
|ID|OPERATOR |NAME|EST.ROWS|EST.TIME(us)|
-------------------------------------------------
|0 |HASH JOIN | |4 |7 |
|0 |HASH JOIN | |3 |7 |
|1 |├─TABLE FULL SCAN|t2 |4 |2 |
|2 |└─TABLE FULL SCAN|t1 |5 |2 |
=================================================
@ -4137,7 +4143,7 @@ Query Plan
-------------------------------------------------
|0 |HASH JOIN | |1 |5 |
|1 |├─TABLE FULL SCAN|t2 |1 |2 |
|2 |└─TABLE FULL SCAN|t1 |4 |2 |
|2 |└─TABLE FULL SCAN|t1 |3 |2 |
=================================================
Outputs & filters:
-------------------------------------