mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 15:50:51 +03:00 
			
		
		
		
	RENAME TABLE code tries to update EITS statistics. It hung, because it used an index on (db_name,table_name) to find the table, and attempted to update these values at the same time. The fix is do what SQL UPDATE statement does when updating index that it's used for scanning: - First, buffer the rowids of rows to be updated, - then make the second pass to actually update the rows Also fixed the call to rename_table_in_stat_tables() in sql_rename.cc to pass the correct new database (before, it passed old db_name so cross- database renames were not handled correctly). Variant #2, with review feedback addressed.
		
			
				
	
	
		
			520 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			520 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| select @@global.use_stat_tables;
 | |
| @@global.use_stat_tables
 | |
| COMPLEMENTARY
 | |
| select @@session.use_stat_tables;
 | |
| @@session.use_stat_tables
 | |
| COMPLEMENTARY
 | |
| set @save_use_stat_tables=@@use_stat_tables;
 | |
| set use_stat_tables='preferably';
 | |
| DROP DATABASE IF EXISTS dbt3_s001;
 | |
| CREATE DATABASE dbt3_s001;
 | |
| use dbt3_s001;
 | |
| set @save_optimizer_switch=@@optimizer_switch;
 | |
| set optimizer_switch='extended_keys=off';
 | |
| select * from mysql.table_stats;
 | |
| db_name	table_name	cardinality
 | |
| dbt3_s001	customer	150
 | |
| dbt3_s001	lineitem	6005
 | |
| dbt3_s001	nation	25
 | |
| dbt3_s001	orders	1500
 | |
| dbt3_s001	part	200
 | |
| dbt3_s001	partsupp	700
 | |
| dbt3_s001	region	5
 | |
| dbt3_s001	supplier	10
 | |
| select * from mysql.index_stats;
 | |
| db_name	table_name	index_name	prefix_arity	avg_frequency
 | |
| dbt3_s001	customer	PRIMARY	1	1.0000
 | |
| dbt3_s001	customer	i_c_nationkey	1	6.0000
 | |
| dbt3_s001	lineitem	PRIMARY	1	4.0033
 | |
| dbt3_s001	lineitem	PRIMARY	2	1.0000
 | |
| dbt3_s001	lineitem	i_l_shipdate	1	2.6500
 | |
| dbt3_s001	lineitem	i_l_suppkey_partkey	1	30.0250
 | |
| dbt3_s001	lineitem	i_l_suppkey_partkey	2	8.5786
 | |
| dbt3_s001	lineitem	i_l_partkey	1	30.0250
 | |
| dbt3_s001	lineitem	i_l_suppkey	1	600.5000
 | |
| dbt3_s001	lineitem	i_l_receiptdate	1	2.6477
 | |
| dbt3_s001	lineitem	i_l_orderkey	1	4.0033
 | |
| dbt3_s001	lineitem	i_l_orderkey_quantity	1	4.0033
 | |
| dbt3_s001	lineitem	i_l_orderkey_quantity	2	1.0404
 | |
| dbt3_s001	lineitem	i_l_commitdate	1	2.7160
 | |
| dbt3_s001	nation	PRIMARY	1	1.0000
 | |
| dbt3_s001	nation	i_n_regionkey	1	5.0000
 | |
| dbt3_s001	orders	PRIMARY	1	1.0000
 | |
| dbt3_s001	orders	i_o_orderdate	1	1.3321
 | |
| dbt3_s001	orders	i_o_custkey	1	15.0000
 | |
| dbt3_s001	part	PRIMARY	1	1.0000
 | |
| dbt3_s001	part	i_p_retailprice	1	1.0000
 | |
| dbt3_s001	partsupp	PRIMARY	1	3.5000
 | |
| dbt3_s001	partsupp	PRIMARY	2	1.0000
 | |
| dbt3_s001	partsupp	i_ps_partkey	1	3.5000
 | |
| dbt3_s001	partsupp	i_ps_suppkey	1	70.0000
 | |
| dbt3_s001	region	PRIMARY	1	1.0000
 | |
| dbt3_s001	supplier	PRIMARY	1	1.0000
 | |
| dbt3_s001	supplier	i_s_nationkey	1	1.1111
 | |
| set optimizer_switch=@save_optimizer_switch;
 | |
| set @save_optimizer_switch=@@optimizer_switch;
 | |
| set optimizer_switch='index_condition_pushdown=off';
 | |
