mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
- Backport @@optimizer_switch support from 6.0
- Add support for setting it as a server commandline argument - Add support for those switches: = no_index_merge = no_index_merge_union = no_index_merge_sort_union = no_index_merge_intersection mysql-test/r/index_merge_myisam.result: Testcases for index_merge related @@optimizer_switch flags. mysql-test/t/index_merge_myisam.test: Testcases for index_merge related @@optimizer_switch flags. sql/set_var.cc: - Backport @@optimizer_switch support from 6.0 - Add support for setting it as a server commandline argument sql/sql_class.h: - Backport @@optimizer_switch support from 6.0 sql/sql_select.h: - Backport @@optimizer_switch support from 6.0
This commit is contained in:
@ -1391,3 +1391,120 @@ WHERE
|
||||
`RUNID`= '' AND `SUBMITNR`= '' AND `ORDERNR`='' AND `PROGRAMM`='' AND
|
||||
`TESTID`='' AND `UCCHECK`='';
|
||||
drop table t1;
|
||||
#
|
||||
# @@optimizer_switch support and check
|
||||
#
|
||||
select @@optimizer_switch;
|
||||
@@optimizer_switch
|
||||
|
||||
create table t0 (a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t1 (a int, b int, c int, filler char(100),
|
||||
key(a), key(b), key(c));
|
||||
insert into t1 select
|
||||
A.a * B.a*10 + C.a*100,
|
||||
A.a * B.a*10 + C.a*100,
|
||||
A.a,
|
||||
'filler'
|
||||
from t0 A, t0 B, t0 C;
|
||||
This should use union:
|
||||
explain select * from t1 where a=1 or b=1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 index_merge a,b a,b 5,5 NULL 2 Using union(a,b); Using where
|
||||
This should use ALL:
|
||||
set optimizer_switch='no_index_merge';
|
||||
explain select * from t1 where a=1 or b=1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL a,b NULL NULL NULL 1000 Using where
|
||||
This should use sort-union:
|
||||
set optimizer_switch='no_index_merge_union';
|
||||
explain select * from t1 where a=1 or b=1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 index_merge a,b a,b 5,5 NULL 2 Using sort_union(a,b); Using where
|
||||
This will use sort-union:
|
||||
set optimizer_switch='';
|
||||
explain select * from t1 where a<1 or b <1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 index_merge a,b a,b 5,5 NULL 38 Using sort_union(a,b); Using where
|
||||
This should use ALL:
|
||||
set optimizer_switch='no_index_merge_sort_union';
|
||||
explain select * from t1 where a<1 or b <1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL a,b NULL NULL NULL 1000 Using where
|
||||
This should use ALL:
|
||||
set optimizer_switch='no_index_merge';
|
||||
explain select * from t1 where a<1 or b <1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL a,b NULL NULL NULL 1000 Using where
|
||||
This will use sort-union:
|
||||
set optimizer_switch='no_index_merge_union';
|
||||
explain select * from t1 where a<1 or b <1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 index_merge a,b a,b 5,5 NULL 38 Using sort_union(a,b); Using where
|
||||
alter table t1 add d int, add key(d);
|
||||
update t1 set d=a;
|
||||
This will use sort_union:
|
||||
set optimizer_switch='';
|
||||
explain select * from t1 where (a=3 or b in (1,2)) and (c=3 or d=4);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 index_merge a,b,c,d a,b 5,5 NULL 3 Using sort_union(a,b); Using where
|
||||
And if we disable sort_union, union:
|
||||
set optimizer_switch='no_index_merge_sort_union';
|
||||
explain select * from t1 where (a=3 or b in (1,2)) and (c=3 or d=4);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 index_merge a,b,c,d c,d 5,5 NULL 100 Using union(c,d); Using where
|
||||
drop table t1;
|
||||
create table t1 (
|
||||
a int, b int, c int,
|
||||
filler1 char(200), filler2 char(200),
|
||||
key(a),key(b),key(c)
|
||||
);
|
||||
insert into t1
|
||||
select A.a+10*B.a, A.a+10*B.a, A.a+10*B.a+100*C.a, 'foo', 'bar'
|
||||
from t0 A, t0 B, t0 C, t0 D where D.a<5;
|
||||
This should be intersect:
|
||||
set optimizer_switch='';
|
||||
explain select * from t1 where a=10 and b=10;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 index_merge a,b a,b 5,5 NULL 1 Using intersect(a,b); Using where
|
||||
No intersect when index_merge is disabled:
|
||||
set optimizer_switch='no_index_merge';
|
||||
explain select * from t1 where a=10 and b=10;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ref a,b a 5 const 49 Using where
|
||||
No intersect if it is disabled:
|
||||
set optimizer_switch='no_index_merge_intersection';
|
||||
explain select * from t1 where a=10 and b=10;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ref a,b a 5 const 49 Using where
|
||||
Do intersect when union was disabled
|
||||
set optimizer_switch='no_index_merge_union';
|
||||
explain select * from t1 where a=10 and b=10;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 index_merge a,b a,b 5,5 NULL 1 Using intersect(a,b); Using where
|
||||
Do intersect when sort_union was disabled
|
||||
set optimizer_switch='no_index_merge_sort_union';
|
||||
explain select * from t1 where a=10 and b=10;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 index_merge a,b a,b 5,5 NULL 1 Using intersect(a,b); Using where
|
||||
This will use intersection inside a union:
|
||||
set optimizer_switch='';
|
||||
explain select * from t1 where a=10 and b=10 or c=10;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 index_merge a,b,c a,b,c 5,5,5 NULL 6 Using union(intersect(a,b),c); Using where
|
||||
Should be only union left:
|
||||
set optimizer_switch='no_index_merge_intersection';
|
||||
explain select * from t1 where a=10 and b=10 or c=10;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 index_merge a,b,c a,c 5,5 NULL 54 Using union(a,c); Using where
|
||||
This will switch to sort-union (intersection will be gone, too,
|
||||
thats a known limitation:
|
||||
set optimizer_switch='no_index_merge_union';
|
||||
explain select * from t1 where a=10 and b=10 or c=10;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 index_merge a,b,c a,c 5,5 NULL 54 Using sort_union(a,c); Using where
|
||||
set optimizer_switch=default;
|
||||
show variables like 'optimizer_switch';
|
||||
Variable_name Value
|
||||
optimizer_switch
|
||||
drop table t0, t1;
|
||||
|
@ -19,3 +19,110 @@ let $merge_table_support= 1;
|
||||
--source include/index_merge2.inc
|
||||
--source include/index_merge_2sweeps.inc
|
||||
--source include/index_merge_ror_cpk.inc
|
||||
|
||||
--echo #
|
||||
--echo # @@optimizer_switch support and check
|
||||
--echo #
|
||||
select @@optimizer_switch;
|
||||
|
||||
create table t0 (a int);
|
||||
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
create table t1 (a int, b int, c int, filler char(100),
|
||||
key(a), key(b), key(c));
|
||||
insert into t1 select
|
||||
A.a * B.a*10 + C.a*100,
|
||||
A.a * B.a*10 + C.a*100,
|
||||
A.a,
|
||||
'filler'
|
||||
from t0 A, t0 B, t0 C;
|
||||
|
||||
--echo This should use union:
|
||||
explain select * from t1 where a=1 or b=1;
|
||||
|
||||
--echo This should use ALL:
|
||||
set optimizer_switch='no_index_merge';
|
||||
explain select * from t1 where a=1 or b=1;
|
||||
|
||||
--echo This should use sort-union:
|
||||
set optimizer_switch='no_index_merge_union';
|
||||
explain select * from t1 where a=1 or b=1;
|
||||
|
||||
--echo This will use sort-union:
|
||||
set optimizer_switch='';
|
||||
explain select * from t1 where a<1 or b <1;
|
||||
|
||||
--echo This should use ALL:
|
||||
set optimizer_switch='no_index_merge_sort_union';
|
||||
explain select * from t1 where a<1 or b <1;
|
||||
|
||||
|
||||
--echo This should use ALL:
|
||||
set optimizer_switch='no_index_merge';
|
||||
explain select * from t1 where a<1 or b <1;
|
||||
|
||||
--echo This will use sort-union:
|
||||
set optimizer_switch='no_index_merge_union';
|
||||
explain select * from t1 where a<1 or b <1;
|
||||
|
||||
alter table t1 add d int, add key(d);
|
||||
update t1 set d=a;
|
||||
|
||||
--echo This will use sort_union:
|
||||
set optimizer_switch='';
|
||||
explain select * from t1 where (a=3 or b in (1,2)) and (c=3 or d=4);
|
||||
|
||||
--echo And if we disable sort_union, union:
|
||||
set optimizer_switch='no_index_merge_sort_union';
|
||||
explain select * from t1 where (a=3 or b in (1,2)) and (c=3 or d=4);
|
||||
|
||||
drop table t1;
|
||||
|
||||
# Now test that intersection can be disabled
|
||||
create table t1 (
|
||||
a int, b int, c int,
|
||||
filler1 char(200), filler2 char(200),
|
||||
key(a),key(b),key(c)
|
||||
);
|
||||
|
||||
insert into t1
|
||||
select A.a+10*B.a, A.a+10*B.a, A.a+10*B.a+100*C.a, 'foo', 'bar'
|
||||
from t0 A, t0 B, t0 C, t0 D where D.a<5;
|
||||
|
||||
--echo This should be intersect:
|
||||
set optimizer_switch='';
|
||||
explain select * from t1 where a=10 and b=10;
|
||||
|
||||
--echo No intersect when index_merge is disabled:
|
||||
set optimizer_switch='no_index_merge';
|
||||
explain select * from t1 where a=10 and b=10;
|
||||
|
||||
--echo No intersect if it is disabled:
|
||||
set optimizer_switch='no_index_merge_intersection';
|
||||
explain select * from t1 where a=10 and b=10;
|
||||
|
||||
--echo Do intersect when union was disabled
|
||||
set optimizer_switch='no_index_merge_union';
|
||||
explain select * from t1 where a=10 and b=10;
|
||||
|
||||
--echo Do intersect when sort_union was disabled
|
||||
set optimizer_switch='no_index_merge_sort_union';
|
||||
explain select * from t1 where a=10 and b=10;
|
||||
|
||||
# Now take union-of-intersection and see how we can disable parts of it
|
||||
--echo This will use intersection inside a union:
|
||||
set optimizer_switch='';
|
||||
explain select * from t1 where a=10 and b=10 or c=10;
|
||||
|
||||
--echo Should be only union left:
|
||||
set optimizer_switch='no_index_merge_intersection';
|
||||
explain select * from t1 where a=10 and b=10 or c=10;
|
||||
|
||||
--echo This will switch to sort-union (intersection will be gone, too,
|
||||
--echo thats a known limitation:
|
||||
set optimizer_switch='no_index_merge_union';
|
||||
explain select * from t1 where a=10 and b=10 or c=10;
|
||||
|
||||
set optimizer_switch=default;
|
||||
show variables like 'optimizer_switch';
|
||||
drop table t0, t1;
|
||||
|
||||
|
Reference in New Issue
Block a user