统计信息的基本概念

统计信息主要是描述数据库中表, 索引的大小, 规模, 数据分布状况等的一类信息。
比如,表的行数,块数,平均每行的大小,索引的高度、叶子节点数,索引字段的行数,不同值的大小等,都属于统计信息。
统计信息是优化器的依据,可以帮助优化器精确估算成本,对执行计划的选择起到了重要作用。
达梦的统计信息为分三类:表统计信息,索引信息,列统计信息。
统计信息在生成的过程中分为三个步骤:
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
更新已有的统计信息。

-- By 许望(RHCA、OCM、VCP)
最后修改:2026 年 07 月 31 日 08 : 18 PM
如果觉得我的文章对你有用,请随意赞赏