| EXPLAIN select n_name, sum(l_extendedprice * (1 - l_discount)) as revenue
 | |
| from customer, orders, lineitem, supplier, nation, region
 | |
| where c_custkey = o_custkey and l_orderkey = o_orderkey
 | |
| and l_suppkey = s_suppkey and c_nationkey = s_nationkey
 | |
| and s_nationkey = n_nationkey and n_regionkey = r_regionkey
 | |
| and r_name = 'AMERICA' and o_orderdate >= date '1995-01-01'
 | |
|       and o_orderdate < date '1995-01-01' + interval '1' year
 | |
| group by n_name
 | |
| order by revenue desc;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	orders	range	PRIMARY,i_o_orderdate,i_o_custkey	i_o_orderdate	4	NULL	179	Using where; Using temporary; Using filesort
 | |
| 1	SIMPLE	customer	eq_ref	PRIMARY,i_c_nationkey	PRIMARY	4	dbt3_s001.orders.o_custkey	1	Using where
 | |
| 1	SIMPLE	nation	eq_ref	PRIMARY,i_n_regionkey	PRIMARY	4	dbt3_s001.customer.c_nationkey	1	
 | |
| 1	SIMPLE	region	ALL	PRIMARY	NULL	NULL	NULL	5	Using where; Using join buffer (flat, BNL join)
 | |
| 1	SIMPLE	lineitem	ref	PRIMARY,i_l_suppkey,i_l_orderkey,i_l_orderkey_quantity	PRIMARY	4	dbt3_s001.orders.o_orderkey	4	Using where
 | |
| 1	SIMPLE	supplier	eq_ref	PRIMARY,i_s_nationkey	PRIMARY	4	dbt3_s001.lineitem.l_suppkey	1	Using where
 | |
| select n_name, sum(l_extendedprice * (1 - l_discount)) as revenue
 | |
| from customer, orders, lineitem, supplier, nation, region
 | |
| where c_custkey = o_custkey and l_orderkey = o_orderkey
 | |
| and l_suppkey = s_suppkey and c_nationkey = s_nationkey
 | |
| and s_nationkey = n_nationkey and n_regionkey = r_regionkey
 | |
| and r_name = 'AMERICA' and o_orderdate >= date '1995-01-01'
 | |
|       and o_orderdate < date '1995-01-01' + interval '1' year
 | |
| group by n_name
 | |
| order by revenue desc;
 | |
| n_name	revenue
 | |
| PERU	321915.8715
 | |
| ARGENTINA	69817.1451
 | |
| set optimizer_switch=@save_optimizer_switch;
 | |
| delete from mysql.index_stats;
 | |
| select * from mysql.table_stats;
 | |
| db_name	table_name	cardinality
 | |
| dbt3_s001	customer	150
 | |
| dbt3_s001	lineitem	6005
 | |
| dbt3_s001	nation	25
 | |
| dbt3_s001	orders	1500
 | |
| dbt3_s001	part	200
 | |
| dbt3_s001	partsupp	700
 | |
| dbt3_s001	region	5
 | |
| dbt3_s001	supplier	10
 | |
| select * from mysql.index_stats;
 | |
| db_name	table_name	index_name	prefix_arity	avg_frequency
 | |
| dbt3_s001	customer	PRIMARY	1	1.0000
 | |
| dbt3_s001	customer	i_c_nationkey	1	6.0000
 | |
| dbt3_s001	lineitem	PRIMARY	1	4.0033
 | |
| dbt3_s001	lineitem	PRIMARY	2	1.0000
 | |
| dbt3_s001	lineitem	i_l_shipdate	1	2.6500
 | |
| dbt3_s001	lineitem	i_l_suppkey_partkey	1	30.0250
 | |
| dbt3_s001	lineitem	i_l_suppkey_partkey	2	8.5786
 | |
| dbt3_s001	lineitem	i_l_partkey	1	30.0250
 | |
| dbt3_s001	lineitem	i_l_suppkey	1	600.5000
 | |
| dbt3_s001	lineitem	i_l_receiptdate	1	2.6477
 | |
| dbt3_s001	lineitem	i_l_orderkey	1	4.0033
 | |
| dbt3_s001	lineitem	i_l_orderkey_quantity	1	4.0033
 | |
| dbt3_s001	lineitem	i_l_orderkey_quantity	2	1.0404
 | |
| dbt3_s001	lineitem	i_l_commitdate	1	2.7160
 | |
