一、执行计划生成流程:
统计信息作用于逻辑计划生成之后、物理计划生成之前,用于帮助优化器较精准地估算代价,对执行计划的选择起着至关重要的作用。
RBO(Rule Based Optimizer):基于规则的优化器
按照硬编码在数据库中的一系列规则来决定SQL的执行计划。
对数据不敏感,执行计划无法根据数据分布特征进行调整。
CBO(Cost Based Optimizer):基于代价的优化器
按照统计信息和代价模型计算各种可能的执行计划的代价,并从中选择代价最低的执行计划。
对数据敏感,执行计划可以根据数据分布特征进行调整。
DM的优化器是基于代价的优化器,需要统计信息在逻辑计划优化阶段提供数据的分布信息。
二、统计信息主要内容
对象统计信息描述了对象数据的分布特征。
统计信息是优化器代价计算的依据,可以帮助优化器较精确地估算代价,对执行计划的选择起着至关重要的作用。
按照所属对象类型可分为表统计信息、列统计信息、索引统计信息。
表统计信息包含该表行数、索引所占页数等汇总信息。
列统计信息和索引统计信息除包含上述汇总信息外,还包含采样个数、不同值个数、空值个数、最大值、最小值等数据特征。
列统计信息和索引统计信息将采样的数据按照不同的分布特征生成相应的直方图,直方图揭示了数据的具体分布情况。
统计信息保存至系统表SYSSTATS,多列统计信息保存至系统表SYSMSTATS。
三、SYSSTATS系统表
四、收集方式
静态收集:在查询之前收集,并且在查询之前完成,和查询操作互不干涉,不会对查询产生影响 手动收集:通过人为手段收集统计信息。
DBMS_STATS系统包方法,如GATHER_TABLE_STATS
系统存储过程和函数,如SP_TAB_COL_STAT_INIT
STAT ON语句
自动收集:在开启参数AUTO_STAT_OBJ的前提下,创建自动收集统计信息的触发器,由系统自主进行统计信息收集。
动态收集:在查询过程中收集,具体为在逻辑计划优化阶段之前收集,收集完成后再构造计划,因此会影响查询性能,特别是在高并发的场景中。
在开启参数OPTIMIZER_DYNAMIC_SAMPLING后,优化器根据参数取值在计划生成阶段收集统计信息。
五、收集原理
表统计信息
需要数据:表行数、索引所占页数
获得方式:聚集索引访问
列统计信息、索引统计信息
六、收集示例
DROP TABLE T1;
CREATE TABLE T1(C1 INT); INSERT INTO T1 SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 5;
INSERT INTO T1 SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 3;
COMMIT;
STAT 100 ON T1(C1);
等效查询语句
列 | 值 |
T_FLAG | C |
T_TOTAL | 8 |
N_SAMPLE | 8 |
N_DISTINCT | 5 |
N_NULL | 0 |
V_MIN | 0x01000000 |
V_MAX | 0x05000000 |
N_BUCKETS | 5 |
COL_AVG_LEN | 4 |
七、统计信息收集性能影响因素
表统计信息收集仅需要访问聚集索引控制页,不需要访问实际数据页。
列统计信息和索引统计信息,需要构造查询访问实际数据页,可能在以下几个位置出现性能热点: 分组或排序。
对于分组或排序性能有用的优化手段同样适用于收集统计信息,例如出现了分组或者排序的刷盘,则可以通过调整分组或者排序区的内存大小以避免刷盘;尝试分组或排序相关优化参数的不同取值以获得更优的分组排序性能。
数据汇总
收集统计信息在数据汇总阶段出现性能热点的可能原因是STAT操作符产生了刷盘,可通过调整HAGR_BLK_SIZE/HAGR_BUF_SIZE的取值放大为STAT操作符分配的内存大小以减小刷盘可能性。
调整STAT_OPT_FLAG取值选择不同的统计信息收集算法。
八、自动收集统计信息
通过系统表SYSSTATPREFS记录表收集属性
通过系统表SYSSTATTABLEIDU监控表数据变化
通过INI参数AUTO_STAT_OBJ控制是否启用自动收集统计信息
AUTO_STAT_OBJ = 0:不启用
AUTO_STAT_OBJ = 1:对数据库中所有用户表监控
AUTO_STAT_OBJ = 2:仅对指定的用户表监控,通过SET_TABLE_PREFS指定监控表
用户创建自动收集统计信息的触发器
触发器在每个执行周期开始时对所有被监控的表中影响行数变化达到一定比例(即STALE_PERCENT)的表重新收集统计信息
收集统计信息通过调用系统包方法GATHER_TABLE_STATS实现,可通过SET_TABLE_PREFS指定收集时的输入参数
九、展示统计信息
TABLE_STATS_SHOW:展示表统计信息
COLUMN_STATS_SHOW:展示列统计信息,返回两个结果集,列的统计信息和直方图
INDEX_STATS_SHOW:展示索引统计信息,返回两个结果集,索引的统计信息和直方图
欢迎访问达梦社区:https://eco.dameng.com/