mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-26301 Split optimization refills temporary table too many times
This patch optimizes the number of refills for the lateral derived table to which a materialized derived table subject to split optimization is is converted. This optimized number of refills is now considered as the expected number of refills of the materialized derived table when searching for the best possible splitting of the table.
This commit is contained in:
committed by
Oleksandr Byelkin
parent
ec79f37718
commit
ce7ffe61d8
@ -227,3 +227,216 @@ where t3.b > 15;
|
||||
drop table t3, t4;
|
||||
|
||||
--echo # End of 10.3 tests
|
||||
|
||||
--source include/have_sequence.inc
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-26301: Split optimization refills temporary table too many times
|
||||
--echo #
|
||||
|
||||
# 5 values
|
||||
create table t1(a int, b int);
|
||||
insert into t1 select seq,seq from seq_1_to_5;
|
||||
|
||||
# 5 value groups of size 2 each
|
||||
create table t2(a int, b int, key(a));
|
||||
insert into t2
|
||||
select A.seq,B.seq from seq_1_to_25 A, seq_1_to_2 B;
|
||||
|
||||
# 5 value groups of size 3 each
|
||||
create table t3(a int, b int, key(a));
|
||||
insert into t3
|
||||
select A.seq,B.seq from seq_1_to_5 A, seq_1_to_3 B;
|
||||
|
||||
analyze table t1,t2,t3 persistent for all;
|
||||
|
||||
explain
|
||||
select * from
|
||||
(t1 left join t2 on t2.a=t1.b) left join t3 on t3.a=t1.b;
|
||||
|
||||
# Now, create tables for Groups.
|
||||
|
||||
create table t10 (
|
||||
grp_id int,
|
||||
col1 int,
|
||||
key(grp_id)
|
||||
);
|
||||
|
||||
# 100 groups of 100 values each
|
||||
insert into t10
|
||||
select
|
||||
A.seq,
|
||||
B.seq
|
||||
from
|
||||
seq_1_to_100 A,
|
||||
seq_1_to_100 B;
|
||||
|
||||
# and X10 multiplier
|
||||
|
||||
create table t11 (
|
||||
col1 int,
|
||||
col2 int
|
||||
);
|
||||
insert into t11
|
||||
select A.seq, A.seq from seq_1_to_10 A;
|
||||
|
||||
analyze table t10,t11 persistent for all;
|
||||
|
||||
let $q1=
|
||||
select * from
|
||||
(
|
||||
(t1 left join t2 on t2.a=t1.b)
|
||||
left join t3 on t3.a=t1.b
|
||||
) left join (select grp_id, count(*)
|
||||
from t10 left join t11 on t11.col1=t10.col1
|
||||
group by grp_id) T on T.grp_id=t1.b;
|
||||
|
||||
eval
|
||||
explain $q1;
|
||||
|
||||
--echo # The important part in the below output is:
|
||||
--echo # "lateral": 1,
|
||||
--echo # "query_block": {
|
||||
--echo # "select_id": 2,
|
||||
--echo # "r_loops": 5, <-- must be 5, not 30.
|
||||
--source include/analyze-format.inc
|
||||
|
||||
eval
|
||||
analyze format=json $q1;
|
||||
|
||||
create table t21 (pk int primary key);
|
||||
insert into t21 values (1),(2),(3);
|
||||
|
||||
create table t22 (pk int primary key);
|
||||
insert into t22 values (1),(2),(3);
|
||||
|
||||
# Same as above but throw in a couple of const tables.
|
||||
explain
|
||||
select * from
|
||||
t21, t22,
|
||||
(
|
||||
(t1 left join t2 on t2.a=t1.b)
|
||||
left join t3 on t3.a=t1.b
|
||||
) left join (select grp_id, count(*)
|
||||
from t10 left join t11 on t11.col1=t10.col1
|
||||
group by grp_id) T on T.grp_id=t1.b
|
||||
where
|
||||
t21.pk=1 and t22.pk=2;
|
||||
|
||||
explain
|
||||
select * from
|
||||
t21,
|
||||
(
|
||||
(t1 left join t2 on t2.a=t1.b)
|
||||
left join t3 on t3.a=t1.b
|
||||
) left join (select grp_id, count(*)
|
||||
from
|
||||
t22 join t10 left join t11 on t11.col1=t10.col1
|
||||
where
|
||||
t22.pk=1
|
||||
group by grp_id) T on T.grp_id=t1.b
|
||||
where
|
||||
t21.pk=1;
|
||||
|
||||
# And also add a non-const table
|
||||
|
||||
create table t5 (
|
||||
pk int primary key
|
||||
);
|
||||
insert into t5 select seq from seq_1_to_1000;
|
||||
|
||||
explain
|
||||
select * from
|
||||
t21,
|
||||
(
|
||||
(((t1 join t5 on t5.pk=t1.b)) left join t2 on t2.a=t1.b)
|
||||
left join t3 on t3.a=t1.b
|
||||
) left join (select grp_id, count(*)
|
||||
from
|
||||
t22 join t10 left join t11 on t11.col1=t10.col1
|
||||
where
|
||||
t22.pk=1
|
||||
group by grp_id) T on T.grp_id=t1.b
|
||||
where
|
||||
t21.pk=1;
|
||||
|
||||
drop table t1,t2,t3,t5, t10, t11, t21, t22;
|
||||
|
||||
# 5 values
|
||||
create table t1(a int, b int);
|
||||
insert into t1 select seq,seq from seq_1_to_5;
|
||||
|
||||
# 5 value groups of size 2 each
|
||||
create table t2(a int, b int, key(a));
|
||||
insert into t2
|
||||
select A.seq,B.seq from seq_1_to_25 A, seq_1_to_2 B;
|
||||
|
||||
# 5 value groups of size 3 each
|
||||
create table t3(a int, b int, key(a));
|
||||
insert into t3
|
||||
select A.seq,B.seq from seq_1_to_5 A, seq_1_to_3 B;
|
||||
|
||||
analyze table t1,t2,t3 persistent for all;
|
||||
|
||||
create table t10 (
|
||||
grp_id int,
|
||||
col1 int,
|
||||
key(grp_id)
|
||||
);
|
||||
|
||||
# 100 groups of 100 values each
|
||||
insert into t10
|
||||
select
|
||||
A.seq,
|
||||
B.seq
|
||||
from
|
||||
seq_1_to_100 A,
|
||||
seq_1_to_100 B;
|
||||
|
||||
# and X10 multiplier
|
||||
|
||||
create table t11 (
|
||||
col1 int,
|
||||
col2 int
|
||||
);
|
||||
insert into t11
|
||||
select A.seq, A.seq from seq_1_to_10 A;
|
||||
|
||||
analyze table t10,t11 persistent for all;
|
||||
|
||||
let $q=
|
||||
select *
|
||||
from
|
||||
(
|
||||
(t1 left join t2 on t2.a=t1.b)
|
||||
left join
|
||||
t3
|
||||
on t3.a=t1.b
|
||||
)
|
||||
left join
|
||||
(
|
||||
select grp_id, count(*)
|
||||
from t10 left join t11 on t11.col1=t10.col1
|
||||
group by grp_id
|
||||
)dt
|
||||
on dt.grp_id=t1.b;
|
||||
|
||||
eval explain $q;
|
||||
eval $q;
|
||||
|
||||
set join_cache_level=4;
|
||||
eval explain $q;
|
||||
eval $q;
|
||||
|
||||
set join_cache_level=default;
|
||||
|
||||
drop index a on t2;
|
||||
drop index a on t3;
|
||||
|
||||
eval explain $q;
|
||||
eval $q;
|
||||
|
||||
drop table t1,t2,t3;
|
||||
drop table t10, t11;
|
||||
|
||||
--echo # End of 10.4 tests
|
||||
|
Reference in New Issue
Block a user