| dbt3_s001	nation	PRIMARY	1	1.0000
 | |
| dbt3_s001	nation	i_n_regionkey	1	5.0000
 | |
| dbt3_s001	orders	PRIMARY	1	1.0000
 | |
| dbt3_s001	orders	i_o_orderdate	1	1.3321
 | |
| dbt3_s001	orders	i_o_custkey	1	15.0000
 | |
| dbt3_s001	part	PRIMARY	1	1.0000
 | |
| dbt3_s001	part	i_p_retailprice	1	1.0000
 | |
| dbt3_s001	partsupp	PRIMARY	1	3.5000
 | |
| dbt3_s001	partsupp	PRIMARY	2	1.0000
 | |
| dbt3_s001	partsupp	i_ps_partkey	1	3.5000
 | |
| dbt3_s001	partsupp	i_ps_suppkey	1	70.0000
 | |
| dbt3_s001	region	PRIMARY	1	1.0000
 | |
| dbt3_s001	supplier	PRIMARY	1	1.0000
 | |
| dbt3_s001	supplier	i_s_nationkey	1	1.1111
 | |
| select * from mysql.table_stats where table_name='orders';
 | |
| db_name	table_name	cardinality
 | |
| dbt3_s001	orders	1500
 | |
| select * from mysql.index_stats where table_name='orders';
 | |
| db_name	table_name	index_name	prefix_arity	avg_frequency
 | |
| dbt3_s001	orders	PRIMARY	1	1.0000
 | |
| dbt3_s001	orders	i_o_orderdate	1	1.3321
 | |
| dbt3_s001	orders	i_o_custkey	1	15.0000
 | |
| select (select cardinality from mysql.table_stats where table_name='orders') /
 | |
| (select avg_frequency from mysql.index_stats 
 | |
| where index_name='i_o_orderdate' and prefix_arity=1) as n_distinct;
 | |
| n_distinct
 | |
| 1126.0416
 | |
| select count(distinct o_orderdate) from orders;
 | |
| count(distinct o_orderdate)
 | |
| 1126
 | |
| select (select cardinality from mysql.table_stats where table_name='orders') /
 | |
| (select avg_frequency from mysql.index_stats 
 | |
| where index_name='i_o_custkey' and prefix_arity=1) as n_distinct;
 | |
| n_distinct
 | |
| 100.0000
 | |
| select count(distinct o_custkey) from orders;
 | |
| count(distinct o_custkey)
 | |
| 100
 | |
| show index from orders;
 | |
| Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment	Index_comment
 | |
| orders	0	PRIMARY	1	o_orderkey	A	1500	NULL	NULL		BTREE		
 | |
| orders	1	i_o_orderdate	1	o_orderDATE	A	1126	NULL	NULL	YES	BTREE		
 | |
| orders	1	i_o_custkey	1	o_custkey	A	100	NULL	NULL	YES	BTREE		
 | |
| select index_name, column_name, cardinality from information_schema.statistics
 | |
| where table_name='orders';
 | |
| index_name	column_name	cardinality
 | |
| PRIMARY	o_orderkey	1500
 | |
| i_o_orderdate	o_orderDATE	1126
 | |
| i_o_custkey	o_custkey	100
 | |
| set @save_optimizer_switch=@@optimizer_switch;
 | |
| set optimizer_switch='index_condition_pushdown=off';
 | |
| EXPLAIN select n_name, sum(l_extendedprice * (1 - l_discount)) as revenue
 | |
| from customer, orders, lineitem, supplier, nation, region
 | |
| where c_custkey = o_custkey and l_orderkey = o_orderkey
 | |
| and l_suppkey = s_suppkey and c_nationkey = s_nationkey
 | |
| and s_nationkey = n_nationkey and n_regionkey = r_regionkey
 | |
| and r_name = 'AMERICA' and o_orderdate >= date '1995-01-01'
 | |
|       and o_orderdate < date '1995-01-01' + interval '1' year
 | |
| group by n_name
 | |
| order by revenue desc;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	orders	range	PRIMARY,i_o_orderdate,i_o_custkey	i_o_orderdate	4	NULL	179	Using where; Using temporary; Using filesort
 | |
| 1	SIMPLE	customer	eq_ref	PRIMARY,i_c_nationkey	PRIMARY	4	dbt3_s001.orders.o_custkey	1	Using where
 | |
