专栏/培训园地/ 文章详情 /

达梦统计信息原理及操作学习笔记

孙秀峰 2024/12/23 473 0 0
摘要

一.统计信息概述

为什么我们要维护统计信息?
因为达梦默认是不对统计信息进行维护的,而统计信息对数据库执行计划的影响至关重要。新建/迁移之初是没有统计信息的,建议在迁移数据完成之后马上进行一次全库的统计信息搜集,并且随着业务增长统计信息必然会变得陈旧,必须要根据业务情况进行不断维护。
达梦数据库的统计数据对象分三种类型:表统计信息、列统计信息、索引统计信息。除了对应以上三种对象类型之外,还有全库统计信息、SQL和用户统计信息共六种搜集方式。

二.相关工具和系统表

收集统计信息的工具一共有3种:Stat 命令、Sp 系统函数、Dbms_stats包,每种工具都有一定的独特优势。
image.png

1.Stat 命令

Stat命令最大的特点是简单易用,日常维护中对单个表或表的某一字段进行一次性的统计信息搜集时特别方便。表统计信息收集完成后会立即在dba_tables字典num_rows里面看到。
image.png
相关语句:
select * from DMHR.REGION
stat  on DMHR.REGION;       --收集表统计信息,没有采样率这一说法
stat 100 on DMHR.REGION(region_name);   --收集表的某一列的统计信息,必须指定采样率
stat 100 on DMHR.REGION(region_id,region_name); --支持搜集多个列
stat 100 on DMHR.REGION(all);     --在manager工具选all能把所有列带出来
image.png
数据库的统计信息都保存在SYS.SYSSTATS,使用以下语句能够查询到:
select B.NAME as "表名",c.name as "列名",n_sample as "采样行数",a.*
   from sysstats a,(select id,name
       from sysobjects where schid in(select id from sysobjects where name='DMHR' and type$='SCH')) B,
    SYSCOLUMNS C
where A.ID = B.ID
    and A.ID = C.ID;
image.png

2.Sp 系统函数

SP系统函数的优势在于可以搜集统计信息的种类最多,可以针对表、列、索引、库、SQL进行统计信息收集和删除。
相关语句:
Select * from v$ifun where name like '%SP%STAT%INIT' order by name desc;
image.png
其中索引统计信息和列统计信息有相似之处,又有所不同。索引统计信息本质上收集索引所在的列上的统计信息,因此如果语句能够走索引,则使用的是索引的统计信息,如果建立了索引但是语句不能走索引或者列上没有建索引,就只能用列上的统计信息。

3.Dbms_stats包

Dbms_stats包除了兼容Oracle程序,还具备对某一整个用户的统计信息收集和删除,这给维护带来了很大的方便。除此之外,Dbms_stats包在查看统计信息时,能看到索引的分布直方图,因此功能特别强大。
相关语句:
DBMS_STATS.GATHER_SCHEMA_STATS('DMHR',100,TRUE,'FOR ALL COLUMNS SIZE AUTO');---按SCHEMA收集
DBMS_STATS.DELETE_SCHEMA_STATS('DMHR');--删除SCHEMA下全部统计信息
dbms_stats.column_stats_show('DMHR' , 'REGION' , 'REGION_ID')
dbms_stats.index_stats_show('DMHR','INX_REGION_REGION_ID')--显示索引直方图信息
image.png

三.自动统计信息搜集

在打开 INI 监 控 参 数 AUTO_STAT_OBJ ( 为 1 或 2 ) 的 前 提 下 , 可 使 用
SP_CREATE_AUTO_STAT_TRIGGER 过程对表的监控信息进行自动收集。
下面详细介绍使用 SP_CREATE_AUTO_STAT_TRIGGER 过程自动收集用户表的统计信息的完整过程。

1.打开监控

设置 INI 参数 AUTO_STAT_OBJ 为 1 或 2。1:对所有表进行监控;2:只对用户通过
DBMS_STATS.SET_TABLE_PREFS 设置过 STALE_PERCENT 属性的表对象进行监控。如果
AUTO_STAT_OBJ=2 ,需进一步使用 DBMS_STATS.SET_TABLE_PREFS 设 置
STALE_PERCENT 属性。
alter system set 'AUTO_STAT_OBJ'=1 ; --在线即时生效

2.设置自动收集

