dmsql优化之收集统计信息

达梦数据库在执行sql的时候,是基于CBO来选择执行计划的,而统计信息的收集又会影响到CBO的性能代价估算。

下面记录一下几种收集统计信息的方式。

--收集指定用户下所有表所有列的统计信息:
DBMS_STATS.GATHER_SCHEMA_STATS('username',100,TRUE,'FOR ALL COLUMNS SIZE AUTO');

--收集指定用户下所有索引的统计信息:
DBMS_STATS.GATHER_SCHEMA_STATS('usename',1.0,TRUE,'FOR ALL INDEXED SIZE AUTO');
--或 收集单个索引统计信息:
DBMS_STATS.GATHER_INDEX_STATS('username','IDX_T2_X');

--收集指定用户下某表统计信息:
DBMS_STATS.GATHER_TABLE_STATS('username','table_name',null,100,TRUE,'FOR ALL COLUMNS SIZE AUTO');

--收集某表某列的统计信息:
STAT 100 ON table_name(column_name);
 
需要特别注意的是,收集统计信息会对数据库的性能造成一定的影响,应尽量避免在业务高峰期收集统计信息。
 
 
达梦也支持自动收集统计信息,但是一般不建议在生产环境下使用,避免因统计信息的收集而影响数据库的性能。
--打开表数据量监控开关,参数值为 1 时监控所有表,2 时仅监控配置表
SP_SET_PARA_VALUE(1,'AUTO_STAT_OBJ',2);

--设置 SYSDBA.T 表数据变化率超过 15% 时触发自动更新统计信息
DBMS_STATS.SET_TABLE_PREFS('SYSDBA','T','STALE_PERCENT',15);

--配置自动收集统计信息触发时机
SP_CREATE_AUTO_STAT_TRIGGER(1, 1, 1, 1,'14:36', '2021/12/31',60,1);
 
 
--函数各参数介绍
SP_CREATE_AUTO_STAT_TRIGGER(
    TYPE                    INT,    --间隔类型,默认为天
    FREQ_INTERVAL           INT,    --间隔频率,默认 1
    FREQ_SUB_INTERVAL       INT,    --间隔频率,与 FREQ_INTERVAL 配合使用
    FREQ_MINUTE_INTERVAL    INT,    --间隔分钟,默认为 1440
    STARTTIME               VARCHAR(128), --开始时间,默认为 22:00
    DURING_START_DATE       VARCHAR(128), --重复执行的起始时间,默认 1900/1/1
    MAX_RUN_DURATION        INT,    --允许的最长执行时间(秒),默认不限制
    ENABLE                  INT     --0 关闭,1 启用  --默认为 1
);
 
 
https://eco.dameng.com
posted @ 2021-12-05 16:40  秋风无落叶  阅读(666)  评论(0)    收藏  举报