| 1	SIMPLE	nation	eq_ref	PRIMARY,i_n_regionkey	PRIMARY	4	dbt3_s001.customer.c_nationkey	1	
 | |
| 1	SIMPLE	region	ALL	PRIMARY	NULL	NULL	NULL	5	Using where; Using join buffer (flat, BNL join)
 | |
| 1	SIMPLE	lineitem	ref	PRIMARY,i_l_suppkey,i_l_orderkey,i_l_orderkey_quantity	PRIMARY	4	dbt3_s001.orders.o_orderkey	4	Using where
 | |
| 1	SIMPLE	supplier	eq_ref	PRIMARY,i_s_nationkey	PRIMARY	4	dbt3_s001.lineitem.l_suppkey	1	Using where
 | |
| select n_name, sum(l_extendedprice * (1 - l_discount)) as revenue
 | |
| from customer, orders, lineitem, supplier, nation, region
 | |
| where c_custkey = o_custkey and l_orderkey = o_orderkey
 | |
| and l_suppkey = s_suppkey and c_nationkey = s_nationkey
 | |
| and s_nationkey = n_nationkey and n_regionkey = r_regionkey
 | |
| and r_name = 'AMERICA' and o_orderdate >= date '1995-01-01'
 | |
|       and o_orderdate < date '1995-01-01' + interval '1' year
 | |
| group by n_name
 | |
| order by revenue desc;
 | |
| n_name	revenue
 | |
| PERU	321915.8715
 | |
| ARGENTINA	69817.1451
 | |
| set optimizer_switch=@save_optimizer_switch;
 | |
| EXPLAIN select o_year,
 | |
| sum(case when nation = 'UNITED STATES' then volume else 0 end) /
 | |
| sum(volume) as mkt_share
 | |
| from (select extract(year from o_orderdate) as o_year,
 | |
| l_extendedprice * (1-l_discount) as volume, 
 | |
| n2.n_name as nation
 | |
| from part, supplier, lineitem, orders, customer, 
 | |
| nation n1, nation n2, region
 | |
| where p_partkey = l_partkey and s_suppkey = l_suppkey
 | |
| and l_orderkey = o_orderkey and o_custkey = c_custkey
 | |
| and c_nationkey = n1.n_nationkey and n1.n_regionkey = r_regionkey
 | |
| and r_name = 'AMERICA' and s_nationkey = n2.n_nationkey
 | |
| and o_orderdate between date '1995-01-01' and date '1996-12-31'
 | |
|             and p_type = 'STANDARD BRUSHED STEEL' ) as all_nations
 | |
| group by o_year
 | |
| order by o_year;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	orders	ALL	PRIMARY,i_o_orderdate,i_o_custkey	NULL	NULL	NULL	1500	Using where; Using temporary; Using filesort
 | |
| 1	SIMPLE	customer	eq_ref	PRIMARY,i_c_nationkey	PRIMARY	4	dbt3_s001.orders.o_custkey	1	Using where
 | |
| 1	SIMPLE	n1	eq_ref	PRIMARY,i_n_regionkey	PRIMARY	4	dbt3_s001.customer.c_nationkey	1	
 | |
| 1	SIMPLE	region	ALL	PRIMARY	NULL	NULL	NULL	5	Using where; Using join buffer (flat, BNL join)
 | |
| 1	SIMPLE	lineitem	ref	PRIMARY,i_l_suppkey_partkey,i_l_partkey,i_l_suppkey,i_l_orderkey,i_l_orderkey_quantity	PRIMARY	4	dbt3_s001.orders.o_orderkey	4	Using where
 | |
| 1	SIMPLE	part	eq_ref	PRIMARY	PRIMARY	4	dbt3_s001.lineitem.l_partkey	1	Using where
 | |
| 1	SIMPLE	supplier	eq_ref	PRIMARY,i_s_nationkey	PRIMARY	4	dbt3_s001.lineitem.l_suppkey	1	Using where
 | |
| 1	SIMPLE	n2	eq_ref	PRIMARY	PRIMARY	4	dbt3_s001.supplier.s_nationkey	1	
 | |
| select o_year,
 | |
| sum(case when nation = 'UNITED STATES' then volume else 0 end) /
 | |
| sum(volume) as mkt_share
 | |