执行系统过程SP_CREATE_AUTO_STAT_TRIGGER,进行自动收集。系统过程参数含义:
SP_CREATE_AUTO_STAT_TRIGGER(
type int,--类型,1-8,分别为天、周、月、月的第一、二、三、四周、月的最后一周
freq_interval int,--调度频率,和type对应
freq_sub_interval int,--执行频率
freq_minute_interval int,--开始时间后当天每几分钟执行一次,1-1439,默认1439
starttime varchar(128),--开始时间,默认22:00
during_start_date varchar(128),--开始时间,默认1900/1/1
max_run_duration int,--最大执行时间(秒),默认0(不限制)
enable int--0不启用,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,分别表示从周一到周日

比如:我想设置数据库每天晚上22:00执行统计信息收集,每次最多执行6个小时,可进行如下设置:
SP_CREATE_AUTO_STAT_TRIGGER(
1,--类型,1-8,分别为天、周、月、月的第一、二、三、四周、月的最后一周
1,--调度频率,和type对应
1,--执行频率
1,--开始时间后当天每几分钟执行一次,1-1439,默认1439
'22:00',--开始时间,默认22:00
'2024/12/20',--开始时间,默认1900/1/1
21600,--最大执行时间(秒),默认0(不限制)
1);
执行结果看查看:
select * from SYS.V$AUTO_STAT_TABLE_IDU;

四.导出统计信息

最简单的导出统计信息的方式是在spool程序内导出:
SQL> spool /tmp/stat_test.txt
SQL> DBMS_STATS.GATHER_TABLE_STATS('DMHR','REGION');
DMSQL 过程已成功完成
已用时间: 17.560(毫秒). 执行号:386101.
SQL> dbms_stats.column_stats_show('DMHR' , 'REGION' , 'REGION_ID');

行号     NUM_DISTINCT         LOW_VALUE HIGH_VALUE NUM_NULLS            NUM_BUCKETS SAMPLE_SIZE          HISTOGRAM


1          7                    1         7          0                    7           7                    FREQUENCY

已用时间: 1.187(毫秒). 执行号:386103.
SQL> more

行号     OWNER TABLE_NAME COLUMN_NAME HISTOGRAM ENDPOINT_VALUE ENDPOINT_HEIGHT      ENDPOINT_KEYHEIGHT   ENDPOINT_DISTINCT


1          DMHR  REGION     REGION_ID   FREQUENCY 1              1                    NULL                 NULL
2          DMHR  REGION     REGION_ID   FREQUENCY 2              1                    NULL                 NULL
3          DMHR  REGION     REGION_ID   FREQUENCY 3              1                    NULL                 NULL
4          DMHR  REGION     REGION_ID   FREQUENCY 4              1                    NULL                 NULL
5          DMHR  REGION     REGION_ID   FREQUENCY 5              1                    NULL                 NULL
6          DMHR  REGION     REGION_ID   FREQUENCY 6              1                    NULL                 NULL
7          DMHR  REGION     REGION_ID   FREQUENCY 7              1                    NULL                 NULL

7 rows got

SQL> dbms_stats.index_stats_show('DMHR','INX_REGION_REGION_ID');

行号     BLEVEL      LEAF_BLOCKS          DISTINCT_KEYS        CLUSTERING_FACTOR NUM_ROWS             SAMPLE_SIZE


1          0           1                    7                    0                 7                    7

已用时间: 1.451(毫秒). 执行号:386104.
SQL> more

行号     OWNER NAME                 COLUMN_NAME HISTOGRAM ENDPOINT_VALUE ENDPOINT_HEIGHT      ENDPOINT_KEYHEIGHT   ENDPOINT_DISTINCT


1          DMHR  INX_REGION_REGION_ID REGION_ID   FREQUENCY 1              1                    NULL                 NULL
2          DMHR  INX_REGION_REGION_ID REGION_ID   FREQUENCY 2              1                    NULL                 NULL
3          DMHR  INX_REGION_REGION_ID REGION_ID   FREQUENCY 3              1                    NULL                 NULL
4          DMHR  INX_REGION_REGION_ID REGION_ID   FREQUENCY 4              1                    NULL                 NULL
5          DMHR  INX_REGION_REGION_ID REGION_ID   FREQUENCY 5              1                    NULL                 NULL
6          DMHR  INX_REGION_REGION_ID REGION_ID   FREQUENCY 6              1                    NULL                 NULL
7          DMHR  INX_REGION_REGION_ID REGION_ID   FREQUENCY 7              1                    NULL                 NULL

7 rows got

SQL>

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服