mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Fixed the bug that caused displaying incorrect values in
the column cardinality of the table information_schema.statistics.
This commit is contained in:
@@ -118,6 +118,41 @@ dbt3_s001 partsupp i_ps_suppkey 1 70
|
|||||||
dbt3_s001 region PRIMARY 1 1
|
dbt3_s001 region PRIMARY 1 1
|
||||||
dbt3_s001 supplier PRIMARY 1 1
|
dbt3_s001 supplier PRIMARY 1 1
|
||||||
dbt3_s001 supplier i_s_nationkey 1 1.1111111111111112
|
dbt3_s001 supplier i_s_nationkey 1 1.1111111111111112
|
||||||
|
select * from mysql.table_stat where table_name='orders';
|
||||||
|
db_name table_name cardinality
|
||||||
|
dbt3_s001 orders 1500
|
||||||
|
select * from mysql.index_stat where table_name='orders';
|
||||||
|
db_name table_name index_name prefix_arity avg_frequency
|
||||||
|
dbt3_s001 orders PRIMARY 1 1
|
||||||
|
dbt3_s001 orders i_o_orderdate 1 1.3321492007104796
|
||||||
|
dbt3_s001 orders i_o_custkey 1 15
|
||||||
|
select (select cardinality from mysql.table_stat where table_name='orders') /
|
||||||
|
(select avg_frequency from mysql.index_stat
|
||||||
|
where index_name='i_o_orderdate' and prefix_arity=1) as n_distinct;
|
||||||
|
n_distinct
|
||||||
|
1126
|
||||||
|
select count(distinct o_orderdate) from orders;
|
||||||
|
count(distinct o_orderdate)
|
||||||
|
1126
|
||||||
|
select (select cardinality from mysql.table_stat where table_name='orders') /
|
||||||
|
(select avg_frequency from mysql.index_stat
|
||||||
|
where index_name='i_o_custkey' and prefix_arity=1) as n_distinct;
|
||||||
|
n_distinct
|
||||||
|
100
|
||||||
|
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 1127 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 1127
|
||||||
|
i_o_custkey o_custkey 100
|
||||||
set @save_optimizer_switch=@@optimizer_switch;
|
set @save_optimizer_switch=@@optimizer_switch;
|
||||||
set optimizer_switch='index_condition_pushdown=off';
|
set optimizer_switch='index_condition_pushdown=off';
|
||||||
EXPLAIN select n_name, sum(l_extendedprice * (1 - l_discount)) as revenue
|
EXPLAIN select n_name, sum(l_extendedprice * (1 - l_discount)) as revenue
|
||||||
|
@@ -143,6 +143,43 @@ dbt3_s001 region PRIMARY 1 1
|
|||||||
dbt3_s001 supplier PRIMARY 1 1
|
dbt3_s001 supplier PRIMARY 1 1
|
||||||
dbt3_s001 supplier i_s_nationkey 1 1.1111111111111112
|
dbt3_s001 supplier i_s_nationkey 1 1.1111111111111112
|
||||||
dbt3_s001 supplier i_s_nationkey 2 1
|
dbt3_s001 supplier i_s_nationkey 2 1
|
||||||
|
select * from mysql.table_stat where table_name='orders';
|
||||||
|
db_name table_name cardinality
|
||||||
|
dbt3_s001 orders 1500
|
||||||
|
select * from mysql.index_stat where table_name='orders';
|
||||||
|
db_name table_name index_name prefix_arity avg_frequency
|
||||||
|
dbt3_s001 orders PRIMARY 1 1
|
||||||
|
dbt3_s001 orders i_o_orderdate 1 1.3321492007104796
|
||||||
|
dbt3_s001 orders i_o_orderdate 2 1
|
||||||
|
dbt3_s001 orders i_o_custkey 1 15
|
||||||
|
dbt3_s001 orders i_o_custkey 2 1
|
||||||
|
select (select cardinality from mysql.table_stat where table_name='orders') /
|
||||||
|
(select avg_frequency from mysql.index_stat
|
||||||
|
where index_name='i_o_orderdate' and prefix_arity=1) as n_distinct;
|
||||||
|
n_distinct
|
||||||
|
1126
|
||||||
|
select count(distinct o_orderdate) from orders;
|
||||||
|
count(distinct o_orderdate)
|
||||||
|
1126
|
||||||
|
select (select cardinality from mysql.table_stat where table_name='orders') /
|
||||||
|
(select avg_frequency from mysql.index_stat
|
||||||
|
where index_name='i_o_custkey' and prefix_arity=1) as n_distinct;
|
||||||
|
n_distinct
|
||||||
|
100
|
||||||
|
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 1127 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 1127
|
||||||
|
i_o_custkey o_custkey 100
|
||||||
set @save_optimizer_switch=@@optimizer_switch;
|
set @save_optimizer_switch=@@optimizer_switch;
|
||||||
set optimizer_switch='index_condition_pushdown=off';
|
set optimizer_switch='index_condition_pushdown=off';
|
||||||
EXPLAIN select n_name, sum(l_extendedprice * (1 - l_discount)) as revenue
|
EXPLAIN select n_name, sum(l_extendedprice * (1 - l_discount)) as revenue
|
||||||
|
@@ -69,6 +69,20 @@ FLUSH TABLE mysql.table_stat, mysql.index_stat;
|
|||||||
select * from mysql.table_stat;
|
select * from mysql.table_stat;
|
||||||
select * from mysql.index_stat;
|
select * from mysql.index_stat;
|
||||||
|
|
||||||
|
select * from mysql.table_stat where table_name='orders';
|
||||||
|
select * from mysql.index_stat where table_name='orders';
|
||||||
|
select (select cardinality from mysql.table_stat where table_name='orders') /
|
||||||
|
(select avg_frequency from mysql.index_stat
|
||||||
|
where index_name='i_o_orderdate' and prefix_arity=1) as n_distinct;
|
||||||
|
select count(distinct o_orderdate) from orders;
|
||||||
|
select (select cardinality from mysql.table_stat where table_name='orders') /
|
||||||
|
(select avg_frequency from mysql.index_stat
|
||||||
|
where index_name='i_o_custkey' and prefix_arity=1) as n_distinct;
|
||||||
|
select count(distinct o_custkey) from orders;
|
||||||
|
show index from orders;
|
||||||
|
select index_name, column_name, cardinality from information_schema.statistics
|
||||||
|
where table_name='orders';
|
||||||
|
|
||||||
set @save_optimizer_switch=@@optimizer_switch;
|
set @save_optimizer_switch=@@optimizer_switch;
|
||||||
set optimizer_switch='index_condition_pushdown=off';
|
set optimizer_switch='index_condition_pushdown=off';
|
||||||
|
|
||||||
|
@@ -14102,6 +14102,7 @@ create_tmp_table(THD *thd, TMP_TABLE_PARAM *param, List<Item> &fields,
|
|||||||
table->intersect_keys.init();
|
table->intersect_keys.init();
|
||||||
table->keys_in_use_for_query.init();
|
table->keys_in_use_for_query.init();
|
||||||
table->no_rows_with_nulls= param->force_not_null_cols;
|
table->no_rows_with_nulls= param->force_not_null_cols;
|
||||||
|
table->read_stat.cardinality_is_null= TRUE;
|
||||||
|
|
||||||
table->s= share;
|
table->s= share;
|
||||||
init_tmp_table_share(thd, share, "", 0, tmpname, tmpname);
|
init_tmp_table_share(thd, share, "", 0, tmpname, tmpname);
|
||||||
|
@@ -5441,9 +5441,12 @@ static int get_schema_stat_record(THD *thd, TABLE_LIST *tables,
|
|||||||
TABLE *show_table= tables->table;
|
TABLE *show_table= tables->table;
|
||||||
KEY *key_info=show_table->s->key_info;
|
KEY *key_info=show_table->s->key_info;
|
||||||
if (show_table->file)
|
if (show_table->file)
|
||||||
|
{
|
||||||
show_table->file->info(HA_STATUS_VARIABLE |
|
show_table->file->info(HA_STATUS_VARIABLE |
|
||||||
HA_STATUS_NO_LOCK |
|
HA_STATUS_NO_LOCK |
|
||||||
HA_STATUS_TIME);
|
HA_STATUS_TIME);
|
||||||
|
set_statistics_for_table(thd, show_table);
|
||||||
|
}
|
||||||
for (uint i=0 ; i < show_table->s->keys ; i++,key_info++)
|
for (uint i=0 ; i < show_table->s->keys ; i++,key_info++)
|
||||||
{
|
{
|
||||||
KEY_PART_INFO *key_part= key_info->key_part;
|
KEY_PART_INFO *key_part= key_info->key_part;
|
||||||
@@ -5474,8 +5477,8 @@ static int get_schema_stat_record(THD *thd, TABLE_LIST *tables,
|
|||||||
KEY *key=show_table->key_info+i;
|
KEY *key=show_table->key_info+i;
|
||||||
if (key->rec_per_key[j])
|
if (key->rec_per_key[j])
|
||||||
{
|
{
|
||||||
ha_rows records=(show_table->file->stats.records /
|
ha_rows records=((double) show_table->stat_records() /
|
||||||
key->rec_per_key[j]);
|
key->real_rec_per_key(j));
|
||||||
table->field[9]->store((longlong) records, TRUE);
|
table->field[9]->store((longlong) records, TRUE);
|
||||||
table->field[9]->set_notnull();
|
table->field[9]->set_notnull();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user