| from (select extract(year from o_orderdate) as o_year,
 | |
| l_extendedprice * (1-l_discount) as volume, 
 | |
| n2.n_name as nation
 | |
| from part, supplier, lineitem, orders, customer, 
 | |
| nation n1, nation n2, region
 | |
| where p_partkey = l_partkey and s_suppkey = l_suppkey
 | |
| and l_orderkey = o_orderkey and o_custkey = c_custkey
 | |
| and c_nationkey = n1.n_nationkey and n1.n_regionkey = r_regionkey
 | |
| and r_name = 'AMERICA' and s_nationkey = n2.n_nationkey
 | |
| and o_orderdate between date '1995-01-01' and date '1996-12-31'
 | |
|             and p_type = 'STANDARD BRUSHED STEEL' ) as all_nations
 | |
| group by o_year
 | |
| order by o_year;
 | |
| o_year	mkt_share
 | |
| 1995	0.4495521838895718
 | |
| 1996	0.024585468215352495
 | |
| EXPLAIN select nation, o_year, sum(amount) as sum_profit
 | |
| from (select n_name as nation, 
 | |
| extract(year from o_orderdate) as o_year,
 | |
| l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity as amount
 | |
| from part, supplier, lineitem, partsupp, orders, nation
 | |
| where s_suppkey = l_suppkey and ps_suppkey = l_suppkey
 | |
| and ps_partkey = l_partkey and p_partkey = l_partkey
 | |
| and o_orderkey = l_orderkey and s_nationkey = n_nationkey
 | |
| and p_name like '%green%') as profit
 | |
| group by nation, o_year
 | |
| order by nation, o_year desc;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	supplier	ALL	PRIMARY,i_s_nationkey	NULL	NULL	NULL	10	Using where; Using temporary; Using filesort
 | |
| 1	SIMPLE	nation	eq_ref	PRIMARY	PRIMARY	4	dbt3_s001.supplier.s_nationkey	1	
 | |
| 1	SIMPLE	partsupp	ref	PRIMARY,i_ps_partkey,i_ps_suppkey	i_ps_suppkey	4	dbt3_s001.supplier.s_suppkey	70	
 | |
| 1	SIMPLE	part	eq_ref	PRIMARY	PRIMARY	4	dbt3_s001.partsupp.ps_partkey	1	Using where
 | |
| 1	SIMPLE	lineitem	ref	PRIMARY,i_l_suppkey_partkey,i_l_partkey,i_l_suppkey,i_l_orderkey,i_l_orderkey_quantity	i_l_suppkey_partkey	10	dbt3_s001.partsupp.ps_partkey,dbt3_s001.supplier.s_suppkey	8	
 | |
| 1	SIMPLE	orders	eq_ref	PRIMARY	PRIMARY	4	dbt3_s001.lineitem.l_orderkey	1	
 | |
| select nation, o_year, sum(amount) as sum_profit
 | |
| from (select n_name as nation, 
 | |
| extract(year from o_orderdate) as o_year,
 | |
| l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity as amount
 | |
| from part, supplier, lineitem, partsupp, orders, nation
 | |
| where s_suppkey = l_suppkey and ps_suppkey = l_suppkey
 | |
| and ps_partkey = l_partkey and p_partkey = l_partkey
 | |
| and o_orderkey = l_orderkey and s_nationkey = n_nationkey
 | |
| and p_name like '%green%') as profit
 | |
| group by nation, o_year
 | |
| order by nation, o_year desc;
 | |
| nation	o_year	sum_profit
 | |
| ARGENTINA	1997	18247.873399999993
 | |
| ARGENTINA	1996	7731.089399999995
 | |
| ARGENTINA	1995	134490.5697
 | |
| ARGENTINA	1994	36767.101500000004
 | |
| ARGENTINA	1993	35857.08
 | |
| ARGENTINA	1992	35740
 | |
| ETHIOPIA	1998	2758.7801999999992
 | |
| ETHIOPIA	1997	19419.294599999997
 | |
| ETHIOPIA	1995	51231.87439999999
 | |
| ETHIOPIA	1994	3578.9478999999974
 | |
| ETHIOPIA	1992	1525.8234999999986
 | |
| IRAN	1998	37817.229600000006
 | |
| IRAN	1997	52643.77359999999
 | |
| IRAN	1996	70143.7761
 | |
| IRAN	1995	84094.58260000001
 | |
| IRAN	1994	18140.925599999995
 | |
| IRAN	1993	78655.1676
 | |
| IRAN	1992	87142.23960000002
 | |
| IRAQ	1998	22860.8082
 | |
