Merge 10.0-base -> 10.0
This commit is contained in:
commit
cd0e834d12
@ -495,6 +495,9 @@ The following options may be given as the first argument:
|
|||||||
optimizer will switch to the original find_best search.
|
optimizer will switch to the original find_best search.
|
||||||
NOTE: The value 63 and its associated behaviour is
|
NOTE: The value 63 and its associated behaviour is
|
||||||
deprecated
|
deprecated
|
||||||
|
--optimizer-selectivity-sampling-limit=#
|
||||||
|
Controls number of record samples to check condition
|
||||||
|
selectivity
|
||||||
--optimizer-switch=name
|
--optimizer-switch=name
|
||||||
optimizer_switch=option=val[,option=val...], where option
|
optimizer_switch=option=val[,option=val...], where option
|
||||||
is one of {derived_merge, derived_with_keys, firstmatch,
|
is one of {derived_merge, derived_with_keys, firstmatch,
|
||||||
@ -523,7 +526,9 @@ The following options may be given as the first argument:
|
|||||||
any index to calculate the cardinality of a partial join,
|
any index to calculate the cardinality of a partial join,
|
||||||
4 - use histograms to calculate selectivity of range
|
4 - use histograms to calculate selectivity of range
|
||||||
conditions that are not backed by any index to calculate
|
conditions that are not backed by any index to calculate
|
||||||
the cardinality of a partial join.
|
the cardinality of a partial join.5 - additionally use
|
||||||
|
selectivity of certain non-range predicates calculated on
|
||||||
|
record samples
|
||||||
--performance-schema
|
--performance-schema
|
||||||
Enable the performance schema.
|
Enable the performance schema.
|
||||||
--performance-schema-accounts-size=#
|
--performance-schema-accounts-size=#
|
||||||
@ -1126,6 +1131,7 @@ old-passwords FALSE
|
|||||||
old-style-user-limits FALSE
|
old-style-user-limits FALSE
|
||||||
optimizer-prune-level 1
|
optimizer-prune-level 1
|
||||||
optimizer-search-depth 62
|
optimizer-search-depth 62
|
||||||
|
optimizer-selectivity-sampling-limit 100
|
||||||
optimizer-switch index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,engine_condition_pushdown=off,index_condition_pushdown=on,derived_merge=on,derived_with_keys=on,firstmatch=on,loosescan=on,materialization=on,in_to_exists=on,semijoin=on,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=on,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=on,semijoin_with_cache=on,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off,table_elimination=on
|
optimizer-switch index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,engine_condition_pushdown=off,index_condition_pushdown=on,derived_merge=on,derived_with_keys=on,firstmatch=on,loosescan=on,materialization=on,in_to_exists=on,semijoin=on,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=on,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=on,semijoin_with_cache=on,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off,table_elimination=on
|
||||||
optimizer-use-condition-selectivity 1
|
optimizer-use-condition-selectivity 1
|
||||||
performance-schema FALSE
|
performance-schema FALSE
|
||||||
|
@ -37,6 +37,89 @@ set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivit
|
|||||||
DROP DATABASE IF EXISTS dbt3_s001;
|
DROP DATABASE IF EXISTS dbt3_s001;
|
||||||
CREATE DATABASE dbt3_s001;
|
CREATE DATABASE dbt3_s001;
|
||||||
use dbt3_s001;
|
use dbt3_s001;
|
||||||
|
=== Q2 ===
|
||||||
|
set optimizer_use_condition_selectivity=5;
|
||||||
|
explain extended
|
||||||
|
select
|
||||||
|
s_acctbal, s_name, n_name, p_partkey, p_mfgr, s_address, s_phone, s_comment
|
||||||
|
from
|
||||||
|
part, supplier, partsupp, nation, region
|
||||||
|
where
|
||||||
|
p_partkey = ps_partkey
|
||||||
|
and s_suppkey = ps_suppkey
|
||||||
|
and p_size = 9
|
||||||
|
and p_type like '%TIN'
|
||||||
|
and s_nationkey = n_nationkey
|
||||||
|
and n_regionkey = r_regionkey
|
||||||
|
and r_name = 'ASIA'
|
||||||
|
and ps_supplycost = (
|
||||||
|
select
|
||||||
|
min(ps_supplycost)
|
||||||
|
from
|
||||||
|
partsupp, supplier, nation, region
|
||||||
|
where
|
||||||
|
p_partkey = ps_partkey
|
||||||
|
and s_suppkey = ps_suppkey
|
||||||
|
and s_nationkey = n_nationkey
|
||||||
|
and n_regionkey = r_regionkey
|
||||||
|
and r_name = 'ASIA'
|
||||||
|
)
|
||||||
|
order by
|
||||||
|
s_acctbal desc, n_name, s_name, p_partkey;
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 PRIMARY part ALL PRIMARY NULL NULL NULL 200 0.31 Using where; Using temporary; Using filesort
|
||||||
|
1 PRIMARY region ALL PRIMARY NULL NULL NULL 5 20.00 Using where; Using join buffer (flat, BNL join)
|
||||||
|
1 PRIMARY partsupp ref PRIMARY,i_ps_partkey,i_ps_suppkey PRIMARY 4 dbt3_s001.part.p_partkey 3 100.00 Using where
|
||||||
|
1 PRIMARY supplier ALL PRIMARY,i_s_nationkey NULL NULL NULL 10 80.00 Using where; Using join buffer (flat, BNL join)
|
||||||
|
1 PRIMARY nation eq_ref PRIMARY,i_n_regionkey PRIMARY 4 dbt3_s001.supplier.s_nationkey 1 100.00 Using where
|
||||||
|
2 DEPENDENT SUBQUERY region ALL PRIMARY NULL NULL NULL 5 20.00 Using where
|
||||||
|
2 DEPENDENT SUBQUERY partsupp ref PRIMARY,i_ps_partkey,i_ps_suppkey PRIMARY 4 dbt3_s001.part.p_partkey 3 100.00
|
||||||
|
2 DEPENDENT SUBQUERY supplier eq_ref PRIMARY,i_s_nationkey PRIMARY 4 dbt3_s001.partsupp.ps_suppkey 1 100.00 Using where
|
||||||
|
2 DEPENDENT SUBQUERY nation eq_ref PRIMARY,i_n_regionkey PRIMARY 4 dbt3_s001.supplier.s_nationkey 1 100.00 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1276 Field or reference 'dbt3_s001.part.p_partkey' of SELECT #2 was resolved in SELECT #1
|
||||||
|
Note 1003 select `dbt3_s001`.`supplier`.`s_acctbal` AS `s_acctbal`,`dbt3_s001`.`supplier`.`s_name` AS `s_name`,`dbt3_s001`.`nation`.`n_name` AS `n_name`,`dbt3_s001`.`part`.`p_partkey` AS `p_partkey`,`dbt3_s001`.`part`.`p_mfgr` AS `p_mfgr`,`dbt3_s001`.`supplier`.`s_address` AS `s_address`,`dbt3_s001`.`supplier`.`s_phone` AS `s_phone`,`dbt3_s001`.`supplier`.`s_comment` AS `s_comment` from `dbt3_s001`.`part` join `dbt3_s001`.`supplier` join `dbt3_s001`.`partsupp` join `dbt3_s001`.`nation` join `dbt3_s001`.`region` where ((`dbt3_s001`.`partsupp`.`ps_partkey` = `dbt3_s001`.`part`.`p_partkey`) and (`dbt3_s001`.`supplier`.`s_suppkey` = `dbt3_s001`.`partsupp`.`ps_suppkey`) and (`dbt3_s001`.`part`.`p_size` = 9) and (`dbt3_s001`.`nation`.`n_nationkey` = `dbt3_s001`.`supplier`.`s_nationkey`) and (`dbt3_s001`.`nation`.`n_regionkey` = `dbt3_s001`.`region`.`r_regionkey`) and (`dbt3_s001`.`region`.`r_name` = 'ASIA') and (`dbt3_s001`.`part`.`p_type` like '%TIN') and (`dbt3_s001`.`partsupp`.`ps_supplycost` = <expr_cache><`dbt3_s001`.`part`.`p_partkey`>((select min(`dbt3_s001`.`partsupp`.`ps_supplycost`) from `dbt3_s001`.`partsupp` join `dbt3_s001`.`supplier` join `dbt3_s001`.`nation` join `dbt3_s001`.`region` where ((`dbt3_s001`.`supplier`.`s_suppkey` = `dbt3_s001`.`partsupp`.`ps_suppkey`) and (`dbt3_s001`.`nation`.`n_nationkey` = `dbt3_s001`.`supplier`.`s_nationkey`) and (`dbt3_s001`.`nation`.`n_regionkey` = `dbt3_s001`.`region`.`r_regionkey`) and (`dbt3_s001`.`region`.`r_name` = 'ASIA') and (`dbt3_s001`.`part`.`p_partkey` = `dbt3_s001`.`partsupp`.`ps_partkey`)))))) order by `dbt3_s001`.`supplier`.`s_acctbal` desc,`dbt3_s001`.`nation`.`n_name`,`dbt3_s001`.`supplier`.`s_name`,`dbt3_s001`.`part`.`p_partkey`
|
||||||
|
set optimizer_use_condition_selectivity=4;
|
||||||
|
explain extended
|
||||||
|
select
|
||||||
|
s_acctbal, s_name, n_name, p_partkey, p_mfgr, s_address, s_phone, s_comment
|
||||||
|
from
|
||||||
|
part, supplier, partsupp, nation, region
|
||||||
|
where
|
||||||
|
p_partkey = ps_partkey
|
||||||
|
and s_suppkey = ps_suppkey
|
||||||
|
and p_size = 9
|
||||||
|
and p_type like '%TIN'
|
||||||
|
and s_nationkey = n_nationkey
|
||||||
|
and n_regionkey = r_regionkey
|
||||||
|
and r_name = 'ASIA'
|
||||||
|
and ps_supplycost = (
|
||||||
|
select
|
||||||
|
min(ps_supplycost)
|
||||||
|
from
|
||||||
|
partsupp, supplier, nation, region
|
||||||
|
where
|
||||||
|
p_partkey = ps_partkey
|
||||||
|
and s_suppkey = ps_suppkey
|
||||||
|
and s_nationkey = n_nationkey
|
||||||
|
and n_regionkey = r_regionkey
|
||||||
|
and r_name = 'ASIA'
|
||||||
|
)
|
||||||
|
order by
|
||||||
|
s_acctbal desc, n_name, s_name, p_partkey;
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 PRIMARY region ALL PRIMARY NULL NULL NULL 5 20.00 Using where; Using temporary; Using filesort
|
||||||
|
1 PRIMARY part ALL PRIMARY NULL NULL NULL 200 2.08 Using where; Using join buffer (flat, BNL join)
|
||||||
|
1 PRIMARY partsupp ref PRIMARY,i_ps_partkey,i_ps_suppkey PRIMARY 4 dbt3_s001.part.p_partkey 3 100.00 Using where
|
||||||
|
1 PRIMARY supplier ALL PRIMARY,i_s_nationkey NULL NULL NULL 10 80.00 Using where; Using join buffer (flat, BNL join)
|
||||||
|
1 PRIMARY nation eq_ref PRIMARY,i_n_regionkey PRIMARY 4 dbt3_s001.supplier.s_nationkey 1 100.00 Using where
|
||||||
|
2 DEPENDENT SUBQUERY region ALL PRIMARY NULL NULL NULL 5 20.00 Using where
|
||||||
|
2 DEPENDENT SUBQUERY partsupp ref PRIMARY,i_ps_partkey,i_ps_suppkey PRIMARY 4 dbt3_s001.part.p_partkey 3 100.00
|
||||||
|
2 DEPENDENT SUBQUERY supplier eq_ref PRIMARY,i_s_nationkey PRIMARY 4 dbt3_s001.partsupp.ps_suppkey 1 100.00 Using where
|
||||||
|
2 DEPENDENT SUBQUERY nation eq_ref PRIMARY,i_n_regionkey PRIMARY 4 dbt3_s001.supplier.s_nationkey 1 100.00 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1276 Field or reference 'dbt3_s001.part.p_partkey' of SELECT #2 was resolved in SELECT #1
|
||||||
|
Note 1003 select `dbt3_s001`.`supplier`.`s_acctbal` AS `s_acctbal`,`dbt3_s001`.`supplier`.`s_name` AS `s_name`,`dbt3_s001`.`nation`.`n_name` AS `n_name`,`dbt3_s001`.`part`.`p_partkey` AS `p_partkey`,`dbt3_s001`.`part`.`p_mfgr` AS `p_mfgr`,`dbt3_s001`.`supplier`.`s_address` AS `s_address`,`dbt3_s001`.`supplier`.`s_phone` AS `s_phone`,`dbt3_s001`.`supplier`.`s_comment` AS `s_comment` from `dbt3_s001`.`part` join `dbt3_s001`.`supplier` join `dbt3_s001`.`partsupp` join `dbt3_s001`.`nation` join `dbt3_s001`.`region` where ((`dbt3_s001`.`partsupp`.`ps_partkey` = `dbt3_s001`.`part`.`p_partkey`) and (`dbt3_s001`.`supplier`.`s_suppkey` = `dbt3_s001`.`partsupp`.`ps_suppkey`) and (`dbt3_s001`.`part`.`p_size` = 9) and (`dbt3_s001`.`nation`.`n_nationkey` = `dbt3_s001`.`supplier`.`s_nationkey`) and (`dbt3_s001`.`nation`.`n_regionkey` = `dbt3_s001`.`region`.`r_regionkey`) and (`dbt3_s001`.`region`.`r_name` = 'ASIA') and (`dbt3_s001`.`part`.`p_type` like '%TIN') and (`dbt3_s001`.`partsupp`.`ps_supplycost` = <expr_cache><`dbt3_s001`.`part`.`p_partkey`>((select min(`dbt3_s001`.`partsupp`.`ps_supplycost`) from `dbt3_s001`.`partsupp` join `dbt3_s001`.`supplier` join `dbt3_s001`.`nation` join `dbt3_s001`.`region` where ((`dbt3_s001`.`supplier`.`s_suppkey` = `dbt3_s001`.`partsupp`.`ps_suppkey`) and (`dbt3_s001`.`nation`.`n_nationkey` = `dbt3_s001`.`supplier`.`s_nationkey`) and (`dbt3_s001`.`nation`.`n_regionkey` = `dbt3_s001`.`region`.`r_regionkey`) and (`dbt3_s001`.`region`.`r_name` = 'ASIA') and (`dbt3_s001`.`part`.`p_partkey` = `dbt3_s001`.`partsupp`.`ps_partkey`)))))) order by `dbt3_s001`.`supplier`.`s_acctbal` desc,`dbt3_s001`.`nation`.`n_name`,`dbt3_s001`.`supplier`.`s_name`,`dbt3_s001`.`part`.`p_partkey`
|
||||||
=== Q15 ===
|
=== Q15 ===
|
||||||
create view revenue0 (supplier_no, total_revenue) as
|
create view revenue0 (supplier_no, total_revenue) as
|
||||||
select l_suppkey, sum(l_extendedprice * (1 - l_discount))
|
select l_suppkey, sum(l_extendedprice * (1 - l_discount))
|
||||||
@ -1011,4 +1094,38 @@ f1 f2 f2
|
|||||||
set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity;
|
set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity;
|
||||||
DROP TABLE t1,t2;
|
DROP TABLE t1,t2;
|
||||||
set use_stat_tables=@save_use_stat_tables;
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
#
|
||||||
|
# Bug mdev-4406: range condition for non-nullable column
|
||||||
|
# when optimizer_use_condition_selectivity=3
|
||||||
|
#
|
||||||
|
create table t1 (a int not null);
|
||||||
|
insert into t1 values
|
||||||
|
(7), (6), (4), (9), (1), (5), (2), (1), (3), (8);
|
||||||
|
set use_stat_tables='preferably';
|
||||||
|
analyze table t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 analyze status OK
|
||||||
|
flush table t1;
|
||||||
|
set optimizer_use_condition_selectivity=3;
|
||||||
|
select count(*) from t1 where a between 5 and 7;
|
||||||
|
count(*)
|
||||||
|
3
|
||||||
|
explain extended select * from t1 where a between 5 and 7;
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 10 25.00 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where (`test`.`t1`.`a` between 5 and 7)
|
||||||
|
alter table t1 change column a a int;
|
||||||
|
analyze table t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 analyze status OK
|
||||||
|
flush table t1;
|
||||||
|
explain extended select * from t1 where a between 5 and 7;
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 10 25.00 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where (`test`.`t1`.`a` between 5 and 7)
|
||||||
|
set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity;
|
||||||
|
drop table t1;
|
||||||
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
set use_stat_tables=@save_use_stat_tables;
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
@ -40,6 +40,89 @@ set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivit
|
|||||||
DROP DATABASE IF EXISTS dbt3_s001;
|
DROP DATABASE IF EXISTS dbt3_s001;
|
||||||
CREATE DATABASE dbt3_s001;
|
CREATE DATABASE dbt3_s001;
|
||||||
use dbt3_s001;
|
use dbt3_s001;
|
||||||
|
=== Q2 ===
|
||||||
|
set optimizer_use_condition_selectivity=5;
|
||||||
|
explain extended
|
||||||
|
select
|
||||||
|
s_acctbal, s_name, n_name, p_partkey, p_mfgr, s_address, s_phone, s_comment
|
||||||
|
from
|
||||||
|
part, supplier, partsupp, nation, region
|
||||||
|
where
|
||||||
|
p_partkey = ps_partkey
|
||||||
|
and s_suppkey = ps_suppkey
|
||||||
|
and p_size = 9
|
||||||
|
and p_type like '%TIN'
|
||||||
|
and s_nationkey = n_nationkey
|
||||||
|
and n_regionkey = r_regionkey
|
||||||
|
and r_name = 'ASIA'
|
||||||
|
and ps_supplycost = (
|
||||||
|
select
|
||||||
|
min(ps_supplycost)
|
||||||
|
from
|
||||||
|
partsupp, supplier, nation, region
|
||||||
|
where
|
||||||
|
p_partkey = ps_partkey
|
||||||
|
and s_suppkey = ps_suppkey
|
||||||
|
and s_nationkey = n_nationkey
|
||||||
|
and n_regionkey = r_regionkey
|
||||||
|
and r_name = 'ASIA'
|
||||||
|
)
|
||||||
|
order by
|
||||||
|
s_acctbal desc, n_name, s_name, p_partkey;
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 PRIMARY part ALL PRIMARY NULL NULL NULL 200 0.31 Using where; Using temporary; Using filesort
|
||||||
|
1 PRIMARY region ALL PRIMARY NULL NULL NULL 5 20.00 Using where; Using join buffer (flat, BNL join)
|
||||||
|
1 PRIMARY partsupp ref PRIMARY,i_ps_partkey,i_ps_suppkey PRIMARY 4 dbt3_s001.part.p_partkey 3 100.00 Using where
|
||||||
|
1 PRIMARY supplier ALL PRIMARY,i_s_nationkey NULL NULL NULL 10 80.00 Using where; Using join buffer (flat, BNL join)
|
||||||
|
1 PRIMARY nation eq_ref PRIMARY,i_n_regionkey PRIMARY 4 dbt3_s001.supplier.s_nationkey 1 100.00 Using where
|
||||||
|
2 DEPENDENT SUBQUERY region ALL PRIMARY NULL NULL NULL 5 20.00 Using where
|
||||||
|
2 DEPENDENT SUBQUERY partsupp ref PRIMARY,i_ps_partkey,i_ps_suppkey PRIMARY 4 dbt3_s001.part.p_partkey 3 100.00
|
||||||
|
2 DEPENDENT SUBQUERY supplier eq_ref PRIMARY,i_s_nationkey PRIMARY 4 dbt3_s001.partsupp.ps_suppkey 1 100.00 Using where
|
||||||
|
2 DEPENDENT SUBQUERY nation eq_ref PRIMARY,i_n_regionkey PRIMARY 4 dbt3_s001.supplier.s_nationkey 1 100.00 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1276 Field or reference 'dbt3_s001.part.p_partkey' of SELECT #2 was resolved in SELECT #1
|
||||||
|
Note 1003 select `dbt3_s001`.`supplier`.`s_acctbal` AS `s_acctbal`,`dbt3_s001`.`supplier`.`s_name` AS `s_name`,`dbt3_s001`.`nation`.`n_name` AS `n_name`,`dbt3_s001`.`part`.`p_partkey` AS `p_partkey`,`dbt3_s001`.`part`.`p_mfgr` AS `p_mfgr`,`dbt3_s001`.`supplier`.`s_address` AS `s_address`,`dbt3_s001`.`supplier`.`s_phone` AS `s_phone`,`dbt3_s001`.`supplier`.`s_comment` AS `s_comment` from `dbt3_s001`.`part` join `dbt3_s001`.`supplier` join `dbt3_s001`.`partsupp` join `dbt3_s001`.`nation` join `dbt3_s001`.`region` where ((`dbt3_s001`.`partsupp`.`ps_partkey` = `dbt3_s001`.`part`.`p_partkey`) and (`dbt3_s001`.`supplier`.`s_suppkey` = `dbt3_s001`.`partsupp`.`ps_suppkey`) and (`dbt3_s001`.`part`.`p_size` = 9) and (`dbt3_s001`.`nation`.`n_nationkey` = `dbt3_s001`.`supplier`.`s_nationkey`) and (`dbt3_s001`.`nation`.`n_regionkey` = `dbt3_s001`.`region`.`r_regionkey`) and (`dbt3_s001`.`region`.`r_name` = 'ASIA') and (`dbt3_s001`.`part`.`p_type` like '%TIN') and (`dbt3_s001`.`partsupp`.`ps_supplycost` = <expr_cache><`dbt3_s001`.`part`.`p_partkey`>((select min(`dbt3_s001`.`partsupp`.`ps_supplycost`) from `dbt3_s001`.`partsupp` join `dbt3_s001`.`supplier` join `dbt3_s001`.`nation` join `dbt3_s001`.`region` where ((`dbt3_s001`.`supplier`.`s_suppkey` = `dbt3_s001`.`partsupp`.`ps_suppkey`) and (`dbt3_s001`.`nation`.`n_nationkey` = `dbt3_s001`.`supplier`.`s_nationkey`) and (`dbt3_s001`.`nation`.`n_regionkey` = `dbt3_s001`.`region`.`r_regionkey`) and (`dbt3_s001`.`region`.`r_name` = 'ASIA') and (`dbt3_s001`.`part`.`p_partkey` = `dbt3_s001`.`partsupp`.`ps_partkey`)))))) order by `dbt3_s001`.`supplier`.`s_acctbal` desc,`dbt3_s001`.`nation`.`n_name`,`dbt3_s001`.`supplier`.`s_name`,`dbt3_s001`.`part`.`p_partkey`
|
||||||
|
set optimizer_use_condition_selectivity=4;
|
||||||
|
explain extended
|
||||||
|
select
|
||||||
|
s_acctbal, s_name, n_name, p_partkey, p_mfgr, s_address, s_phone, s_comment
|
||||||
|
from
|
||||||
|
part, supplier, partsupp, nation, region
|
||||||
|
where
|
||||||
|
p_partkey = ps_partkey
|
||||||
|
and s_suppkey = ps_suppkey
|
||||||
|
and p_size = 9
|
||||||
|
and p_type like '%TIN'
|
||||||
|
and s_nationkey = n_nationkey
|
||||||
|
and n_regionkey = r_regionkey
|
||||||
|
and r_name = 'ASIA'
|
||||||
|
and ps_supplycost = (
|
||||||
|
select
|
||||||
|
min(ps_supplycost)
|
||||||
|
from
|
||||||
|
partsupp, supplier, nation, region
|
||||||
|
where
|
||||||
|
p_partkey = ps_partkey
|
||||||
|
and s_suppkey = ps_suppkey
|
||||||
|
and s_nationkey = n_nationkey
|
||||||
|
and n_regionkey = r_regionkey
|
||||||
|
and r_name = 'ASIA'
|
||||||
|
)
|
||||||
|
order by
|
||||||
|
s_acctbal desc, n_name, s_name, p_partkey;
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 PRIMARY region ALL PRIMARY NULL NULL NULL 5 20.00 Using where; Using temporary; Using filesort
|
||||||
|
1 PRIMARY part ALL PRIMARY NULL NULL NULL 200 2.08 Using where; Using join buffer (flat, BNL join)
|
||||||
|
1 PRIMARY partsupp ref PRIMARY,i_ps_partkey,i_ps_suppkey PRIMARY 4 dbt3_s001.part.p_partkey 3 100.00 Using where
|
||||||
|
1 PRIMARY supplier ALL PRIMARY,i_s_nationkey NULL NULL NULL 10 80.00 Using where; Using join buffer (flat, BNL join)
|
||||||
|
1 PRIMARY nation eq_ref PRIMARY,i_n_regionkey PRIMARY 4 dbt3_s001.supplier.s_nationkey 1 100.00 Using where
|
||||||
|
2 DEPENDENT SUBQUERY region ALL PRIMARY NULL NULL NULL 5 20.00 Using where
|
||||||
|
2 DEPENDENT SUBQUERY partsupp ref PRIMARY,i_ps_partkey,i_ps_suppkey PRIMARY 4 dbt3_s001.part.p_partkey 3 100.00
|
||||||
|
2 DEPENDENT SUBQUERY supplier eq_ref PRIMARY,i_s_nationkey PRIMARY 4 dbt3_s001.partsupp.ps_suppkey 1 100.00 Using where
|
||||||
|
2 DEPENDENT SUBQUERY nation eq_ref PRIMARY,i_n_regionkey PRIMARY 4 dbt3_s001.supplier.s_nationkey 1 100.00 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1276 Field or reference 'dbt3_s001.part.p_partkey' of SELECT #2 was resolved in SELECT #1
|
||||||
|
Note 1003 select `dbt3_s001`.`supplier`.`s_acctbal` AS `s_acctbal`,`dbt3_s001`.`supplier`.`s_name` AS `s_name`,`dbt3_s001`.`nation`.`n_name` AS `n_name`,`dbt3_s001`.`part`.`p_partkey` AS `p_partkey`,`dbt3_s001`.`part`.`p_mfgr` AS `p_mfgr`,`dbt3_s001`.`supplier`.`s_address` AS `s_address`,`dbt3_s001`.`supplier`.`s_phone` AS `s_phone`,`dbt3_s001`.`supplier`.`s_comment` AS `s_comment` from `dbt3_s001`.`part` join `dbt3_s001`.`supplier` join `dbt3_s001`.`partsupp` join `dbt3_s001`.`nation` join `dbt3_s001`.`region` where ((`dbt3_s001`.`partsupp`.`ps_partkey` = `dbt3_s001`.`part`.`p_partkey`) and (`dbt3_s001`.`supplier`.`s_suppkey` = `dbt3_s001`.`partsupp`.`ps_suppkey`) and (`dbt3_s001`.`part`.`p_size` = 9) and (`dbt3_s001`.`nation`.`n_nationkey` = `dbt3_s001`.`supplier`.`s_nationkey`) and (`dbt3_s001`.`nation`.`n_regionkey` = `dbt3_s001`.`region`.`r_regionkey`) and (`dbt3_s001`.`region`.`r_name` = 'ASIA') and (`dbt3_s001`.`part`.`p_type` like '%TIN') and (`dbt3_s001`.`partsupp`.`ps_supplycost` = <expr_cache><`dbt3_s001`.`part`.`p_partkey`>((select min(`dbt3_s001`.`partsupp`.`ps_supplycost`) from `dbt3_s001`.`partsupp` join `dbt3_s001`.`supplier` join `dbt3_s001`.`nation` join `dbt3_s001`.`region` where ((`dbt3_s001`.`supplier`.`s_suppkey` = `dbt3_s001`.`partsupp`.`ps_suppkey`) and (`dbt3_s001`.`nation`.`n_nationkey` = `dbt3_s001`.`supplier`.`s_nationkey`) and (`dbt3_s001`.`nation`.`n_regionkey` = `dbt3_s001`.`region`.`r_regionkey`) and (`dbt3_s001`.`region`.`r_name` = 'ASIA') and (`dbt3_s001`.`part`.`p_partkey` = `dbt3_s001`.`partsupp`.`ps_partkey`)))))) order by `dbt3_s001`.`supplier`.`s_acctbal` desc,`dbt3_s001`.`nation`.`n_name`,`dbt3_s001`.`supplier`.`s_name`,`dbt3_s001`.`part`.`p_partkey`
|
||||||
=== Q15 ===
|
=== Q15 ===
|
||||||
create view revenue0 (supplier_no, total_revenue) as
|
create view revenue0 (supplier_no, total_revenue) as
|
||||||
select l_suppkey, sum(l_extendedprice * (1 - l_discount))
|
select l_suppkey, sum(l_extendedprice * (1 - l_discount))
|
||||||
@ -1019,6 +1102,40 @@ f1 f2 f2
|
|||||||
set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity;
|
set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity;
|
||||||
DROP TABLE t1,t2;
|
DROP TABLE t1,t2;
|
||||||
set use_stat_tables=@save_use_stat_tables;
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
#
|
||||||
|
# Bug mdev-4406: range condition for non-nullable column
|
||||||
|
# when optimizer_use_condition_selectivity=3
|
||||||
|
#
|
||||||
|
create table t1 (a int not null);
|
||||||
|
insert into t1 values
|
||||||
|
(7), (6), (4), (9), (1), (5), (2), (1), (3), (8);
|
||||||
|
set use_stat_tables='preferably';
|
||||||
|
analyze table t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 analyze status OK
|
||||||
|
flush table t1;
|
||||||
|
set optimizer_use_condition_selectivity=3;
|
||||||
|
select count(*) from t1 where a between 5 and 7;
|
||||||
|
count(*)
|
||||||
|
3
|
||||||
|
explain extended select * from t1 where a between 5 and 7;
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 10 25.00 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where (`test`.`t1`.`a` between 5 and 7)
|
||||||
|
alter table t1 change column a a int;
|
||||||
|
analyze table t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 analyze status OK
|
||||||
|
flush table t1;
|
||||||
|
explain extended select * from t1 where a between 5 and 7;
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 10 25.00 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where (`test`.`t1`.`a` between 5 and 7)
|
||||||
|
set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity;
|
||||||
|
drop table t1;
|
||||||
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
set use_stat_tables=@save_use_stat_tables;
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
set optimizer_switch=@save_optimizer_switch_for_selectivity_test;
|
set optimizer_switch=@save_optimizer_switch_for_selectivity_test;
|
||||||
SET SESSION STORAGE_ENGINE=DEFAULT;
|
SET SESSION STORAGE_ENGINE=DEFAULT;
|
||||||
|
@ -1416,6 +1416,43 @@ WORLD_INNODB CITY Country 1 17.5819
|
|||||||
WORLD_INNODB COUNTRYLANGUAGE PRIMARY 1 4.2232
|
WORLD_INNODB COUNTRYLANGUAGE PRIMARY 1 4.2232
|
||||||
WORLD_INNODB COUNTRYLANGUAGE PRIMARY 2 1.0000
|
WORLD_INNODB COUNTRYLANGUAGE PRIMARY 2 1.0000
|
||||||
WORLD_INNODB COUNTRYLANGUAGE Percentage 1 2.7640
|
WORLD_INNODB COUNTRYLANGUAGE Percentage 1 2.7640
|
||||||
|
use world;
|
||||||
|
set use_stat_tables='preferably';
|
||||||
|
set histogram_size=100;
|
||||||
|
set histogram_type='SINGLE_PREC_HB';
|
||||||
|
ANALYZE TABLE CountryLanguage;
|
||||||
|
set histogram_size=254;
|
||||||
|
set histogram_type='DOUBLE_PREC_HB';
|
||||||
|
ANALYZE TABLE City;
|
||||||
|
FLUSH TABLES;
|
||||||
|
select UPPER(db_name),UPPER(table_name),UPPER(column_name),min_value,max_value,nulls_ratio,avg_length,avg_frequency,hist_size,hist_type,hex(histogram),decode_histogram(histogram,hist_type) from mysql.column_stats where UPPER(db_name)='WORLD' and UPPER(table_name)='COUNTRYLANGUAGE' and UPPER(column_name) = 'PERCENTAGE';;
|
||||||
|
UPPER(db_name) WORLD
|
||||||
|
UPPER(table_name) COUNTRYLANGUAGE
|
||||||
|
UPPER(column_name) PERCENTAGE
|
||||||
|
min_value 0.0
|
||||||
|
max_value 99.9
|
||||||
|
nulls_ratio 0.0000
|
||||||
|
avg_length 4.0000
|
||||||
|
avg_frequency 2.7640
|
||||||
|
hist_size 100
|
||||||
|
hist_type SINGLE_PREC_HB
|
||||||
|
hex(histogram) 0000000000000000000000000101010101010101010202020303030304040404050505050606070707080809090A0A0B0C0D0D0E0E0F10111213131415161718191B1C1E202224292A2E33373B4850575F6A76818C9AA7B9C4CFDADFE5EBF0F4F8FAFCFF
|
||||||
|
decode_histogram(histogram,hist_type) 0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.004,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.004,0.000,0.000,0.004,0.000,0.000,0.000,0.004,0.000,0.000,0.000,0.004,0.000,0.000,0.000,0.004,0.000,0.004,0.000,0.000,0.004,0.000,0.004,0.000,0.004,0.000,0.004,0.004,0.004,0.000,0.004,0.000,0.004,0.004,0.004,0.004,0.004,0.000,0.004,0.004,0.004,0.004,0.004,0.004,0.008,0.004,0.008,0.008,0.008,0.008,0.020,0.004,0.016,0.020,0.016,0.016,0.051,0.031,0.027,0.031,0.043,0.047,0.043,0.043,0.055,0.051,0.071,0.043,0.043,0.043,0.020,0.024,0.024,0.020,0.016,0.016,0.008,0.008,0.012,0.000
|
||||||
|
select UPPER(db_name),UPPER(table_name),UPPER(column_name),min_value,max_value,nulls_ratio,avg_length,avg_frequency,hist_size,hist_type,hex(histogram),decode_histogram(histogram,hist_type) from mysql.column_stats where UPPER(db_name)='WORLD' and UPPER(table_name)='CITY' and UPPER(column_name) = 'POPULATION';;
|
||||||
|
UPPER(db_name) WORLD
|
||||||
|
UPPER(table_name) CITY
|
||||||
|
UPPER(column_name) POPULATION
|
||||||
|
min_value 42
|
||||||
|
max_value 10500000
|
||||||
|
nulls_ratio 0.0000
|
||||||
|
avg_length 4.0000
|
||||||
|
avg_frequency 1.0467
|
||||||
|
hist_size 254
|
||||||
|
hist_type DOUBLE_PREC_HB
|
||||||
|
hex(histogram) 1F00A1002B023002350238023F02430249024E02520258025D02630268026E02720276027B02800285028C02920297029D02A102A802AC02B402BC02C402CC02D302DA02E302EA02F102F802010305030C03120319031F03290333033D0343034F03590363036D037803840390039A03A603B303C303D103E003F203020412042404330440045304600472047F049104A204B804C804DE04F2040A0526053F0558056F058E05B305D905F4051306380667068406AB06DA06020731075C079407C507F8072E085E08A508DF0824096909CC092E0A760AD50A400BA90B150CAD0C310D240E130F0E103B11B9126B14F0166B192F1CB71FFF240630483FC567
|
||||||
|
decode_histogram(histogram,hist_type) 0.00047,0.00198,0.00601,0.00008,0.00008,0.00005,0.00011,0.00006,0.00009,0.00008,0.00006,0.00009,0.00008,0.00009,0.00008,0.00009,0.00006,0.00006,0.00008,0.00008,0.00008,0.00011,0.00009,0.00008,0.00009,0.00006,0.00011,0.00006,0.00012,0.00012,0.00012,0.00012,0.00011,0.00011,0.00014,0.00011,0.00011,0.00011,0.00014,0.00006,0.00011,0.00009,0.00011,0.00009,0.00015,0.00015,0.00015,0.00009,0.00018,0.00015,0.00015,0.00015,0.00017,0.00018,0.00018,0.00015,0.00018,0.00020,0.00024,0.00021,0.00023,0.00027,0.00024,0.00024,0.00027,0.00023,0.00020,0.00029,0.00020,0.00027,0.00020,0.00027,0.00026,0.00034,0.00024,0.00034,0.00031,0.00037,0.00043,0.00038,0.00038,0.00035,0.00047,0.00056,0.00058,0.00041,0.00047,0.00056,0.00072,0.00044,0.00060,0.00072,0.00061,0.00072,0.00066,0.00085,0.00075,0.00078,0.00082,0.00073,0.00108,0.00089,0.00105,0.00105,0.00151,0.00150,0.00110,0.00145,0.00163,0.00160,0.00165,0.00232,0.00201,0.00371,0.00365,0.00383,0.00459,0.00583,0.00662,0.00984,0.00969,0.01080,0.01379,0.02063,0.04308,0.05960,0.15816,0.59464
|
||||||
|
set histogram_type=default;
|
||||||
|
set histogram_size=default;
|
||||||
use test;
|
use test;
|
||||||
DROP DATABASE world;
|
DROP DATABASE world;
|
||||||
SELECT UPPER(db_name), UPPER(table_name), cardinality
|
SELECT UPPER(db_name), UPPER(table_name), cardinality
|
||||||
|
@ -0,0 +1,141 @@
|
|||||||
|
SET @start_global_value = @@global.optimizer_selectivity_sampling_limit;
|
||||||
|
SELECT @start_global_value;
|
||||||
|
@start_global_value
|
||||||
|
100
|
||||||
|
SET @start_session_value = @@session.optimizer_selectivity_sampling_limit;
|
||||||
|
SELECT @start_session_value;
|
||||||
|
@start_session_value
|
||||||
|
100
|
||||||
|
'#--------------------FN_DYNVARS_115_01-------------------------#'
|
||||||
|
SET @@global.optimizer_selectivity_sampling_limit = DEFAULT;
|
||||||
|
SELECT @@global.optimizer_selectivity_sampling_limit;
|
||||||
|
@@global.optimizer_selectivity_sampling_limit
|
||||||
|
100
|
||||||
|
SET @@session.optimizer_selectivity_sampling_limit = DEFAULT;
|
||||||
|
SELECT @@session.optimizer_selectivity_sampling_limit;
|
||||||
|
@@session.optimizer_selectivity_sampling_limit
|
||||||
|
100
|
||||||
|
'#--------------------FN_DYNVARS_115_02-------------------------#'
|
||||||
|
SET @@global.optimizer_selectivity_sampling_limit = DEFAULT;
|
||||||
|
SELECT @@global.optimizer_selectivity_sampling_limit = 100;
|
||||||
|
@@global.optimizer_selectivity_sampling_limit = 100
|
||||||
|
1
|
||||||
|
SET @@session.optimizer_selectivity_sampling_limit = DEFAULT;
|
||||||
|
SELECT @@session.optimizer_selectivity_sampling_limit = 100;
|
||||||
|
@@session.optimizer_selectivity_sampling_limit = 100
|
||||||
|
1
|
||||||
|
'#--------------------FN_DYNVARS_115_03-------------------------#'
|
||||||
|
SELECT @@global.optimizer_selectivity_sampling_limit;
|
||||||
|
@@global.optimizer_selectivity_sampling_limit
|
||||||
|
100
|
||||||
|
SET @@global.optimizer_selectivity_sampling_limit = 9;
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect optimizer_selectivity_sampling_l value: '9'
|
||||||
|
SELECT @@global.optimizer_selectivity_sampling_limit;
|
||||||
|
@@global.optimizer_selectivity_sampling_limit
|
||||||
|
10
|
||||||
|
SET @@global.optimizer_selectivity_sampling_limit = 10;
|
||||||
|
SELECT @@global.optimizer_selectivity_sampling_limit;
|
||||||
|
@@global.optimizer_selectivity_sampling_limit
|
||||||
|
10
|
||||||
|
SET @@global.optimizer_selectivity_sampling_limit = 11;
|
||||||
|
SELECT @@global.optimizer_selectivity_sampling_limit;
|
||||||
|
@@global.optimizer_selectivity_sampling_limit
|
||||||
|
11
|
||||||
|
SET @@global.optimizer_selectivity_sampling_limit = 7777;
|
||||||
|
SELECT @@global.optimizer_selectivity_sampling_limit;
|
||||||
|
@@global.optimizer_selectivity_sampling_limit
|
||||||
|
7777
|
||||||
|
SET @@global.optimizer_selectivity_sampling_limit = 4294967294;
|
||||||
|
SELECT @@global.optimizer_selectivity_sampling_limit;
|
||||||
|
@@global.optimizer_selectivity_sampling_limit
|
||||||
|
4294967294
|
||||||
|
SET @@global.optimizer_selectivity_sampling_limit = 4294967295;
|
||||||
|
SELECT @@global.optimizer_selectivity_sampling_limit;
|
||||||
|
@@global.optimizer_selectivity_sampling_limit
|
||||||
|
4294967295
|
||||||
|
SET @@global.optimizer_selectivity_sampling_limit = 4294967296;
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect optimizer_selectivity_sampling_l value: '4294967296'
|
||||||
|
SELECT @@global.optimizer_selectivity_sampling_limit;
|
||||||
|
@@global.optimizer_selectivity_sampling_limit
|
||||||
|
4294967295
|
||||||
|
'#--------------------FN_DYNVARS_115_04-------------------------#'
|
||||||
|
SELECT @@session.optimizer_selectivity_sampling_limit;
|
||||||
|
@@session.optimizer_selectivity_sampling_limit
|
||||||
|
100
|
||||||
|
SET @@session.optimizer_selectivity_sampling_limit = 9;
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect optimizer_selectivity_sampling_l value: '9'
|
||||||
|
SELECT @@session.optimizer_selectivity_sampling_limit;
|
||||||
|
@@session.optimizer_selectivity_sampling_limit
|
||||||
|
10
|
||||||
|
SET @@session.optimizer_selectivity_sampling_limit = 10;
|
||||||
|
SELECT @@session.optimizer_selectivity_sampling_limit;
|
||||||
|
@@session.optimizer_selectivity_sampling_limit
|
||||||
|
10
|
||||||
|
SET @@session.optimizer_selectivity_sampling_limit = 11;
|
||||||
|
SELECT @@session.optimizer_selectivity_sampling_limit;
|
||||||
|
@@session.optimizer_selectivity_sampling_limit
|
||||||
|
11
|
||||||
|
SET @@session.optimizer_selectivity_sampling_limit = 7777;
|
||||||
|
SELECT @@session.optimizer_selectivity_sampling_limit;
|
||||||
|
@@session.optimizer_selectivity_sampling_limit
|
||||||
|
7777
|
||||||
|
SET @@session.optimizer_selectivity_sampling_limit = 4294967294;
|
||||||
|
SELECT @@session.optimizer_selectivity_sampling_limit;
|
||||||
|
@@session.optimizer_selectivity_sampling_limit
|
||||||
|
4294967294
|
||||||
|
SET @@session.optimizer_selectivity_sampling_limit = 4294967295;
|
||||||
|
SELECT @@session.optimizer_selectivity_sampling_limit;
|
||||||
|
@@session.optimizer_selectivity_sampling_limit
|
||||||
|
4294967295
|
||||||
|
SET @@session.optimizer_selectivity_sampling_limit = 4294967296;
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect optimizer_selectivity_sampling_l value: '4294967296'
|
||||||
|
SELECT @@session.optimizer_selectivity_sampling_limit;
|
||||||
|
@@session.optimizer_selectivity_sampling_limit
|
||||||
|
4294967295
|
||||||
|
'#------------------FN_DYNVARS_115_05-----------------------#'
|
||||||
|
SET @@global.optimizer_selectivity_sampling_limit = ON;
|
||||||
|
ERROR 42000: Incorrect argument type to variable 'optimizer_selectivity_sampling_limit'
|
||||||
|
SET @@global.optimizer_selectivity_sampling_limit = OFF;
|
||||||
|
ERROR 42000: Incorrect argument type to variable 'optimizer_selectivity_sampling_limit'
|
||||||
|
SET @@session.optimizer_selectivity_sampling_limit = 65530.34;
|
||||||
|
ERROR 42000: Incorrect argument type to variable 'optimizer_selectivity_sampling_limit'
|
||||||
|
SET @@session.optimizer_selectivity_sampling_limit = test;
|
||||||
|
ERROR 42000: Incorrect argument type to variable 'optimizer_selectivity_sampling_limit'
|
||||||
|
'#------------------FN_DYNVARS_115_06-----------------------#'
|
||||||
|
SELECT @@global.optimizer_selectivity_sampling_limit = VARIABLE_VALUE
|
||||||
|
FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
|
||||||
|
WHERE VARIABLE_NAME='optimizer_selectivity_sampling_limit';
|
||||||
|
@@global.optimizer_selectivity_sampling_limit = VARIABLE_VALUE
|
||||||
|
1
|
||||||
|
'#------------------FN_DYNVARS_115_07-----------------------#'
|
||||||
|
SELECT @@session.optimizer_selectivity_sampling_limit = VARIABLE_VALUE
|
||||||
|
FROM INFORMATION_SCHEMA.SESSION_VARIABLES
|
||||||
|
WHERE VARIABLE_NAME='optimizer_selectivity_sampling_limit';
|
||||||
|
@@session.optimizer_selectivity_sampling_limit = VARIABLE_VALUE
|
||||||
|
1
|
||||||
|
'#---------------------FN_DYNVARS_115_08----------------------#'
|
||||||
|
SET @@optimizer_selectivity_sampling_limit = 10;
|
||||||
|
SET @@global.optimizer_selectivity_sampling_limit = 30;
|
||||||
|
SELECT @@optimizer_selectivity_sampling_limit = @@global.optimizer_selectivity_sampling_limit;
|
||||||
|
@@optimizer_selectivity_sampling_limit = @@global.optimizer_selectivity_sampling_limit
|
||||||
|
0
|
||||||
|
'#---------------------FN_DYNVARS_115_09----------------------#'
|
||||||
|
SET @@optimizer_selectivity_sampling_limit = 20;
|
||||||
|
SELECT @@optimizer_selectivity_sampling_limit = @@local.optimizer_selectivity_sampling_limit;
|
||||||
|
@@optimizer_selectivity_sampling_limit = @@local.optimizer_selectivity_sampling_limit
|
||||||
|
1
|
||||||
|
SELECT @@local.optimizer_selectivity_sampling_limit = @@session.optimizer_selectivity_sampling_limit;
|
||||||
|
@@local.optimizer_selectivity_sampling_limit = @@session.optimizer_selectivity_sampling_limit
|
||||||
|
1
|
||||||
|
SET @@global.optimizer_selectivity_sampling_limit = @start_global_value;
|
||||||
|
SELECT @@global.optimizer_selectivity_sampling_limit;
|
||||||
|
@@global.optimizer_selectivity_sampling_limit
|
||||||
|
100
|
||||||
|
SET @@session.optimizer_selectivity_sampling_limit = @start_session_value;
|
||||||
|
SELECT @@session.optimizer_selectivity_sampling_limit;
|
||||||
|
@@session.optimizer_selectivity_sampling_limit
|
||||||
|
100
|
@ -28,6 +28,12 @@ SELECT @@session.optimizer_use_condition_selectivity = 1;
|
|||||||
SELECT @@global.optimizer_use_condition_selectivity;
|
SELECT @@global.optimizer_use_condition_selectivity;
|
||||||
@@global.optimizer_use_condition_selectivity
|
@@global.optimizer_use_condition_selectivity
|
||||||
1
|
1
|
||||||
|
SET @@global.optimizer_use_condition_selectivity = 0;
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect optimizer_use_condition_selectiv value: '0'
|
||||||
|
SELECT @@global.optimizer_use_condition_selectivity;
|
||||||
|
@@global.optimizer_use_condition_selectivity
|
||||||
|
1
|
||||||
SET @@global.optimizer_use_condition_selectivity = 1;
|
SET @@global.optimizer_use_condition_selectivity = 1;
|
||||||
SELECT @@global.optimizer_use_condition_selectivity;
|
SELECT @@global.optimizer_use_condition_selectivity;
|
||||||
@@global.optimizer_use_condition_selectivity
|
@@global.optimizer_use_condition_selectivity
|
||||||
@ -44,10 +50,26 @@ SET @@global.optimizer_use_condition_selectivity = 4;
|
|||||||
SELECT @@global.optimizer_use_condition_selectivity;
|
SELECT @@global.optimizer_use_condition_selectivity;
|
||||||
@@global.optimizer_use_condition_selectivity
|
@@global.optimizer_use_condition_selectivity
|
||||||
4
|
4
|
||||||
|
SET @@global.optimizer_use_condition_selectivity = 5;
|
||||||
|
SELECT @@global.optimizer_use_condition_selectivity;
|
||||||
|
@@global.optimizer_use_condition_selectivity
|
||||||
|
5
|
||||||
|
SET @@global.optimizer_use_condition_selectivity = 6;
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect optimizer_use_condition_selectiv value: '6'
|
||||||
|
SELECT @@global.optimizer_use_condition_selectivity;
|
||||||
|
@@global.optimizer_use_condition_selectivity
|
||||||
|
5
|
||||||
'#--------------------FN_DYNVARS_115_04-------------------------#'
|
'#--------------------FN_DYNVARS_115_04-------------------------#'
|
||||||
SELECT @@session.optimizer_use_condition_selectivity;
|
SELECT @@session.optimizer_use_condition_selectivity;
|
||||||
@@session.optimizer_use_condition_selectivity
|
@@session.optimizer_use_condition_selectivity
|
||||||
1
|
1
|
||||||
|
SET @@session.optimizer_use_condition_selectivity = 0;
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect optimizer_use_condition_selectiv value: '0'
|
||||||
|
SELECT @@session.optimizer_use_condition_selectivity;
|
||||||
|
@@session.optimizer_use_condition_selectivity
|
||||||
|
1
|
||||||
SET @@session.optimizer_use_condition_selectivity = 1;
|
SET @@session.optimizer_use_condition_selectivity = 1;
|
||||||
SELECT @@session.optimizer_use_condition_selectivity;
|
SELECT @@session.optimizer_use_condition_selectivity;
|
||||||
@@session.optimizer_use_condition_selectivity
|
@@session.optimizer_use_condition_selectivity
|
||||||
@ -64,6 +86,16 @@ SET @@session.optimizer_use_condition_selectivity = 4;
|
|||||||
SELECT @@session.optimizer_use_condition_selectivity;
|
SELECT @@session.optimizer_use_condition_selectivity;
|
||||||
@@session.optimizer_use_condition_selectivity
|
@@session.optimizer_use_condition_selectivity
|
||||||
4
|
4
|
||||||
|
SET @@session.optimizer_use_condition_selectivity = 5;
|
||||||
|
SELECT @@session.optimizer_use_condition_selectivity;
|
||||||
|
@@session.optimizer_use_condition_selectivity
|
||||||
|
5
|
||||||
|
SET @@session.optimizer_use_condition_selectivity = 6;
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect optimizer_use_condition_selectiv value: '6'
|
||||||
|
SELECT @@session.optimizer_use_condition_selectivity;
|
||||||
|
@@session.optimizer_use_condition_selectivity
|
||||||
|
5
|
||||||
'#------------------FN_DYNVARS_115_05-----------------------#'
|
'#------------------FN_DYNVARS_115_05-----------------------#'
|
||||||
SET @@global.optimizer_use_condition_selectivity = ON;
|
SET @@global.optimizer_use_condition_selectivity = ON;
|
||||||
ERROR 42000: Incorrect argument type to variable 'optimizer_use_condition_selectivity'
|
ERROR 42000: Incorrect argument type to variable 'optimizer_use_condition_selectivity'
|
||||||
|
@ -0,0 +1,154 @@
|
|||||||
|
|
||||||
|
--source include/load_sysvars.inc
|
||||||
|
|
||||||
|
#################################################################
|
||||||
|
# START OF optimizer_selectivity_sampling_limit TESTS #
|
||||||
|
#################################################################
|
||||||
|
|
||||||
|
|
||||||
|
#############################################################
|
||||||
|
# Save initial value #
|
||||||
|
#############################################################
|
||||||
|
|
||||||
|
SET @start_global_value = @@global.optimizer_selectivity_sampling_limit;
|
||||||
|
SELECT @start_global_value;
|
||||||
|
SET @start_session_value = @@session.optimizer_selectivity_sampling_limit;
|
||||||
|
SELECT @start_session_value;
|
||||||
|
|
||||||
|
|
||||||
|
--echo '#--------------------FN_DYNVARS_115_01-------------------------#'
|
||||||
|
#########################################################################
|
||||||
|
# Display the DEFAULT value of optimizer_selectivity_sampling_limit #
|
||||||
|
#########################################################################
|
||||||
|
|
||||||
|
SET @@global.optimizer_selectivity_sampling_limit = DEFAULT;
|
||||||
|
SELECT @@global.optimizer_selectivity_sampling_limit;
|
||||||
|
|
||||||
|
SET @@session.optimizer_selectivity_sampling_limit = DEFAULT;
|
||||||
|
SELECT @@session.optimizer_selectivity_sampling_limit;
|
||||||
|
|
||||||
|
|
||||||
|
--echo '#--------------------FN_DYNVARS_115_02-------------------------#'
|
||||||
|
#########################################################################
|
||||||
|
# Check the DEFAULT value of optimizer_selectivity_sampling_limit #
|
||||||
|
#########################################################################
|
||||||
|
|
||||||
|
SET @@global.optimizer_selectivity_sampling_limit = DEFAULT;
|
||||||
|
SELECT @@global.optimizer_selectivity_sampling_limit = 100;
|
||||||
|
|
||||||
|
SET @@session.optimizer_selectivity_sampling_limit = DEFAULT;
|
||||||
|
SELECT @@session.optimizer_selectivity_sampling_limit = 100;
|
||||||
|
|
||||||
|
|
||||||
|
--echo '#--------------------FN_DYNVARS_115_03-------------------------#'
|
||||||
|
#############################################################################################
|
||||||
|
# Change the value of optimizer_selectivity_sampling_limit to a valid value for GLOBAL Scope #
|
||||||
|
#############################################################################################
|
||||||
|
|
||||||
|
SELECT @@global.optimizer_selectivity_sampling_limit;
|
||||||
|
SET @@global.optimizer_selectivity_sampling_limit = 9;
|
||||||
|
SELECT @@global.optimizer_selectivity_sampling_limit;
|
||||||
|
SET @@global.optimizer_selectivity_sampling_limit = 10;
|
||||||
|
SELECT @@global.optimizer_selectivity_sampling_limit;
|
||||||
|
SET @@global.optimizer_selectivity_sampling_limit = 11;
|
||||||
|
SELECT @@global.optimizer_selectivity_sampling_limit;
|
||||||
|
SET @@global.optimizer_selectivity_sampling_limit = 7777;
|
||||||
|
SELECT @@global.optimizer_selectivity_sampling_limit;
|
||||||
|
SET @@global.optimizer_selectivity_sampling_limit = 4294967294;
|
||||||
|
SELECT @@global.optimizer_selectivity_sampling_limit;
|
||||||
|
SET @@global.optimizer_selectivity_sampling_limit = 4294967295;
|
||||||
|
SELECT @@global.optimizer_selectivity_sampling_limit;
|
||||||
|
SET @@global.optimizer_selectivity_sampling_limit = 4294967296;
|
||||||
|
SELECT @@global.optimizer_selectivity_sampling_limit;
|
||||||
|
|
||||||
|
|
||||||
|
--echo '#--------------------FN_DYNVARS_115_04-------------------------#'
|
||||||
|
#############################################################################################
|
||||||
|
# Change the value of optimizer_selectivity_sampling_limit to a valid value for SESSION Scope#
|
||||||
|
#############################################################################################
|
||||||
|
|
||||||
|
SELECT @@session.optimizer_selectivity_sampling_limit;
|
||||||
|
SET @@session.optimizer_selectivity_sampling_limit = 9;
|
||||||
|
SELECT @@session.optimizer_selectivity_sampling_limit;
|
||||||
|
SET @@session.optimizer_selectivity_sampling_limit = 10;
|
||||||
|
SELECT @@session.optimizer_selectivity_sampling_limit;
|
||||||
|
SET @@session.optimizer_selectivity_sampling_limit = 11;
|
||||||
|
SELECT @@session.optimizer_selectivity_sampling_limit;
|
||||||
|
SET @@session.optimizer_selectivity_sampling_limit = 7777;
|
||||||
|
SELECT @@session.optimizer_selectivity_sampling_limit;
|
||||||
|
SET @@session.optimizer_selectivity_sampling_limit = 4294967294;
|
||||||
|
SELECT @@session.optimizer_selectivity_sampling_limit;
|
||||||
|
SET @@session.optimizer_selectivity_sampling_limit = 4294967295;
|
||||||
|
SELECT @@session.optimizer_selectivity_sampling_limit;
|
||||||
|
SET @@session.optimizer_selectivity_sampling_limit = 4294967296;
|
||||||
|
SELECT @@session.optimizer_selectivity_sampling_limit;
|
||||||
|
|
||||||
|
|
||||||
|
--echo '#------------------FN_DYNVARS_115_05-----------------------#'
|
||||||
|
###############################################################################
|
||||||
|
# Change the value of optimizer_selectivity_sampling_limit to an invalid value #
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
--Error ER_WRONG_TYPE_FOR_VAR
|
||||||
|
SET @@global.optimizer_selectivity_sampling_limit = ON;
|
||||||
|
--Error ER_WRONG_TYPE_FOR_VAR
|
||||||
|
SET @@global.optimizer_selectivity_sampling_limit = OFF;
|
||||||
|
--Error ER_WRONG_TYPE_FOR_VAR
|
||||||
|
SET @@session.optimizer_selectivity_sampling_limit = 65530.34;
|
||||||
|
--Error ER_WRONG_TYPE_FOR_VAR
|
||||||
|
SET @@session.optimizer_selectivity_sampling_limit = test;
|
||||||
|
|
||||||
|
--echo '#------------------FN_DYNVARS_115_06-----------------------#'
|
||||||
|
####################################################################
|
||||||
|
# Check if the value in GLOBAL Table matches value in variable #
|
||||||
|
####################################################################
|
||||||
|
|
||||||
|
|
||||||
|
SELECT @@global.optimizer_selectivity_sampling_limit = VARIABLE_VALUE
|
||||||
|
FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES
|
||||||
|
WHERE VARIABLE_NAME='optimizer_selectivity_sampling_limit';
|
||||||
|
|
||||||
|
--echo '#------------------FN_DYNVARS_115_07-----------------------#'
|
||||||
|
####################################################################
|
||||||
|
# Check if the value in SESSION Table matches value in variable #
|
||||||
|
####################################################################
|
||||||
|
|
||||||
|
SELECT @@session.optimizer_selectivity_sampling_limit = VARIABLE_VALUE
|
||||||
|
FROM INFORMATION_SCHEMA.SESSION_VARIABLES
|
||||||
|
WHERE VARIABLE_NAME='optimizer_selectivity_sampling_limit';
|
||||||
|
|
||||||
|
|
||||||
|
--echo '#---------------------FN_DYNVARS_115_08----------------------#'
|
||||||
|
###############################################################################
|
||||||
|
# Check if global and session variable are independent of each other #
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
SET @@optimizer_selectivity_sampling_limit = 10;
|
||||||
|
SET @@global.optimizer_selectivity_sampling_limit = 30;
|
||||||
|
SELECT @@optimizer_selectivity_sampling_limit = @@global.optimizer_selectivity_sampling_limit;
|
||||||
|
|
||||||
|
|
||||||
|
--echo '#---------------------FN_DYNVARS_115_09----------------------#'
|
||||||
|
###############################################################################
|
||||||
|
# Check if accessing variable with SESSION,LOCAL and without SCOPE points #
|
||||||
|
# to same session variable #
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
SET @@optimizer_selectivity_sampling_limit = 20;
|
||||||
|
SELECT @@optimizer_selectivity_sampling_limit = @@local.optimizer_selectivity_sampling_limit;
|
||||||
|
SELECT @@local.optimizer_selectivity_sampling_limit = @@session.optimizer_selectivity_sampling_limit;
|
||||||
|
|
||||||
|
|
||||||
|
####################################
|
||||||
|
# Restore initial value #
|
||||||
|
####################################
|
||||||
|
|
||||||
|
SET @@global.optimizer_selectivity_sampling_limit = @start_global_value;
|
||||||
|
SELECT @@global.optimizer_selectivity_sampling_limit;
|
||||||
|
SET @@session.optimizer_selectivity_sampling_limit = @start_session_value;
|
||||||
|
SELECT @@session.optimizer_selectivity_sampling_limit;
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# END OF optimizer_selectivity_sampling_limit TESTS #
|
||||||
|
########################################################################
|
||||||
|
|
@ -45,6 +45,8 @@ SELECT @@session.optimizer_use_condition_selectivity = 1;
|
|||||||
# Change the value of optimizer_use_condition_selectivity to a valid value for GLOBAL Scope #
|
# Change the value of optimizer_use_condition_selectivity to a valid value for GLOBAL Scope #
|
||||||
#############################################################################################
|
#############################################################################################
|
||||||
|
|
||||||
|
SELECT @@global.optimizer_use_condition_selectivity;
|
||||||
|
SET @@global.optimizer_use_condition_selectivity = 0;
|
||||||
SELECT @@global.optimizer_use_condition_selectivity;
|
SELECT @@global.optimizer_use_condition_selectivity;
|
||||||
SET @@global.optimizer_use_condition_selectivity = 1;
|
SET @@global.optimizer_use_condition_selectivity = 1;
|
||||||
SELECT @@global.optimizer_use_condition_selectivity;
|
SELECT @@global.optimizer_use_condition_selectivity;
|
||||||
@ -54,6 +56,10 @@ SET @@global.optimizer_use_condition_selectivity = 3;
|
|||||||
SELECT @@global.optimizer_use_condition_selectivity;
|
SELECT @@global.optimizer_use_condition_selectivity;
|
||||||
SET @@global.optimizer_use_condition_selectivity = 4;
|
SET @@global.optimizer_use_condition_selectivity = 4;
|
||||||
SELECT @@global.optimizer_use_condition_selectivity;
|
SELECT @@global.optimizer_use_condition_selectivity;
|
||||||
|
SET @@global.optimizer_use_condition_selectivity = 5;
|
||||||
|
SELECT @@global.optimizer_use_condition_selectivity;
|
||||||
|
SET @@global.optimizer_use_condition_selectivity = 6;
|
||||||
|
SELECT @@global.optimizer_use_condition_selectivity;
|
||||||
|
|
||||||
|
|
||||||
--echo '#--------------------FN_DYNVARS_115_04-------------------------#'
|
--echo '#--------------------FN_DYNVARS_115_04-------------------------#'
|
||||||
@ -61,6 +67,8 @@ SELECT @@global.optimizer_use_condition_selectivity;
|
|||||||
# Change the value of optimizer_use_condition_selectivity to a valid value for SESSION Scope#
|
# Change the value of optimizer_use_condition_selectivity to a valid value for SESSION Scope#
|
||||||
#############################################################################################
|
#############################################################################################
|
||||||
|
|
||||||
|
SELECT @@session.optimizer_use_condition_selectivity;
|
||||||
|
SET @@session.optimizer_use_condition_selectivity = 0;
|
||||||
SELECT @@session.optimizer_use_condition_selectivity;
|
SELECT @@session.optimizer_use_condition_selectivity;
|
||||||
SET @@session.optimizer_use_condition_selectivity = 1;
|
SET @@session.optimizer_use_condition_selectivity = 1;
|
||||||
SELECT @@session.optimizer_use_condition_selectivity;
|
SELECT @@session.optimizer_use_condition_selectivity;
|
||||||
@ -70,6 +78,10 @@ SET @@session.optimizer_use_condition_selectivity = 3;
|
|||||||
SELECT @@session.optimizer_use_condition_selectivity;
|
SELECT @@session.optimizer_use_condition_selectivity;
|
||||||
SET @@session.optimizer_use_condition_selectivity = 4;
|
SET @@session.optimizer_use_condition_selectivity = 4;
|
||||||
SELECT @@session.optimizer_use_condition_selectivity;
|
SELECT @@session.optimizer_use_condition_selectivity;
|
||||||
|
SET @@session.optimizer_use_condition_selectivity = 5;
|
||||||
|
SELECT @@session.optimizer_use_condition_selectivity;
|
||||||
|
SET @@session.optimizer_use_condition_selectivity = 6;
|
||||||
|
SELECT @@session.optimizer_use_condition_selectivity;
|
||||||
|
|
||||||
|
|
||||||
--echo '#------------------FN_DYNVARS_115_05-----------------------#'
|
--echo '#------------------FN_DYNVARS_115_05-----------------------#'
|
||||||
|
@ -56,6 +56,64 @@ customer, lineitem, nation, orders, part, partsupp, region, supplier;
|
|||||||
--enable_result_log
|
--enable_result_log
|
||||||
--enable_query_log
|
--enable_query_log
|
||||||
|
|
||||||
|
--echo === Q2 ===
|
||||||
|
|
||||||
|
set optimizer_use_condition_selectivity=5;
|
||||||
|
explain extended
|
||||||
|
select
|
||||||
|
s_acctbal, s_name, n_name, p_partkey, p_mfgr, s_address, s_phone, s_comment
|
||||||
|
from
|
||||||
|
part, supplier, partsupp, nation, region
|
||||||
|
where
|
||||||
|
p_partkey = ps_partkey
|
||||||
|
and s_suppkey = ps_suppkey
|
||||||
|
and p_size = 9
|
||||||
|
and p_type like '%TIN'
|
||||||
|
and s_nationkey = n_nationkey
|
||||||
|
and n_regionkey = r_regionkey
|
||||||
|
and r_name = 'ASIA'
|
||||||
|
and ps_supplycost = (
|
||||||
|
select
|
||||||
|
min(ps_supplycost)
|
||||||
|
from
|
||||||
|
partsupp, supplier, nation, region
|
||||||
|
where
|
||||||
|
p_partkey = ps_partkey
|
||||||
|
and s_suppkey = ps_suppkey
|
||||||
|
and s_nationkey = n_nationkey
|
||||||
|
and n_regionkey = r_regionkey
|
||||||
|
and r_name = 'ASIA'
|
||||||
|
)
|
||||||
|
order by
|
||||||
|
s_acctbal desc, n_name, s_name, p_partkey;
|
||||||
|
set optimizer_use_condition_selectivity=4;
|
||||||
|
explain extended
|
||||||
|
select
|
||||||
|
s_acctbal, s_name, n_name, p_partkey, p_mfgr, s_address, s_phone, s_comment
|
||||||
|
from
|
||||||
|
part, supplier, partsupp, nation, region
|
||||||
|
where
|
||||||
|
p_partkey = ps_partkey
|
||||||
|
and s_suppkey = ps_suppkey
|
||||||
|
and p_size = 9
|
||||||
|
and p_type like '%TIN'
|
||||||
|
and s_nationkey = n_nationkey
|
||||||
|
and n_regionkey = r_regionkey
|
||||||
|
and r_name = 'ASIA'
|
||||||
|
and ps_supplycost = (
|
||||||
|
select
|
||||||
|
min(ps_supplycost)
|
||||||
|
from
|
||||||
|
partsupp, supplier, nation, region
|
||||||
|
where
|
||||||
|
p_partkey = ps_partkey
|
||||||
|
and s_suppkey = ps_suppkey
|
||||||
|
and s_nationkey = n_nationkey
|
||||||
|
and n_regionkey = r_regionkey
|
||||||
|
and r_name = 'ASIA'
|
||||||
|
)
|
||||||
|
order by
|
||||||
|
s_acctbal desc, n_name, s_name, p_partkey;
|
||||||
|
|
||||||
--echo === Q15 ===
|
--echo === Q15 ===
|
||||||
|
|
||||||
@ -230,7 +288,6 @@ flush table nation;
|
|||||||
eval EXPLAIN EXTENDED $Q20;
|
eval EXPLAIN EXTENDED $Q20;
|
||||||
eval $Q20;
|
eval $Q20;
|
||||||
|
|
||||||
|
|
||||||
DROP DATABASE dbt3_s001;
|
DROP DATABASE dbt3_s001;
|
||||||
|
|
||||||
set histogram_type=@save_histogram_type;
|
set histogram_type=@save_histogram_type;
|
||||||
@ -619,5 +676,36 @@ DROP TABLE t1,t2;
|
|||||||
|
|
||||||
set use_stat_tables=@save_use_stat_tables;
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Bug mdev-4406: range condition for non-nullable column
|
||||||
|
--echo # when optimizer_use_condition_selectivity=3
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
create table t1 (a int not null);
|
||||||
|
insert into t1 values
|
||||||
|
(7), (6), (4), (9), (1), (5), (2), (1), (3), (8);
|
||||||
|
|
||||||
|
set use_stat_tables='preferably';
|
||||||
|
|
||||||
|
analyze table t1;
|
||||||
|
flush table t1;
|
||||||
|
|
||||||
|
set optimizer_use_condition_selectivity=3;
|
||||||
|
|
||||||
|
select count(*) from t1 where a between 5 and 7;
|
||||||
|
explain extended select * from t1 where a between 5 and 7;
|
||||||
|
|
||||||
|
alter table t1 change column a a int;
|
||||||
|
analyze table t1;
|
||||||
|
flush table t1;
|
||||||
|
|
||||||
|
explain extended select * from t1 where a between 5 and 7;
|
||||||
|
|
||||||
|
set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity;
|
||||||
|
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
|
||||||
|
|
||||||
set use_stat_tables=@save_use_stat_tables;
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
@ -564,9 +564,27 @@ SELECT UPPER(db_name), UPPER(table_name),
|
|||||||
index_name, prefix_arity, avg_frequency
|
index_name, prefix_arity, avg_frequency
|
||||||
FROM mysql.index_stats;
|
FROM mysql.index_stats;
|
||||||
|
|
||||||
use test;
|
use world;
|
||||||
|
set use_stat_tables='preferably';
|
||||||
|
--disable_result_log
|
||||||
|
set histogram_size=100;
|
||||||
|
set histogram_type='SINGLE_PREC_HB';
|
||||||
|
ANALYZE TABLE CountryLanguage;
|
||||||
|
set histogram_size=254;
|
||||||
|
set histogram_type='DOUBLE_PREC_HB';
|
||||||
|
ANALYZE TABLE City;
|
||||||
|
FLUSH TABLES;
|
||||||
|
--enable_result_log
|
||||||
|
|
||||||
|
--query_vertical select UPPER(db_name),UPPER(table_name),UPPER(column_name),min_value,max_value,nulls_ratio,avg_length,avg_frequency,hist_size,hist_type,hex(histogram),decode_histogram(histogram,hist_type) from mysql.column_stats where UPPER(db_name)='WORLD' and UPPER(table_name)='COUNTRYLANGUAGE' and UPPER(column_name) = 'PERCENTAGE';
|
||||||
|
--query_vertical select UPPER(db_name),UPPER(table_name),UPPER(column_name),min_value,max_value,nulls_ratio,avg_length,avg_frequency,hist_size,hist_type,hex(histogram),decode_histogram(histogram,hist_type) from mysql.column_stats where UPPER(db_name)='WORLD' and UPPER(table_name)='CITY' and UPPER(column_name) = 'POPULATION';
|
||||||
|
|
||||||
|
set histogram_type=default;
|
||||||
|
set histogram_size=default;
|
||||||
|
|
||||||
|
use test;
|
||||||
DROP DATABASE world;
|
DROP DATABASE world;
|
||||||
|
|
||||||
SELECT UPPER(db_name), UPPER(table_name), cardinality
|
SELECT UPPER(db_name), UPPER(table_name), cardinality
|
||||||
FROM mysql.table_stats;
|
FROM mysql.table_stats;
|
||||||
SELECT UPPER(db_name), UPPER(table_name),
|
SELECT UPPER(db_name), UPPER(table_name),
|
||||||
|
15
sql/item.h
15
sql/item.h
@ -548,6 +548,14 @@ typedef bool (Item::*Item_analyzer) (uchar **argp);
|
|||||||
typedef Item* (Item::*Item_transformer) (uchar *arg);
|
typedef Item* (Item::*Item_transformer) (uchar *arg);
|
||||||
typedef void (*Cond_traverser) (const Item *item, void *arg);
|
typedef void (*Cond_traverser) (const Item *item, void *arg);
|
||||||
|
|
||||||
|
struct st_cond_statistic;
|
||||||
|
|
||||||
|
struct find_selective_predicates_list_processor_data
|
||||||
|
{
|
||||||
|
TABLE *table;
|
||||||
|
List<st_cond_statistic> list;
|
||||||
|
};
|
||||||
|
|
||||||
class Item_equal;
|
class Item_equal;
|
||||||
class COND_EQUAL;
|
class COND_EQUAL;
|
||||||
|
|
||||||
@ -1108,6 +1116,11 @@ public:
|
|||||||
return (this->*processor)(arg);
|
return (this->*processor)(arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual bool walk_top_and(Item_processor processor, uchar *arg)
|
||||||
|
{
|
||||||
|
return (this->*processor)(arg);
|
||||||
|
}
|
||||||
|
|
||||||
virtual Item* transform(Item_transformer transformer, uchar *arg);
|
virtual Item* transform(Item_transformer transformer, uchar *arg);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1174,6 +1187,8 @@ public:
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
virtual bool exists2in_processor(uchar *opt_arg) { return 0; }
|
virtual bool exists2in_processor(uchar *opt_arg) { return 0; }
|
||||||
|
virtual bool find_selective_predicates_list_processor(uchar *opt_arg)
|
||||||
|
{ return 0; }
|
||||||
|
|
||||||
/* To call bool function for all arguments */
|
/* To call bool function for all arguments */
|
||||||
struct bool_func_call_args
|
struct bool_func_call_args
|
||||||
|
@ -4428,6 +4428,16 @@ bool Item_cond::walk(Item_processor processor, bool walk_subquery, uchar *arg)
|
|||||||
return Item_func::walk(processor, walk_subquery, arg);
|
return Item_func::walk(processor, walk_subquery, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Item_cond_and::walk_top_and(Item_processor processor, uchar *arg)
|
||||||
|
{
|
||||||
|
List_iterator_fast<Item> li(list);
|
||||||
|
Item *item;
|
||||||
|
while ((item= li++))
|
||||||
|
if (item->walk_top_and(processor, arg))
|
||||||
|
return 1;
|
||||||
|
return Item_cond::walk_top_and(processor, arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Transform an Item_cond object with a transformer callback function.
|
Transform an Item_cond object with a transformer callback function.
|
||||||
@ -4940,6 +4950,7 @@ bool Item_func_like::fix_fields(THD *thd, Item **ref)
|
|||||||
turboBM_compute_bad_character_shifts();
|
turboBM_compute_bad_character_shifts();
|
||||||
DBUG_PRINT("info",("done"));
|
DBUG_PRINT("info",("done"));
|
||||||
}
|
}
|
||||||
|
use_sampling= ((*first == wild_many || *first == wild_one) && len > 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -4951,6 +4962,28 @@ void Item_func_like::cleanup()
|
|||||||
Item_bool_func2::cleanup();
|
Item_bool_func2::cleanup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Item_func_like::find_selective_predicates_list_processor(uchar *arg)
|
||||||
|
{
|
||||||
|
find_selective_predicates_list_processor_data *data=
|
||||||
|
(find_selective_predicates_list_processor_data *) arg;
|
||||||
|
if (use_sampling && used_tables() == data->table->map)
|
||||||
|
{
|
||||||
|
COND_STATISTIC *stat= (COND_STATISTIC *)sql_alloc(sizeof(COND_STATISTIC));
|
||||||
|
if (!stat)
|
||||||
|
return TRUE;
|
||||||
|
stat->cond= this;
|
||||||
|
Item *arg0= args[0]->real_item();
|
||||||
|
if (args[1]->const_item() && arg0->type() == FIELD_ITEM)
|
||||||
|
stat->field_arg= ((Item_field *)arg0)->field;
|
||||||
|
else
|
||||||
|
stat->field_arg= NULL;
|
||||||
|
data->list.push_back(stat);
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief Compile regular expression.
|
@brief Compile regular expression.
|
||||||
|
|
||||||
|
@ -1489,6 +1489,7 @@ class Item_func_like :public Item_bool_func2
|
|||||||
Item *escape_item;
|
Item *escape_item;
|
||||||
|
|
||||||
bool escape_used_in_parsing;
|
bool escape_used_in_parsing;
|
||||||
|
bool use_sampling;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
int escape;
|
int escape;
|
||||||
@ -1496,7 +1497,7 @@ public:
|
|||||||
Item_func_like(Item *a,Item *b, Item *escape_arg, bool escape_used)
|
Item_func_like(Item *a,Item *b, Item *escape_arg, bool escape_used)
|
||||||
:Item_bool_func2(a,b), canDoTurboBM(FALSE), pattern(0), pattern_len(0),
|
:Item_bool_func2(a,b), canDoTurboBM(FALSE), pattern(0), pattern_len(0),
|
||||||
bmGs(0), bmBc(0), escape_item(escape_arg),
|
bmGs(0), bmBc(0), escape_item(escape_arg),
|
||||||
escape_used_in_parsing(escape_used) {}
|
escape_used_in_parsing(escape_used), use_sampling(0) {}
|
||||||
longlong val_int();
|
longlong val_int();
|
||||||
enum Functype functype() const { return LIKE_FUNC; }
|
enum Functype functype() const { return LIKE_FUNC; }
|
||||||
optimize_type select_optimize() const;
|
optimize_type select_optimize() const;
|
||||||
@ -1504,6 +1505,8 @@ public:
|
|||||||
const char *func_name() const { return "like"; }
|
const char *func_name() const { return "like"; }
|
||||||
bool fix_fields(THD *thd, Item **ref);
|
bool fix_fields(THD *thd, Item **ref);
|
||||||
void cleanup();
|
void cleanup();
|
||||||
|
|
||||||
|
bool find_selective_predicates_list_processor(uchar *arg);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -1914,6 +1917,7 @@ public:
|
|||||||
Item *neg_transformer(THD *thd);
|
Item *neg_transformer(THD *thd);
|
||||||
void mark_as_condition_AND_part(TABLE_LIST *embedding);
|
void mark_as_condition_AND_part(TABLE_LIST *embedding);
|
||||||
virtual uint exists2in_reserved_items() { return list.elements; };
|
virtual uint exists2in_reserved_items() { return list.elements; };
|
||||||
|
bool walk_top_and(Item_processor processor, uchar *arg);
|
||||||
};
|
};
|
||||||
|
|
||||||
inline bool is_cond_and(Item *item)
|
inline bool is_cond_and(Item *item)
|
||||||
|
@ -614,6 +614,19 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class Create_func_decode_histogram : public Create_func_arg2
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Item *create_2_arg(THD *thd, Item *arg1, Item *arg2);
|
||||||
|
|
||||||
|
static Create_func_decode_histogram s_singleton;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Create_func_decode_histogram() {}
|
||||||
|
virtual ~Create_func_decode_histogram() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
class Create_func_concat_ws : public Create_native_func
|
class Create_func_concat_ws : public Create_native_func
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -3231,6 +3244,13 @@ Create_func_concat::create_native(THD *thd, LEX_STRING name,
|
|||||||
return new (thd->mem_root) Item_func_concat(*item_list);
|
return new (thd->mem_root) Item_func_concat(*item_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Create_func_decode_histogram Create_func_decode_histogram::s_singleton;
|
||||||
|
|
||||||
|
Item *
|
||||||
|
Create_func_decode_histogram::create_2_arg(THD *thd, Item *arg1, Item *arg2)
|
||||||
|
{
|
||||||
|
return new (thd->mem_root) Item_func_decode_histogram(arg1, arg2);
|
||||||
|
}
|
||||||
|
|
||||||
Create_func_concat_ws Create_func_concat_ws::s_singleton;
|
Create_func_concat_ws Create_func_concat_ws::s_singleton;
|
||||||
|
|
||||||
@ -5377,6 +5397,7 @@ static Native_func_registry func_array[] =
|
|||||||
{ { C_STRING_WITH_LEN("DAYOFYEAR") }, BUILDER(Create_func_dayofyear)},
|
{ { C_STRING_WITH_LEN("DAYOFYEAR") }, BUILDER(Create_func_dayofyear)},
|
||||||
{ { C_STRING_WITH_LEN("DECODE") }, BUILDER(Create_func_decode)},
|
{ { C_STRING_WITH_LEN("DECODE") }, BUILDER(Create_func_decode)},
|
||||||
{ { C_STRING_WITH_LEN("DEGREES") }, BUILDER(Create_func_degrees)},
|
{ { C_STRING_WITH_LEN("DEGREES") }, BUILDER(Create_func_degrees)},
|
||||||
|
{ { C_STRING_WITH_LEN("DECODE_HISTOGRAM") }, BUILDER(Create_func_decode_histogram)},
|
||||||
{ { C_STRING_WITH_LEN("DES_DECRYPT") }, BUILDER(Create_func_des_decrypt)},
|
{ { C_STRING_WITH_LEN("DES_DECRYPT") }, BUILDER(Create_func_des_decrypt)},
|
||||||
{ { C_STRING_WITH_LEN("DES_ENCRYPT") }, BUILDER(Create_func_des_encrypt)},
|
{ { C_STRING_WITH_LEN("DES_ENCRYPT") }, BUILDER(Create_func_des_encrypt)},
|
||||||
{ { C_STRING_WITH_LEN("DIMENSION") }, GEOM_BUILDER(Create_func_dimension)},
|
{ { C_STRING_WITH_LEN("DIMENSION") }, GEOM_BUILDER(Create_func_dimension)},
|
||||||
|
@ -60,6 +60,7 @@ C_MODE_START
|
|||||||
C_MODE_END
|
C_MODE_END
|
||||||
#include "sql_show.h" // append_identifier
|
#include "sql_show.h" // append_identifier
|
||||||
#include <sql_repl.h>
|
#include <sql_repl.h>
|
||||||
|
#include "sql_statistics.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@todo Remove this. It is not safe to use a shared String object.
|
@todo Remove this. It is not safe to use a shared String object.
|
||||||
@ -471,6 +472,82 @@ void Item_func_aes_decrypt::fix_length_and_dec()
|
|||||||
set_persist_maybe_null(1);
|
set_persist_maybe_null(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
const char *histogram_types[] =
|
||||||
|
{"SINGLE_PREC_HB", "DOUBLE_PREC_HB", 0};
|
||||||
|
static TYPELIB hystorgam_types_typelib=
|
||||||
|
{ array_elements(histogram_types),
|
||||||
|
"histogram_types",
|
||||||
|
histogram_types, NULL};
|
||||||
|
const char *representation_by_type[]= {"%.3f", "%.5f"};
|
||||||
|
|
||||||
|
String *Item_func_decode_histogram::val_str(String *str)
|
||||||
|
{
|
||||||
|
DBUG_ASSERT(fixed == 1);
|
||||||
|
char buff[STRING_BUFFER_USUAL_SIZE];
|
||||||
|
String *res, tmp(buff, sizeof(buff), &my_charset_bin);
|
||||||
|
int type;
|
||||||
|
|
||||||
|
tmp.length(0);
|
||||||
|
if (!(res= args[1]->val_str(&tmp)) ||
|
||||||
|
(type= find_type(res->c_ptr_safe(),
|
||||||
|
&hystorgam_types_typelib, MYF(0))) <= 0)
|
||||||
|
{
|
||||||
|
null_value= 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
type--;
|
||||||
|
|
||||||
|
tmp.length(0);
|
||||||
|
if (!(res= args[0]->val_str(&tmp)))
|
||||||
|
{
|
||||||
|
null_value= 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (type == DOUBLE_PREC_HB && res->length() % 2 != 0)
|
||||||
|
res->length(res->length() - 1); // one byte is unused
|
||||||
|
|
||||||
|
double prev= 0.0;
|
||||||
|
uint i;
|
||||||
|
str->length(0);
|
||||||
|
char numbuf[32];
|
||||||
|
const uchar *p= (uchar*)res->c_ptr();
|
||||||
|
for (i= 0; i < res->length(); i++)
|
||||||
|
{
|
||||||
|
double val;
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case SINGLE_PREC_HB:
|
||||||
|
val= p[i] / ((double)((1 << 8) - 1));
|
||||||
|
break;
|
||||||
|
case DOUBLE_PREC_HB:
|
||||||
|
val= ((uint16 *)(p + i))[0] / ((double)((1 << 16) - 1));
|
||||||
|
i++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
val= 0;
|
||||||
|
DBUG_ASSERT(0);
|
||||||
|
}
|
||||||
|
/* show delta with previous value */
|
||||||
|
int size= my_snprintf(numbuf, sizeof(numbuf),
|
||||||
|
representation_by_type[type], val - prev);
|
||||||
|
str->append(numbuf, size);
|
||||||
|
str->append(",");
|
||||||
|
prev= val;
|
||||||
|
}
|
||||||
|
/* show delta with max */
|
||||||
|
int size= my_snprintf(numbuf, sizeof(numbuf),
|
||||||
|
representation_by_type[type], 1.0 - prev);
|
||||||
|
str->append(numbuf, size);
|
||||||
|
|
||||||
|
null_value=0;
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Concatenate args with the following premises:
|
Concatenate args with the following premises:
|
||||||
|
@ -143,6 +143,22 @@ public:
|
|||||||
const char *func_name() const { return "concat"; }
|
const char *func_name() const { return "concat"; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class Item_func_decode_histogram :public Item_str_func
|
||||||
|
{
|
||||||
|
String tmp_value;
|
||||||
|
public:
|
||||||
|
Item_func_decode_histogram(Item *a, Item *b)
|
||||||
|
:Item_str_func(a, b) {}
|
||||||
|
String *val_str(String *);
|
||||||
|
void fix_length_and_dec()
|
||||||
|
{
|
||||||
|
collation.set(system_charset_info);
|
||||||
|
max_length= MAX_BLOB_WIDTH;
|
||||||
|
set_persist_maybe_null(1);
|
||||||
|
}
|
||||||
|
const char *func_name() const { return "decode_histogram"; }
|
||||||
|
};
|
||||||
|
|
||||||
class Item_func_concat_ws :public Item_str_func
|
class Item_func_concat_ws :public Item_str_func
|
||||||
{
|
{
|
||||||
String tmp_value;
|
String tmp_value;
|
||||||
|
@ -3532,6 +3532,73 @@ bool calculate_cond_selectivity_for_table(THD *thd, TABLE *table, Item *cond)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Calculate selectivity of probably highly selective predicates */
|
||||||
|
ulong check_rows=
|
||||||
|
min(thd->variables.optimizer_selectivity_sampling_limit,
|
||||||
|
(ulong) (table_records * SELECTIVITY_SAMPLING_SHARE));
|
||||||
|
if (cond && check_rows > SELECTIVITY_SAMPLING_THRESHOLD &&
|
||||||
|
thd->variables.optimizer_use_condition_selectivity > 4)
|
||||||
|
{
|
||||||
|
find_selective_predicates_list_processor_data *dt=
|
||||||
|
(find_selective_predicates_list_processor_data *)
|
||||||
|
alloc_root(thd->mem_root,
|
||||||
|
sizeof(find_selective_predicates_list_processor_data));
|
||||||
|
if (!dt)
|
||||||
|
DBUG_RETURN(TRUE);
|
||||||
|
dt->list.empty();
|
||||||
|
dt->table= table;
|
||||||
|
if (cond->walk(&Item::find_selective_predicates_list_processor, 0,
|
||||||
|
(uchar*) dt))
|
||||||
|
DBUG_RETURN(TRUE);
|
||||||
|
if (dt->list.elements > 0)
|
||||||
|
{
|
||||||
|
check_rows= check_selectivity(thd, check_rows, table, &dt->list);
|
||||||
|
if (check_rows > SELECTIVITY_SAMPLING_THRESHOLD)
|
||||||
|
{
|
||||||
|
COND_STATISTIC *stat;
|
||||||
|
List_iterator_fast<COND_STATISTIC> it(dt->list);
|
||||||
|
double examined_rows= check_rows;
|
||||||
|
while ((stat= it++))
|
||||||
|
{
|
||||||
|
if (!stat->positive)
|
||||||
|
{
|
||||||
|
DBUG_PRINT("info", ("To avoid 0 assigned 1 to the counter"));
|
||||||
|
stat->positive= 1; // avoid 0
|
||||||
|
}
|
||||||
|
DBUG_PRINT("info", ("The predicate selectivity : %g",
|
||||||
|
(double)stat->positive / examined_rows));
|
||||||
|
double selectivity= ((double)stat->positive) / examined_rows;
|
||||||
|
table->cond_selectivity*= selectivity;
|
||||||
|
/*
|
||||||
|
If a field is involved then we register its selectivity in case
|
||||||
|
there in an equality with the field.
|
||||||
|
For example in case
|
||||||
|
t1.a LIKE "%bla%" and t1.a = t2.b
|
||||||
|
the selectivity we have found could be used also for t2.
|
||||||
|
*/
|
||||||
|
if (stat->field_arg)
|
||||||
|
{
|
||||||
|
stat->field_arg->cond_selectivity*= selectivity;
|
||||||
|
|
||||||
|
if (stat->field_arg->next_equal_field)
|
||||||
|
{
|
||||||
|
for (Field *next_field= stat->field_arg->next_equal_field;
|
||||||
|
next_field != stat->field_arg;
|
||||||
|
next_field= next_field->next_equal_field)
|
||||||
|
{
|
||||||
|
next_field->cond_selectivity*= selectivity;
|
||||||
|
next_field->table->cond_selectivity*= selectivity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
/* This list and its elements put to mem_root so should not be freed */
|
||||||
|
table->cond_selectivity_sampling_explain= &dt->list;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
DBUG_RETURN(FALSE);
|
DBUG_RETURN(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1051,4 +1051,11 @@ void store_key_image_to_rec(Field *field, uchar *ptr, uint len);
|
|||||||
|
|
||||||
extern String null_string;
|
extern String null_string;
|
||||||
|
|
||||||
|
/* check this number of rows (default value) */
|
||||||
|
#define SELECTIVITY_SAMPLING_LIMIT 100
|
||||||
|
/* but no more then this part of table (10%) */
|
||||||
|
#define SELECTIVITY_SAMPLING_SHARE 0.10
|
||||||
|
/* do not check if we are going check less then this number of records */
|
||||||
|
#define SELECTIVITY_SAMPLING_THRESHOLD 10
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -517,6 +517,7 @@ typedef struct system_variables
|
|||||||
ulong net_write_timeout;
|
ulong net_write_timeout;
|
||||||
ulong optimizer_prune_level;
|
ulong optimizer_prune_level;
|
||||||
ulong optimizer_search_depth;
|
ulong optimizer_search_depth;
|
||||||
|
ulong optimizer_selectivity_sampling_limit;
|
||||||
ulong optimizer_use_condition_selectivity;
|
ulong optimizer_use_condition_selectivity;
|
||||||
ulong use_stat_tables;
|
ulong use_stat_tables;
|
||||||
ulong histogram_size;
|
ulong histogram_size;
|
||||||
|
@ -23935,6 +23935,78 @@ uint get_index_for_order(ORDER *order, TABLE *table, SQL_SELECT *select,
|
|||||||
return MAX_KEY;
|
return MAX_KEY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Count how much times conditions are true for several first rows of the table
|
||||||
|
|
||||||
|
@param thd thread handle
|
||||||
|
@param rows_to_read how much rows to check
|
||||||
|
@param table table which should be checked
|
||||||
|
@conds conds list of conditions and countars for them
|
||||||
|
|
||||||
|
@return number of really checked rows or 0 in case of error or empty table
|
||||||
|
*/
|
||||||
|
|
||||||
|
ulong check_selectivity(THD *thd,
|
||||||
|
ulong rows_to_read,
|
||||||
|
TABLE *table,
|
||||||
|
List<COND_STATISTIC> *conds)
|
||||||
|
{
|
||||||
|
ulong count= 0;
|
||||||
|
COND_STATISTIC *cond;
|
||||||
|
List_iterator_fast<COND_STATISTIC> it(*conds);
|
||||||
|
handler *file= table->file;
|
||||||
|
uchar *record= table->record[0];
|
||||||
|
int error= 0;
|
||||||
|
DBUG_ENTER("check_selectivity");
|
||||||
|
|
||||||
|
DBUG_ASSERT(rows_to_read > 0);
|
||||||
|
while ((cond= it++))
|
||||||
|
{
|
||||||
|
DBUG_ASSERT(cond->cond);
|
||||||
|
DBUG_ASSERT(cond->cond->used_tables() == table->map);
|
||||||
|
cond->positive= 0;
|
||||||
|
}
|
||||||
|
it.rewind();
|
||||||
|
|
||||||
|
if (file->ha_rnd_init_with_error(1))
|
||||||
|
DBUG_RETURN(0);
|
||||||
|
do
|
||||||
|
{
|
||||||
|
error= file->ha_rnd_next(record);
|
||||||
|
|
||||||
|
if (thd->killed)
|
||||||
|
{
|
||||||
|
thd->send_kill_message();
|
||||||
|
count= 0;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
if (error == HA_ERR_RECORD_DELETED)
|
||||||
|
continue;
|
||||||
|
if (error == HA_ERR_END_OF_FILE)
|
||||||
|
break;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
count++;
|
||||||
|
while ((cond= it++))
|
||||||
|
{
|
||||||
|
if (cond->cond->val_bool())
|
||||||
|
cond->positive++;
|
||||||
|
}
|
||||||
|
it.rewind();
|
||||||
|
|
||||||
|
} while (count < rows_to_read);
|
||||||
|
|
||||||
|
file->ha_rnd_end();
|
||||||
|
DBUG_RETURN(count);
|
||||||
|
|
||||||
|
err:
|
||||||
|
DBUG_PRINT("error", ("error %d", error));
|
||||||
|
file->ha_rnd_end();
|
||||||
|
DBUG_RETURN(0);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@} (end of group Query_Optimizer)
|
@} (end of group Query_Optimizer)
|
||||||
|
@ -1846,4 +1846,17 @@ void setup_tmp_table_column_bitmaps(TABLE *table, uchar *bitmaps);
|
|||||||
double prev_record_reads(POSITION *positions, uint idx, table_map found_ref);
|
double prev_record_reads(POSITION *positions, uint idx, table_map found_ref);
|
||||||
void fix_list_after_tbl_changes(SELECT_LEX *new_parent, List<TABLE_LIST> *tlist);
|
void fix_list_after_tbl_changes(SELECT_LEX *new_parent, List<TABLE_LIST> *tlist);
|
||||||
|
|
||||||
|
struct st_cond_statistic
|
||||||
|
{
|
||||||
|
Item *cond;
|
||||||
|
Field *field_arg;
|
||||||
|
ulong positive;
|
||||||
|
};
|
||||||
|
typedef struct st_cond_statistic COND_STATISTIC;
|
||||||
|
|
||||||
|
ulong check_selectivity(THD *thd,
|
||||||
|
ulong rows_to_read,
|
||||||
|
TABLE *table,
|
||||||
|
List<COND_STATISTIC> *conds);
|
||||||
|
|
||||||
#endif /* SQL_SELECT_INCLUDED */
|
#endif /* SQL_SELECT_INCLUDED */
|
||||||
|
@ -3520,7 +3520,7 @@ double get_column_range_cardinality(Field *field,
|
|||||||
{
|
{
|
||||||
double sel, min_mp_pos, max_mp_pos;
|
double sel, min_mp_pos, max_mp_pos;
|
||||||
|
|
||||||
if (min_endp && !min_endp->key[0])
|
if (min_endp && !(field->null_ptr && min_endp->key[0]))
|
||||||
{
|
{
|
||||||
store_key_image_to_rec(field, (uchar *) min_endp->key,
|
store_key_image_to_rec(field, (uchar *) min_endp->key,
|
||||||
min_endp->length);
|
min_endp->length);
|
||||||
|
@ -59,6 +59,7 @@
|
|||||||
#endif /* WITH_PERFSCHEMA_STORAGE_ENGINE */
|
#endif /* WITH_PERFSCHEMA_STORAGE_ENGINE */
|
||||||
#include "threadpool.h"
|
#include "threadpool.h"
|
||||||
#include "sql_repl.h"
|
#include "sql_repl.h"
|
||||||
|
#include "opt_range.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The rule for this file: everything should be 'static'. When a sys_var
|
The rule for this file: everything should be 'static'. When a sys_var
|
||||||
@ -1663,6 +1664,14 @@ static Sys_var_ulong Sys_optimizer_prune_level(
|
|||||||
SESSION_VAR(optimizer_prune_level), CMD_LINE(REQUIRED_ARG),
|
SESSION_VAR(optimizer_prune_level), CMD_LINE(REQUIRED_ARG),
|
||||||
VALID_RANGE(0, 1), DEFAULT(1), BLOCK_SIZE(1));
|
VALID_RANGE(0, 1), DEFAULT(1), BLOCK_SIZE(1));
|
||||||
|
|
||||||
|
static Sys_var_ulong Sys_optimizer_selectivity_sampling_limit(
|
||||||
|
"optimizer_selectivity_sampling_limit",
|
||||||
|
"Controls number of record samples to check condition selectivity",
|
||||||
|
SESSION_VAR(optimizer_selectivity_sampling_limit),
|
||||||
|
CMD_LINE(REQUIRED_ARG),
|
||||||
|
VALID_RANGE(SELECTIVITY_SAMPLING_THRESHOLD, UINT_MAX),
|
||||||
|
DEFAULT(SELECTIVITY_SAMPLING_LIMIT), BLOCK_SIZE(1));
|
||||||
|
|
||||||
static Sys_var_ulong Sys_optimizer_use_condition_selectivity(
|
static Sys_var_ulong Sys_optimizer_use_condition_selectivity(
|
||||||
"optimizer_use_condition_selectivity",
|
"optimizer_use_condition_selectivity",
|
||||||
"Controls selectivity of which conditions the optimizer takes into "
|
"Controls selectivity of which conditions the optimizer takes into "
|
||||||
@ -1678,9 +1687,11 @@ static Sys_var_ulong Sys_optimizer_use_condition_selectivity(
|
|||||||
"not backed by any index to calculate the cardinality of a partial join, "
|
"not backed by any index to calculate the cardinality of a partial join, "
|
||||||
"4 - use histograms to calculate selectivity of range conditions that "
|
"4 - use histograms to calculate selectivity of range conditions that "
|
||||||
"are not backed by any index to calculate the cardinality of "
|
"are not backed by any index to calculate the cardinality of "
|
||||||
"a partial join.",
|
"a partial join."
|
||||||
|
"5 - additionally use selectivity of certain non-range predicates "
|
||||||
|
"calculated on record samples",
|
||||||
SESSION_VAR(optimizer_use_condition_selectivity), CMD_LINE(REQUIRED_ARG),
|
SESSION_VAR(optimizer_use_condition_selectivity), CMD_LINE(REQUIRED_ARG),
|
||||||
VALID_RANGE(1, 4), DEFAULT(1), BLOCK_SIZE(1));
|
VALID_RANGE(1, 5), DEFAULT(1), BLOCK_SIZE(1));
|
||||||
|
|
||||||
/** Warns about deprecated value 63 */
|
/** Warns about deprecated value 63 */
|
||||||
static bool fix_optimizer_search_depth(sys_var *self, THD *thd,
|
static bool fix_optimizer_search_depth(sys_var *self, THD *thd,
|
||||||
@ -4138,8 +4149,7 @@ static Sys_var_ulong Sys_histogram_size(
|
|||||||
SESSION_VAR(histogram_size), CMD_LINE(REQUIRED_ARG),
|
SESSION_VAR(histogram_size), CMD_LINE(REQUIRED_ARG),
|
||||||
VALID_RANGE(0, 255), DEFAULT(0), BLOCK_SIZE(1));
|
VALID_RANGE(0, 255), DEFAULT(0), BLOCK_SIZE(1));
|
||||||
|
|
||||||
const char *histogram_types[] =
|
extern const char *histogram_types[];
|
||||||
{"SINGLE_PREC_HB", "DOUBLE_PREC_HB", 0};
|
|
||||||
static Sys_var_enum Sys_histogram_type(
|
static Sys_var_enum Sys_histogram_type(
|
||||||
"histogram_type",
|
"histogram_type",
|
||||||
"Specifies type of the histograms created by ANALYZE. "
|
"Specifies type of the histograms created by ANALYZE. "
|
||||||
|
@ -3891,6 +3891,7 @@ void TABLE::init(THD *thd, TABLE_LIST *tl)
|
|||||||
reginfo.impossible_range= 0;
|
reginfo.impossible_range= 0;
|
||||||
created= TRUE;
|
created= TRUE;
|
||||||
cond_selectivity= 1.0;
|
cond_selectivity= 1.0;
|
||||||
|
cond_selectivity_sampling_explain= NULL;
|
||||||
|
|
||||||
/* Catch wrong handling of the auto_increment_field_not_null. */
|
/* Catch wrong handling of the auto_increment_field_not_null. */
|
||||||
DBUG_ASSERT(!auto_increment_field_not_null);
|
DBUG_ASSERT(!auto_increment_field_not_null);
|
||||||
|
@ -1038,6 +1038,8 @@ enum index_hint_type
|
|||||||
INDEX_HINT_FORCE
|
INDEX_HINT_FORCE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct st_cond_statistic;
|
||||||
|
|
||||||
#define CHECK_ROW_FOR_NULLS_TO_REJECT (1 << 0)
|
#define CHECK_ROW_FOR_NULLS_TO_REJECT (1 << 0)
|
||||||
#define REJECT_ROW_DUE_TO_NULL_FIELDS (1 << 1)
|
#define REJECT_ROW_DUE_TO_NULL_FIELDS (1 << 1)
|
||||||
|
|
||||||
@ -1163,6 +1165,7 @@ public:
|
|||||||
ha_rows quick_condition_rows;
|
ha_rows quick_condition_rows;
|
||||||
|
|
||||||
double cond_selectivity;
|
double cond_selectivity;
|
||||||
|
List<st_cond_statistic> *cond_selectivity_sampling_explain;
|
||||||
|
|
||||||
table_map map; /* ID bit of table (1,2,4,8,16...) */
|
table_map map; /* ID bit of table (1,2,4,8,16...) */
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user