暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【干货攻略】自动更新统计信息

达梦E学 2024-12-23
1372

引 言

统计信息描述了对象数据的分布特征。统计信息是优化器的代价计算的依据,可以帮助优化器较精确地估算成本,对执行计划的选择起着至关重要的作用。
统计信息的收集频率是一把双刃剑,频率太低导致统计信息滞后,频率太高又影响查询性能,因此,系统管理员需要根据实际情况,合理安排统计信息收集的频率。
统计信息的使用方法有:收集统计信息(静态或动态)、查看统计信息和监控统计信息等。静态收集统计信息有两种方式。一是自动收集;二是手动收集。采用任意一种即可。静态收集的结果均会保存到系统表中。
今天来讨论一下自动收集统计信息,在 INI 参数 AUTO_STAT_OBJ 为 1 或 2 前提下,执行 SP_CREATE_AUTO_STAT_TRIGGER 过程实现自动收集。先创建一个T表,然后对打开对T表的监控,然后通过SP_CREATE_AUTO_STAT_TRIGGER 功能去设置触发器,对T表的统计信息进行自动收集。
本章内容已在如下环境上测试:
①数据库版本:达梦DM8。
相关关键字:统计信息

——正文——

01

操作步骤

1、先创建表

    CREATE TABLE T(A INT);
    2、打开对T表的监控,将AUTO_STAT_OBJ的值设置为2。
    1:对所有表进行监控;
    2:只对用户通过DBMS_STATS. SET_TABLE_PREFS 设置过 STALE_PERCENT 属性的表对象进行监控。
    如果AUTO_STAT_OBJ=2,需 进 一 步 使 用 DBMS_STATS.SET_TABLE_PREFS 设置STALE_PERCENT 属性。

      SP_SET_PARA_VALUE(1,'AUTO_STAT_OBJ',2);

      3、对修改行数占总行数的百分比,达到STALE_PERCENT值时,收集T表对象统计信息。比如修改行数占到总行数的15%时,去收集它的统计信息。

        DBMS_STATS.SET_TABLE_PREFS('SYSDBA','T','STALE_PERCENT',15);

        4、查看指定模式下表的统计信息的静态参数对应的值,看是否设置成功。

          select * from SYSSTATPREFS;

          数据字典表SYSSTATPREFS的列值说明如下:

          5、设置SP_CREATE_AUTO_STAT_TRIGGER触发器,去自动收集统计信息。
            SP_CREATE_AUTO_STAT_TRIGGER(1, 1, 1, 1,'14:00:00', '2024/11/28',0,1);
            6、查看触发器状态,发现自动更新统计信息的触发器状态有效。
              select name,valid from SYSOBJECTS where subtype$='TRIG';

              7、向T表中新增数据

                INSERT INTO T SELECT LEVEL CONNECT BY LEVEL<=60;
                Commit;

                8、查询触发器是否更新成功,可以看到T统计信息已经更新。T表中有60行新的数据。(需等待触发器执行后才有数据)。

                  SELECT * FROM SYSSTATTABLEIDU;

                  数据字典表SYSSTATTABLEIDU其相关列说明如下:

                  02

                  涉及相关的参数和函数说明

                  1、AUTO_STAT_OBJ参数说明

                  2、STALE_PERCENT函数说明

                    DBMS_STATS.SET_TABLE_PREFS(SYSDBA','T','STALE_PERCENT',15);

                    语法如下:

                      PROCEDURE SET_TABLE_PREFS (
                      OWNNAME VARCHAR(128),
                      TABNAME VARCHAR(128),
                      PPNAME VARCHAR(128),
                      PVALUE VARCHAR(128)
                      );

                      参数详解

                      OWNNAME模式名,不区分大小写。
                      TABNAME表名,不区分大小写。
                      PPNAME属性名,不区分大小写:可以取STALE_PERCENT、ESTIMATE_PERCENT、METHOD_OPT、DEGREE、GRANULARITY、CASCADE、NO_INVALIDATE和PREFERENCE_OVERRIDES_PARAMETER。
                      •  -STALE_PERCENT决定表的统计信息过时且需要重收集统计信息时表的行数百分比。有效取值范围是非负数,默认值是 10,即一张表有超过 10%的数据改变则可认为统计信息过时。取值范围[0,100],该值置为 0 时,则认为需要将该表的 STALE_PERCENT的属性值消除。
                      •  -PREFERENCE_OVERRIDES_PARAMETER决定是否用静态属性值覆盖参数的输入值。为 TRUE 时,忽略参数的输入值,使用对应的属性值。为 FALSE 时,使用参数的输入值。
                      PVALUE属性名对应的属性值,不区分大小写。
                      3、SP_CREATE_AUTO_STAT_TRIGGER说明
                      定义:
                        SP_CREATE_AUTO_STAT_TRIGGER(
                        type int,
                        freq_interval int,
                        freq_sub_interval int,
                        freq_minute_interval int,
                        starttime varchar(128),
                        during_start_date varchar(128),
                        max_run_duration int,
                        enable int
                        )

                        功能说明:

                        当参数 AUTO_STAT_OBJ 开启时(值为1或是2),启用自动收集统计信息功能。

                        参数说明:

                        type:指定调度类型。可取值 1、2、3、4、5、6、7、8,默认为 1,不同取值意义分别介绍如下:
                        • 1:按天的频率来执行;
                        • 2:按周的频率来执行;
                        • 3:在一个月的某一天执行;
                        • 4:在一个月的第一周第几天执行;
                        • 5:在一个月的第二周的第几天执行;
                        • 6:在一个月的第三周的第几天执行;
                        • 7:在一个月的第四周的第几天执行;
                        • 8:在一个月的最后一周的第几天执行。

                        freq_interval:与 type 有关,表示不同调度类型下的发生频率,默认为 1。具体说明如下:

                        • 当 type=1 时,表示每几天执行,取值范围为 1~100;
                        • 当 type=2 时,表示每几个星期执行,取值范围为 1~100;
                        • 当 type=3 时,表示每几个月中的某一天执行,取值范围为 1~100;
                        • 当 type=4 时,表示每几个月的第一周执行,取值范围为 1~100;
                        • 当 type=5 时,表示每几个月的第二周执行,取值范围为 1~100;
                        • 当 type=6 时,表示每几个月的第三周执行,取值范围为 1~100;
                        • 当 type=7 时,表示每几个月的第四周执行,取值范围为 1~100;
                        • 当 type=8 时,表示每几个月的最后一周执行,取值范围为 1~100。
                        freq_sub_interval:与 type 和 freq_interval 有关,表示不同 type 的执行频率,在 freq_interval 基础上,继续指定更为精准的频率,默认为 1。具体说明如下:
                        • 当 type=1 时,这个值无效,系统不做检查;
                        • 当 type=2 时,表示某一个星期的星期几执行,可以同时选中七天中的任意几天,取值范围 1~127。具体可参考如下规则:因为每周有七天,所以 DM 数据库系统内部用七位二进制来表示选中的日子,从最低位开始算起,依次表示周日、周一到周五、周六。选中周几,就将该位置 1,否则置 0。例如,选中周二和周六,7 位二进制就是 1000100,转化成十进制就是 68,所以 FREQ_SUB_INTERVAL 取值 68;
                        • 当 type=3 时,表示将在一个月的第几天执行,取值范围 1~31;
                        • 当 type 为 4、5、6、7 或 8 时,都表示将在某一周内第几天执行,取值范围 1~7,分别表示从周一到周日。
                        freq_minute_interval:开始时间后,当天每隔几分钟再次执行,取值范围为1~1439,默认为 1439;
                        starttime:开始时间,默认为 22:00;
                        during_start_date:有效日期时间段的开始日期时间,只有当前时间大于该参数值时,该定时器才有效,默认为 1900/1/1;
                        max_run_duration:收集统计信息触发器最大执行时间,单位秒,0 表示不限制,默认为 0;
                        enable:定时器是否有效,1:有效,默认为 1。2:删除触发器。

                        总结


                        本期关于自动收集及更新统计信息的介绍,你学会了吗?



                        END


                        以上为本期分享,希望能带给大家帮助。想要了解更多往期干货,可访问页面最下方#达梦技术干货攻略#合集或下方相关分享。在此邀请更多学员参与“达梦技术干货投稿活动”,稿件获选后将在达梦“干货分享”专栏进行发布,欢迎来稿!


                        往期回顾


                        【干货】SQL优化之LIKE CASE WHEN改写思路(一)

                        【干货】SQL优化之LIKE CASE WHEN改写思路(二)

                        【干货】达梦报错超长记录如何分析

                        开班】2025年第1期达梦认证管理员DCA在线课程

                        【开班】2025年第2期达梦认证管理员DCP在线课程



                        达梦E学
                        达梦数据  学习园地


                        文章转载自达梦E学,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                        评论