| IRAQ	1997	93676.24359999999
 | |
| IRAQ	1996	45103.3242
 | |
| IRAQ	1994	36010.728599999995
 | |
| IRAQ	1993	33221.9399
 | |
| IRAQ	1992	47755.05900000001
 | |
| KENYA	1998	44194.831999999995
 | |
| KENYA	1997	57578.36259999999
 | |
| KENYA	1996	59195.90210000001
 | |
| KENYA	1995	79262.6278
 | |
| KENYA	1994	102360.66609999999
 | |
| KENYA	1993	128422.0196
 | |
| KENYA	1992	181517.2089
 | |
| MOROCCO	1998	41797.823199999984
 | |
| MOROCCO	1997	23685.801799999994
 | |
| MOROCCO	1996	62115.19579999998
 | |
| MOROCCO	1995	42442.64300000001
 | |
| MOROCCO	1994	48655.878000000004
 | |
| MOROCCO	1993	22926.744400000003
 | |
| MOROCCO	1992	32239.8088
 | |
| PERU	1998	86999.36459999997
 | |
| PERU	1997	121110.41070000001
 | |
| PERU	1996	177040.40759999995
 | |
| PERU	1995	122247.94520000002
 | |
| PERU	1994	88046.25329999998
 | |
| PERU	1993	49379.813799999996
 | |
| PERU	1992	80646.86050000001
 | |
| UNITED KINGDOM	1998	50577.25560000001
 | |
| UNITED KINGDOM	1997	114288.8605
 | |
| UNITED KINGDOM	1996	147684.46480000002
 | |
| UNITED KINGDOM	1995	225267.65759999998
 | |
| UNITED KINGDOM	1994	140595.5864
 | |
| UNITED KINGDOM	1993	322548.49210000003
 | |
| UNITED KINGDOM	1992	67747.88279999999
 | |
| UNITED STATES	1998	3957.0431999999996
 | |
| UNITED STATES	1997	94729.5704
 | |
| UNITED STATES	1996	79297.85670000002
 | |
| UNITED STATES	1995	62201.23360000001
 | |
| UNITED STATES	1994	43075.629899999985
 | |
| UNITED STATES	1993	27168.486199999996
 | |
| UNITED STATES	1992	34092.366
 | |
| set @save_optimizer_switch=@@optimizer_switch;
 | |
| set optimizer_switch='extended_keys=on';
 | |
| EXPLAIN select o_orderkey, p_partkey
 | |
| from part, lineitem, orders
 | |
| where p_retailprice > 1100 and o_orderdate='1997-01-01' 
 | |
| and o_orderkey=l_orderkey and p_partkey=l_partkey;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	orders	ref	PRIMARY,i_o_orderdate	i_o_orderdate	4	const	1	
 | |
| 1	SIMPLE	lineitem	ref	PRIMARY,i_l_suppkey_partkey,i_l_partkey,i_l_orderkey,i_l_orderkey_quantity	PRIMARY	4	dbt3_s001.orders.o_orderkey	4	Using where
 | |
| 1	SIMPLE	part	eq_ref	PRIMARY,i_p_retailprice	PRIMARY	4	dbt3_s001.lineitem.l_partkey	1	Using where
 | |
| select o_orderkey, p_partkey
 | |
| from part, lineitem, orders
 | |
| where p_retailprice > 1100 and o_orderdate='1997-01-01' 
 | |
| and o_orderkey=l_orderkey and p_partkey=l_partkey;
 | |
| o_orderkey	p_partkey
 | |
| 5895	200
 | |
| set optimizer_switch=@save_optimizer_switch;
 | |
| DROP DATABASE dbt3_s001;
 | |
| use test;
 | |
| #
 | |
| # Bug mdev-473: ANALYZE table locked for write
 | |
| # 
 | |
| set use_stat_tables='complementary';
 | |
| create table t1 (i int);
 | |
| lock table t1 write;
 | |
| analyze table t1;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	Table is already up to date
 | |
| alter table t1 add column a varchar(8);
 | |
| drop table t1;
 | |
| #
 | |
| # Bug mdev-487: memory leak in ANALYZE with stat tables
 | |
| # 
 | |
| SET  use_stat_tables = 'preferably';
 | |
| CREATE TABLE t1 (a INT);
 | |
| INSERT INTO t1 VALUES (1),(2);
 | |
| DELETE FROM t1 WHERE a=1;
 | |
