统计信息的基本概念
统计信息主要是描述数据库中表, 索引的大小, 规模, 数据分布状况等的一类信息。
比如,表的行数,块数,平均每行的大小,索引的高度、叶子节点数,索引字段的行数,不同值的大小等,都属于统计信息。
统计信息是优化器的依据,可以帮助优化器精确估算成本,对执行计划的选择起到了重要作用。
达梦的统计信息为分三类:表统计信息,索引信息,列统计信息。
统计信息在生成的过程中分为三个步骤:
1、 确定采样的数据(对象,分析数据,表,索引,列)
2、 确定采样率:采样率和数据量成反比。
3、 生成直方图:频率直方图和等高直方图。
统计信息对 CBO 的影响非常重大, 因此我们要及时更新统计信息。
DBMS_STATS 包: 收集统计信息, 删除统计信息, 查看统计信息。
包的使用可以参考系统包使用手册或查看 DESC DBMS_STATS。
直方图的概率与 Oracel 是一样的。
对于等高直方图来说,CBO 会认为每个区间中的数据都是近似均匀分布的,实际上数据可能会分布非常崎岖。
等高直方图区间越多,统计越精确,而实际上数量有限,最大为1000。
对于组合索引的多个列,统计信息只有每个列的独立分布情况,而无法知道列之间的关联分布。
那些对象不支持统计信息:
1、 外部表,dblink 远程表,动态视图,临时表
2、 所在表空间为 offline 对象
3、 位图索引,全文索引
4、 Blob image clob text也不支持,自定义类型和空间类型也不支持。
收集统计信息
GATHER_*_STATS 可以收集统计信息
收集统计信息建议在业务低谷时间去做。
GATHER_TABLE_STATS
根据设定的参数,收集表中的列和表上的索引的统计信息。其中,对于表,只搜集表的总行数,总的页数,已经使用的页数等基本信息。
例如:
DBMS_STATS.GATHER_TABLE_STATS('用户名','表名',null,100,false,'FOR ALL COLUMNS SIZE AUTO',4);
GATHER_INDEX_STATS
根据设定的参数, 收集索引的统计信息。
例如:
DBMS_STATS.GATHER_INDEX_STATS('用户名','索引名',null,100);
GATHER_SCHEMA_STATS
收集模式下对象的统计信息。
DBMS_STATS.GATHER_SCHEMA_STATS('HR');
SP_COL_STAT_INIT_EX
更新单列信息。
SP_COL_STAT_INIT_EX('用户名','表名','列名',100)
查看统计信息
*_stats_show 可以查看统计信息
COLUMN_STATS_SHOW
根据模式名, 表名和列名获得该列的统计信息。 返回两个结果集: 一个是列的统计信息; 另一个是直方图的统计信息。
DBMS_STATS.COLUMN_STATS_SHOW('用户名','表名','列名');
-- 1.类型:频率直方图
-- 2.ENDPOINT_VALUE 样本值:1
-- 3.ENDPOINT_HEIGHT 样本值的个数:848
TABLE_STATS_SHOW
根据模式名, 表名获得该表的统计信息。
INDEX_STATS_SHOW
根据模式名, 索引名获得该索引的统计信息。 返回两个结果集: 一个是索引的统计信息; 另一个是直方图的统计信息。
删除统计信息
DELETE_*_STATS 可以删除统计信息
DELETE_TABLE_STATS
根据设定参数, 删除与表相关对象的统计信息。
DELETE_SCHEMA_STATS
根据设定参数, 删除模式下对象的统计信息。
DELETE_INDEX_STATS
根据设定参数, 删除索引的统计信息
DELETE_COLUMN_STATS
根据设定参数, 删除列的统计信息。
更新统计信息
UPDATE_ALL_STATS
更新已有的统计信息。