gbase8a的统计信息有两张表,分别是gclusterdb.gc_stats_table和gclusterdb.gc_stats_column;
1、gc_stats_table表里存储analyze表的数据条数;
gbase> select * from gc_stats_table where db=’tpch1t’;
+——–+————+————+———————+
| db | table_name | tuples | timestamp |
+——–+————+————+———————+
| tpch1t | lineitem | 5999989709 | 2023-12-29 11:37:05 |
| tpch1t | orders | 1500000000 | 2023-12-29 11:47:35 |
| tpch1t | part | 200000000 | 2023-12-29 11:49:58 |
| tpch1t | partsupp | 800000000 | 2023-12-29 11:50:28 |
| tpch1t | supplier | 10000000 | 2023-12-29 11:50:54 |
| tpch1t | customer | 150000000 | 2023-12-29 11:51:04 |
| tpch1t | nation | 25 | 2023-12-29 11:51:40 |
| tpch1t | region | 5 | 2023-12-29 11:51:42 |
+——–+————+————+———————+
2、gclusterdb.gc_stats_column中存储的是列的相关信息
gbase> desc gclusterdb.gc_stats_column;
+————-+—————-+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+————-+—————-+——+—–+———+——-+
| db | varchar(64) | YES | | NULL | |
| table_name | varchar(64) | YES | | NULL | |
| column_name | varchar(64) | YES | | NULL | |
| null_frac | float | YES | | NULL | |
| avg_width | int(11) | YES | | NULL | |
| n_distinct | float | YES | | NULL | |
| mcv_vals | varchar(10922) | YES | | NULL | |
| mcv_freqs | varchar(10922) | YES | | NULL | |
| histogram | varchar(10922) | YES | | NULL | |
+————-+—————-+——+—–+———+——-+
gclusterdb.gc_stats_column列的说明:
(1)null_frac:统计列是空值的比例;计算方法:列是空的条数/采样条数
(2)avg_width:列的平均宽度:只统计变长的数据类型(比如varchar)
计算方法:select avg(length(c1)) from table
(3)n_distinct:统计列的distinct值,如果值是正数,则显示的是count(distinct),如果是负数,则显示的是distinct值所占比例(比例大于10%时,用负数显示,否则显示正数)
计算方法:select count(distinct(c1)) as n_distinct from table;或
select count(distinct(c1))/count(*) as n_distinct from table;
(4)mcv_vals:列中出现次数较多的值,值的个数由gcluster_statistics_target决定,默认25个。
计算方法:Select v,count(col)/count(*) from table group by v order by count(*) desc limit 25;
(5)mcv_freqs:为(4)计算出的count(col)/count(*)
(6)Histogram:各个区间中count数相同,只有数值类型需要统计直方图,varchar类型不统计,区间个数也由gcluster_statistics_target决定。{1,3,8,20},可以划分的区间是(1,3),(8,20),即这两个区间的值个数相同。
计算方法:(1)先算出每个区间有多少个值,bucket_size=count(*)/gcluster_statistics_target
(2)select v from (select col v,row_number() over(order by col) r from table where col is not null union select max(col),1 as r from table where col is not null) foo where r%(bucket_size)=1 group by v order by v
row_number() over(order by col)全表升序排列
r%(bucket_size)=1 找到区间的边界值,左闭右开区间
统计的结果是区间的边界值,[1,100,300,400]表示1,100和100,300区间的频数相同
3、关于统计信息的参数:
gcluster_statistics_sampling_threshold:含义:如果表的记录数小于阈值,则全量采样,否则随机抽取部分数据
gcluster_statistics_target:用于计算采样的数据量,决定mcv的统计个数和直方图区间的个数,一般使用默认值
gcluster_analyze_relative_error:统计分析的相对误差率
原创文章,作者:kirin,如若转载,请注明出处:https://blog.ytso.com/tech/bigdata/317886.html