| ANALYZE TABLE t1;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| DROP TABLE t1;
 | |
| #
 | |
| # Bug mdev-518: corrupted/missing statistical tables
 | |
| # 
 | |
| CREATE TABLE t1 (i int) ENGINE=MyISAM;
 | |
| INSERT INTO t1 VALUES (1),(2);
 | |
| FLUSH TABLE t1;
 | |
| SET use_stat_tables='never';
 | |
| EXPLAIN SELECT * FROM t1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	2	
 | |
| FLUSH TABLES;
 | |
| SET use_stat_tables='preferably';
 | |
| EXPLAIN SELECT * FROM t1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	2	
 | |
| DROP TABLE t1;
 | |
| set use_stat_tables=@save_use_stat_tables;
 | |
| #
 | |
| # Bug mdev-5204: invalid impossible where after reading const tables  
 | |
| #                when use_stat_tables = 'preferably'
 | |
| #
 | |
| set use_stat_tables = 'preferably';
 | |
| CREATE TABLE t1 (id int PRIMARY KEY) ENGINE=MyISAM;
 | |
| INSERT INTO t1 VALUES (1),(2);
 | |
| ANALYZE TABLE t1;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	analyze	status	Engine-independent statistics collected
 | |
| test.t1	analyze	status	OK
 | |
| CREATE TABLE t2 (name char(3)) ENGINE=MyISAM;
 | |
| ANALYZE TABLE t2;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t2	analyze	status	Engine-independent statistics collected
 | |
| test.t2	analyze	status	Table is already up to date
 | |
| INSERT INTO t2 VALUES ('USA'),('AUS');
 | |
| SELECT * FROM t1 STRAIGHT_JOIN t2 WHERE name IN ( 'AUS','YEM' ) AND id = 1;
 | |
| id	name
 | |
| 1	AUS
 | |
| EXPLAIN
 | |
| SELECT * FROM t1 STRAIGHT_JOIN t2 WHERE name IN ( 'AUS','YEM' ) AND id = 1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	const	PRIMARY	PRIMARY	4	const	1	Using index
 | |
| 1	SIMPLE	t2	ALL	NULL	NULL	NULL	NULL	0	Using where
 | |
| ANALYZE TABLE t2;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t2	analyze	status	Engine-independent statistics collected
 | |
| test.t2	analyze	status	OK
 | |
| SELECT * FROM t1 STRAIGHT_JOIN t2 WHERE name IN ( 'AUS','YEM' ) AND id = 1;
 | |
| id	name
 | |
| 1	AUS
 | |
| EXPLAIN
 | |
| SELECT * FROM t1 STRAIGHT_JOIN t2 WHERE name IN ( 'AUS','YEM' ) AND id = 1;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t1	const	PRIMARY	PRIMARY	4	const	1	Using index
 | |
| 1	SIMPLE	t2	ALL	NULL	NULL	NULL	NULL	2	Using where
 | |
| DROP TABLE t1,t2;
 | |
| #
 | |
| # MDEV-7370: Server deadlocks on renaming a table for which persistent statistics exists
 | |
| #
 | |
| drop database if exists db1;
 | |
| drop database if exists db1;
 | |
| create database db1;
 | |
| create database db2;
 | |
| use db1;
 | |
| #
 | |
| # First, run the original testcase:
 | |
| #
 | |
| create table t1 (i int);
 | |
| insert into t1 values (10),(20);
 | |
| analyze table t1 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| db1.t1	analyze	status	Engine-independent statistics collected
 | |
| db1.t1	analyze	status	OK
 | |
| rename table t1 to db2.t1;
 | |
| # Verify that stats in the old database are gone:
 | |
| select * from mysql.column_stats where db_name='db1' and table_name='t1';
 | |
| db_name	table_name	column_name	min_value	max_value	nulls_ratio	avg_length	avg_frequency	hist_size	hist_type	histogram
 | |
| select * from mysql.table_stats where db_name='db1' and table_name='t1';
 | |
| db_name	table_name	cardinality
 | |
| # Verify that stats are present in the new database:
 | |
| select * from mysql.column_stats where db_name='db2' and table_name='t1';
 | |
| db_name	table_name	column_name	min_value	max_value	nulls_ratio	avg_length	avg_frequency	hist_size	hist_type	histogram
 | |
| db2	t1	i	10	20	0.0000	4.0000	1.0000	0	NULL	NULL
 | |
