首页 > 数据库 > > GaussDB100 收集统计信息
统计信息就是一个更加详细描述数据库和数据库对象的集合,这些统计信息被用于查询优化器,让其为每条SQL语句选择最佳的执行计划。
数据库提供了ANALYZE语句和DBMS_STATS高级包收集统计信息,例如:收集有关表及其索引的对象属性的统计信息。
当表中数据发生较大变化时,之前的统计信息可能不准确,用户需要重新收集该表的统计信息。数据库提供了ADM_TAB_MODIFICATIONS和MY_TAB_MODIFICATIONS视图用来监测当前某表的修改次数(主要包括插,入,删除,更新),用户可以通过查看该视图来决定是否重新进行统计信息收集。
ANALYZE/DBMS_STATS.GATHER_TABLE_STATS支持收集临时表的统计信息,临时表的统计信息收集后均为0。
无法计算或估计以下列类型的统计信息:LOB列类型(不分析LOB列类型,直接跳过),LONG列类型或对象类型。
ANALYZE/DBMS_STATS.GATHER_TABLE_STATS支持收集分区表的统计信息。
DBMS_STATS高级包支持收集所有列的统计信息,也支持只收集索引列的统计信息。但ANALYZE不支持单独收集索引的统计信息功能,如果使用ANALYZE收集表的统计信息,索引的统计信息会一起被收集。
数据库提供收集表的以下统计信息的功能。表统计信息显示在数据字典视图MY_TABLES,DB_TABLES和ADM_TABLES中。
行数(NUM_ROWS)
*高水位线以下的数据块数 - 已格式化为接收数据的数据块数,无论它们当前是否包含数据或为空(BLOCKS)
*分配给从未使用过的表的数据块数(EMPTY_BLOCKS)
平均行长度,包括行开销,以字节为单位(AVG_ROW_LEN)
注:标有星号的统计数据是精确计算值。
数据库提供收集索引的统计信息。对于常规索引,在计算或估计统计信息时,统计信息将显示在数据字典视图SYS_INDEXES、SYS_INDEX_PARTS、SYS_INDEX_PARTS、MY_INDEXES、DB_INDEXES和ADM_INDEXES中。。
详细信息请参考《GaussDB 100 V300R001C00数据库参考信息(单机)》中的“数据字典和视图”。
*索引从其根块到其叶块的深度(BLEVEL)
叶块数(LEAF_BLOCKS)
不同索引值的数量(DISTINCT_KEYS)
每个索引值的平均叶块数(AVG_LEAF_BLOCKS_PER_KEY)
每个索引值的平均数据块数(对于表上的索引)(AVG_DATA_BLOCKS_PER_KEY)
聚类因子(行与索引值的排序顺序)(CLUFAC)
在两个以上字段所建立索引的前两个字段组合索引的唯一键值数量(COMB_COLS_2_NDV)。
在三个以上字段所建立索引的前三个字段组合索引的唯一键值数量(COMB_COLS_3_NDV)。
在四个以上字段所建立索引的前四个字段组合索引的唯一键值数量(COMB_COLS_4_NDV)。
注:标有星号的统计数据是精确计算值。
直方图是一种特殊类型的列统计信息,它提供有关表列中数据分布的更多详细信息。直方图将值分类为“桶”,每个桶中存放一定范围的值。
基于不同值的数量和数据的分布,数据库选择要创建的直方图的类型。 直方图的类型如下:
等频直方图:在等频直方图中,每个不同的列值对应直方图的单个桶,因为每个值都有自己的专用存储桶,所以某些存储桶可能有很多值,而其他存储桶很少。
等高直方图:在等高直方图中,列值被平均分成桶,每个桶包含大致相同的行数。
列的统计信息会随表一起收集。数据库通过列的不同值数量来确定要创建的直方图类型,如果不同值数量小于254,会生成等频直方图,否则生成等高直方图。
可以使用DBMS_STATS.DELETE_TABLE_STATS/DBMS_STATS.DELETE_SCHEMA_STATS来删除表的统计信息。
重复执行ANALYZE/DBMS_STATS.GATHER_TABLE_STATS会清空上一次的统计信息,并产生新的统计信息。
在数据库运行过程中,当表中数据发生较大变化时,之前的统计信息可能不准确,此时如果执行SQL语句查询此表的数据,基于代价的执行计划可能不准确,导致执行效率不高。
数据库提供对系统中表统计信息的自动收集功能,可以按照固定时间周期性执行自定义任务,或根据表数据的变化率执行自定义任务,进行表数据统计信息的收集,使得统计信息更加精确,从而提高执行效率。
数据库创建的同时,默认在SYS用户下创建两个定时任务:
定时任务一:收集全库的统计信息,此任务每天凌晨1:00执行,缺省数据采样率为10%。
定时任务二:收集变化的数据表的统计信息,此任务每隔15分钟执行一次,系统会判断数据库中所有表数据的变化率,仅当某个表的数据变化率大于等于10%时,才收集该数据表的统计信息,缺省数据采样率为10%。
使用SYS用户通过SELECT * FROM DB_JOBS;命令可以查看这两个定时任务。
收集统计信息的两个定时任务默认处于关闭状态,如果需要启动自定义任务,需要同时满足如下两个条件:
调用DBMS_JOB.RUN接口启动定时任务,其中jobid可通过SELECT * FROM SYS_JOBS;获取。
exec DBMS_JOB.RUN(jobid); commit;
将系统参数CBO设置为ON。
ALTER SYSTEM SET CBO=ON SCOPE=BOTH;
系统内置了两个存储过程:GATHER_DB_STATS和GATHER_CHANGE_STATS。
GATHER_DB_STATS:按指定采样率收集整库数据表的统计信息(系统表除外)。
GATHER_CHANGE_STATS:按指定采样率准实时收集系统中达到指定变化率的数据表的统计信息。
收集统计信息会消耗大量系统资源,尤其是I/O。通过三个系统配置参数可以控制收集统计信息时对I/O的占用率。
添加流控模式参数:
STATS_COST_LIMIT每次流控限速的采样页面间隔,即每采样多少个页面进行一次I/O sleep。
STATS_COST_DELAY每次sleep的时间。
这两个参数控制统计采样页面时对I/O的持续占用,通过限速使I/O资源每隔一段时间空出,供其他业务使用。从而降低对I/O的持续占用。
添加强制最大采样限制:
ENABLE_SAMPLE_LIMIT添加强制最大采样数据size限制,设置为true将只采样STATISTICS_SAMPLE_SIZE值大小的数据。
通过限制最大采样数据来保证当前temp pool不会和temp表空间产生I/O交换,从而避免资源的消耗,达到降低磁盘I/O的目的。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69959250/viewspace-3134616/ ,如需转载,请注明出处,否则将追究法律责任。