| select * from mysql.table_stats where db_name='db2' and table_name='t1';
 | |
| db_name	table_name	cardinality
 | |
| db2	t1	2
 | |
| #
 | |
| # Now, try with more than one column and with indexes:
 | |
| #
 | |
| use test;
 | |
| create table t1(a int primary key);
 | |
| insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
 | |
| use db1;
 | |
| create table t2 (a int, b int, c int, key IDX1(a), key IDX2(a,b));
 | |
| insert into t2 select a/10, a/2, a from test.t1;
 | |
| analyze table t2 persistent for all;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| db1.t2	analyze	status	Engine-independent statistics collected
 | |
| db1.t2	analyze	status	Table is already up to date
 | |
| alter table t2 rename db2.t2;
 | |
| # Verify that stats in the old database are gone:
 | |
| select * from mysql.table_stats where db_name='db1' and table_name='t2';
 | |
| db_name	table_name	cardinality
 | |
| select * from mysql.column_stats where db_name='db1' and table_name='t2';
 | |
| db_name	table_name	column_name	min_value	max_value	nulls_ratio	avg_length	avg_frequency	hist_size	hist_type	histogram
 | |
| select * from mysql.index_stats where db_name='db1' and table_name='t2';
 | |
| db_name	table_name	index_name	prefix_arity	avg_frequency
 | |
| # Verify that stats are present in the new database:
 | |
| select * from mysql.table_stats where db_name='db2' and table_name='t2';
 | |
| db_name	table_name	cardinality
 | |
| db2	t2	10
 | |
| select * from mysql.column_stats where db_name='db2' and table_name='t2';
 | |
| db_name	table_name	column_name	min_value	max_value	nulls_ratio	avg_length	avg_frequency	hist_size	hist_type	histogram
 | |
| db2	t2	a	0	1	0.0000	4.0000	5.0000	0	NULL	NULL
 | |
| db2	t2	b	0	5	0.0000	4.0000	1.6667	0	NULL	NULL
 | |
| db2	t2	c	0	9	0.0000	4.0000	1.0000	0	NULL	NULL
 | |
| select * from mysql.index_stats where db_name='db2' and table_name='t2';
 | |
| db_name	table_name	index_name	prefix_arity	avg_frequency
 | |
| db2	t2	IDX1	1	5.0000
 | |
| db2	t2	IDX2	1	5.0000
 | |
| db2	t2	IDX2	2	1.6667
 | |
| use db2;
 | |
| #
 | |
| # Now, rename within the same database and verify:
 | |
| #
 | |
| rename table t2 to t3;
 | |
| # No stats under old name:
 | |
| select * from mysql.table_stats where db_name='db2' and table_name='t2';
 | |
| db_name	table_name	cardinality
 | |
| select * from mysql.column_stats where db_name='db2' and table_name='t2';
 | |
| db_name	table_name	column_name	min_value	max_value	nulls_ratio	avg_length	avg_frequency	hist_size	hist_type	histogram
 | |
| select * from mysql.index_stats where db_name='db2' and table_name='t2';
 | |
| db_name	table_name	index_name	prefix_arity	avg_frequency
 | |
| # Stats under the new name:
 | |
| select * from mysql.table_stats where db_name='db2' and table_name='t3';
 | |
| db_name	table_name	cardinality
 | |
| db2	t3	10
 | |
| select * from mysql.column_stats where db_name='db2' and table_name='t3';
 | |
| db_name	table_name	column_name	min_value	max_value	nulls_ratio	avg_length	avg_frequency	hist_size	hist_type	histogram
 | |
| db2	t3	a	0	1	0.0000	4.0000	5.0000	0	NULL	NULL
 | |
| db2	t3	b	0	5	0.0000	4.0000	1.6667	0	NULL	NULL
 | |
| db2	t3	c	0	9	0.0000	4.0000	1.0000	0	NULL	NULL
 | |
| select * from mysql.index_stats where db_name='db2' and table_name='t3';
 | |
| db_name	table_name	index_name	prefix_arity	avg_frequency
 | |
| db2	t3	IDX1	1	5.0000
 | |
| db2	t3	IDX2	1	5.0000
 | |
| db2	t3	IDX2	2	1.6667
 | |
| use test;
 | |
| drop database db1;
 | |
| drop database db2;
 | |
| drop table t1;
 | |
| set use_stat_tables=@save_use_stat_tables;
 |