注册
DM8 统计信息与基础管理
培训园地/ 文章详情 /

DM8 统计信息与基础管理

DM_184112 2026/09/04 78 0 0

1. 统计信息

统计信息是数据库对对象数据规模和数据分布特征的描述。DM8 的优化器在生成执行计划时,会依据统计信息估算扫描行数、过滤选择率和访问成本,从多个候选执行计划中选择代价较低的方案。
DM8 中与优化器相关的对象统计信息主要分为三类:表统计信息、列统计信息和索引统计信息。
1.1 为什么需要更新统计信息
当表发生大批量导入、迁移、删除、更新,或者数据分布发生明显变化后,已有统计信息可能与真实数据不一致。达梦官方迁移文档明确建议:数据迁移完成并核对无误后,应更新统计信息,否则优化器可能依据错误统计信息生成错误的查询计划。
1.2 静态收集与动态收集
官方《查询优化》手册将统计信息收集分为静态和动态两类。静态收集在查询之前完成,与业务 SQL 的优化过程分离;动态收集发生在生成查询计划的过程中,会增加计划阶段开销。从性能角度,官方更推荐使用静态收集。

2. 如何查看统计信息

学习和运维中最直接的查看方式是使用 DBMS_STATS 包提供的 SHOW 过程。这些过程用于展示已经通过 GATHER_TABLE_STATS、GATHER_INDEX_STATS 或 GATHER_SCHEMA_STATS 收集到的统计信息。
2.1 查看表统计信息:TABLE_STATS_SHOW

CALL DBMS_STATS.TABLE_STATS_SHOW('SYSDBA', 'T_STAT_DEMO');

2.2 查看列统计信息:COLUMN_STATS_SHOW

CALL DBMS_STATS.COLUMN_STATS_SHOW('SYSDBA', 'T_STAT_DEMO', 'CATEGORY');

若某一列数据严重倾斜,仅知道总行数往往不够,直方图可以帮助优化器更准确地估算不同条件值对应的行数。
2.3 查看索引统计信息:INDEX_STATS_SHOW

CALL DBMS_STATS.INDEX_STATS_SHOW('SYSDBA', 'IDX_T_STAT_CATEGORY');

2.4 注意:V$SYSSTAT 不是这里说的“对象统计信息”
DM8 中还存在 V$SYSSTAT 等系统运行统计视图,用于反映数据库运行计数器。本笔记讨论的“统计信息更新”主要指优化器使用的表、列和索引统计信息,不要把二者混为一类。

3. 使用 DBMS_STATS 更新统计信息

DBMS_STATS 是 DM8 系统包中专门用于收集、查看、删除和管理优化统计信息的包。若数据库中尚未创建该系统包,可先执行:

SP_CREATE_SYSTEM_PACKAGES(1, 'DBMS_STATS');

3.1 按表更新:GATHER_TABLE_STATS
最常见的方式是只更新某一张发生大量变化的表。

CALL DBMS_STATS.GATHER_TABLE_STATS(
    'SYSDBA',
    'T_STAT_DEMO',
    NULL,
    100,
    FALSE,
    'FOR ALL COLUMNS SIZE AUTO'
);

3.2 按模式更新:GATHER_SCHEMA_STATS
模式级收集适合迁移完成、整个业务模式都发生明显变化的场景。如果模式中大表很多,全模式收集可能耗时较长。

CALL DBMS_STATS.GATHER_SCHEMA_STATS(
    'SYSDBA',
    100,
    FALSE,
    'FOR ALL COLUMNS SIZE AUTO'
);

GATHER_SCHEMA_STATS 的 OPTIONS 参数可以控制收集范围:
3.4 大表不要习惯性全量 100% 收集
大表更新统计信息时,应优先关注关联列、过滤条件列以及索引统计信息,不要简单地对所有大表执行全表 100% 收集。统计信息越精确并不意味着任何场景都应该付出最大收集成本,需要在准确度和收集开销之间取平衡。

4. 使用 SQL 语言中的 STAT 语句

除了 DBMS_STATS,DM SQL 语言本身也提供 STAT 语句,可直接为表、列或索引生成统计信息。这种方式语句短,适合临时验证和针对单个对象快速收集。
4.1 为整张表生成统计信息

STAT ON SYSDBA.T_STAT_DEMO;

STAT ON 表名用于生成表统计信息。MPP 或 DPC 环境下可以使用 GLOBAL 选项,在各节点数据收集后统一生成统计信息。
4.2 为指定列生成统计信息

STAT 30 ON SYSDBA.T_STAT_DEMO(CATEGORY);

上例表示按照 30% 的采样率收集 CATEGORY 列的统计信息,并覆盖该列之前的旧统计信息。
4.3 指定直方图桶数

STAT 100 SIZE 64 ON SYSDBA.T_STAT_DEMO(CATEGORY);

SIZE 用于指定直方图桶数。列数据分布明显倾斜时,直方图有助于优化器区分不同值的选择率;实际桶数不应机械追求越大越好。
4.4 为索引生成统计信息

STAT 100 ON INDEX SYSDBA.IDX_T_STAT_CATEGORY;

4.5 STAT 的并行收集

STAT /*+ PARALLEL(4) */ ON SYSDBA.T_STAT_DEMO;

说明:STAT 语句同样会导致当前事务提交。生产环境使用前需要确认事务边界。

5. SQL 手册中的统计信息系统过程

DM SQL 语言手册附录还提供了一组 SP_* 统计信息过程。学习时可以把它们看作较直接的系统级接口。

-- 全库:系统自动决定采样率,同时收集列统计信息
CALL SP_DB_STAT_INIT(NULL, 1);

-- 指定表的所有索引
CALL SP_TAB_INDEX_STAT_INIT('SYSDBA', 'T_STAT_DEMO', 50);

-- 针对某条 SQL 涉及的对象收集
CALL SP_SQL_STAT_INIT(
    'SELECT * FROM SYSDBA.T_STAT_DEMO WHERE CATEGORY = 1',
    50
);

6. 实践验证:观察统计信息更新前后的变化

下面给出一套可以在实训库中执行的小实验。重点不是追求固定的执行计划结果,而是验证“统计信息生成—查看—数据变化—重新收集”的完整过程。
6.1 创建测试表并制造倾斜数据

CREATE TABLE T_STAT_DEMO(
    ID       INT,
    CATEGORY INT,
    NOTE     VARCHAR(100)
);

BEGIN
    FOR I IN 1..10000 LOOP
        INSERT INTO T_STAT_DEMO
        VALUES(
            I,
            CASE WHEN I <= 9000 THEN 1 ELSE 2 END,
            'STAT_TEST'
        );
    END LOOP;
    COMMIT;
END;
/

CREATE INDEX IDX_T_STAT_CATEGORY
ON T_STAT_DEMO(CATEGORY);

CATEGORY=1 占约 90%,CATEGORY=2 占约 10%,这是一个明显倾斜的列,适合观察列统计信息和直方图。
6.2 收集前先尝试查看

CALL DBMS_STATS.TABLE_STATS_SHOW('SYSDBA', 'T_STAT_DEMO');
CALL DBMS_STATS.COLUMN_STATS_SHOW('SYSDBA', 'T_STAT_DEMO', 'CATEGORY');

如果对象尚未生成统计信息,展示结果可能为空或不足。不同版本的输出格式可能略有差异,以当前实例为准。
6.3 收集表、列和索引统计信息

CALL DBMS_STATS.GATHER_TABLE_STATS(
    'SYSDBA',
    'T_STAT_DEMO',
    NULL,
    100,
    FALSE,
    'FOR ALL COLUMNS SIZE AUTO'
);

6.4 再次查看

CALL DBMS_STATS.TABLE_STATS_SHOW('SYSDBA', 'T_STAT_DEMO');
CALL DBMS_STATS.COLUMN_STATS_SHOW('SYSDBA', 'T_STAT_DEMO', 'CATEGORY');
CALL DBMS_STATS.INDEX_STATS_SHOW('SYSDBA', 'IDX_T_STAT_CATEGORY');

6.5 大量修改数据,模拟统计信息变旧

BEGIN
    FOR I IN 10001..30000 LOOP
        INSERT INTO T_STAT_DEMO
        VALUES(I, 2, 'NEW_DATA');
    END LOOP;
    COMMIT;
END;
/

真实行数已经从约 1 万变成约 3 万,而且 CATEGORY 的数据分布发生明显变化,但之前保存的对象统计信息并不会因为普通 DML 自动等比例同步为最新值。
6.6 重新收集并对比

STAT 100 ON SYSDBA.T_STAT_DEMO(CATEGORY);

CALL DBMS_STATS.TABLE_STATS_SHOW('SYSDBA', 'T_STAT_DEMO');
CALL DBMS_STATS.COLUMN_STATS_SHOW('SYSDBA', 'T_STAT_DEMO', 'CATEGORY');

image.png

7. 命令速查

-- 1. 创建 DBMS_STATS 系统包(如尚未创建)
SP_CREATE_SYSTEM_PACKAGES(1, 'DBMS_STATS');

-- 2. 表级收集
CALL DBMS_STATS.GATHER_TABLE_STATS(
    'SYSDBA','T_STAT_DEMO',NULL,100,FALSE,'FOR ALL COLUMNS SIZE AUTO'
);

-- 3. 模式级收集
CALL DBMS_STATS.GATHER_SCHEMA_STATS(
    'SYSDBA',100,FALSE,'FOR ALL COLUMNS SIZE AUTO'
);

-- 4. 查看表 / 列 / 索引统计信息
CALL DBMS_STATS.TABLE_STATS_SHOW('SYSDBA','T_STAT_DEMO');
CALL DBMS_STATS.COLUMN_STATS_SHOW('SYSDBA','T_STAT_DEMO','CATEGORY');
CALL DBMS_STATS.INDEX_STATS_SHOW('SYSDBA','IDX_T_STAT_CATEGORY');

-- 5. STAT:表
STAT ON SYSDBA.T_STAT_DEMO;

-- 6. STAT:列(30% 采样)
STAT 30 ON SYSDBA.T_STAT_DEMO(CATEGORY);

-- 7. STAT:列 + 指定直方图桶数
STAT 100 SIZE 64 ON SYSDBA.T_STAT_DEMO(CATEGORY);

-- 8. STAT:索引
STAT 100 ON INDEX SYSDBA.IDX_T_STAT_CATEGORY;

-- 9. 全库统计
CALL SP_DB_STAT_INIT(NULL, 1);

-- 10. 对某条 SQL 涉及对象收集
CALL SP_SQL_STAT_INIT(
    'SELECT * FROM SYSDBA.T_STAT_DEMO WHERE CATEGORY=1',
    50
);

8. 用户、口令、资源限制与模式

DM8 的基础用户管理。DM 中用户首先是数据库登录和权限管理的主体,创建用户时可以同时设置口令、账户状态、资源限制、默认表空间等属性。官方 SQL 手册中的用户管理主要使用 CREATE USER 和 ALTER USER。
8.1 创建用户
若没有显式指定默认表空间,DM 会将 MAIN 表空间作为该用户的默认表空间。
CREATE USER APP_USER IDENTIFIED BY ;
也可以在创建时直接设置资源限制,例如限制单实例最大会话数、会话空闲时间、连续登录失败次数和账户锁定时间:
CREATE PROFILE "SEC_USER"
LIMIT FAILED_LOGIN_ATTEMPS 5,--登录失败次数
PASSWORD_LOCK_TIME 10,--锁定时间分钟
PASSWORD_GRACE_TIME 10,--密码宽限期
CONNECT_IDLE_TIME 10,--会话空闲时间(分钟)
PASSWORD_REUSE_MAX 5;--口令变更次数(可重复次数)
8.2 修改用户口令
用户创建后可通过 ALTER USER 修改口令。每个用户可以修改自己的口令,SYSDBA 可以强制修改其他数据库验证用户的口令。
ALTER USER APP_USER IDENTIFIED BY AppUser_456;
如果实例开启了更严格的原口令校验,用户修改自身口令时可能需要通过 REPLACE 指定原口令:
ALTER USER APP_USER
IDENTIFIED BY AppUser_456
REPLACE AppUser_123;

8.3 用户与模式的关系
用户和模式不是同一个概念。用户主要解决谁登录、拥有什么权限、受什么资源限制;模式则是数据库对象的逻辑命名空间,用来组织表、视图、过程等对象。
例如,由 SYSDBA 为 USER 创建一个额外模式 SALES:
CREATE SCHEMA SALES AUTHORIZATION USER;
/
还可以修改用户的缺省模式:
ALTER USER APP_USER ON SCHEMA SALES;
如果只是 DBA 会话临时切换当前模式,也可以使用 SET SCHEMA:
SET SCHEMA SALES;

9. 表空间创建与大小调整

表空间是 DM 数据文件的逻辑组织单位。创建表空间时至少要指定表空间名、数据文件路径和初始大小;后续容量不足时,常见扩容方式是扩大已有数据文件、增加新的数据文件,或者开启/调整自动扩展。
9.1 创建表空间
1.业务账户和表空间建立
###建议每个用户指定单独表空间
create tablespace "用户名" datafile '/data/dmdata/DAMENG/用户名.dbf' size 1024 autoextend on CACHE = NORMAL;
create tablespace "用户名index" datafile '/data/dmdata/DAMENG/用户名index.dbf' size 512 autoextend on CACHE = NORMAL;
create user "用户名" identified by "密码" default tablespace "用户名" default index tablespace "用户名index";
grant "PUBLIC","RESOURCE","SOI","VTI" to "用户名";
2.修改默认账户和密码
alter user "用户名" identified by "新密码";
注意事项:建议指定一个业务账户,作为业务连接账户使用,创建方式如1
注意 '/data/dmdata/DAMENG' 的目录是否存在,存在直接替换用户名和密码即可,该语句是建立账户,并为账户单独指定表空间。
9.2 直接扩大已有数据文件
如果已有数据文件所在磁盘空间充足,可以直接修改该文件的目标大小。
ALTER TABLESPACE TS_APP
RESIZE DATAFILE '/home/dmdba/dmdata/DAMENG/TS_APP01.DBF'
TO 512;
这种方式最直观:把已有文件从较小容量扩展到更大的容量,不需要增加新的数据文件。
9.3 为表空间增加新的数据文件
如果希望把容量分散到多个数据文件,或者现有单文件不方便继续扩大,可以 ADD DATAFILE。
ALTER TABLESPACE TS_APP
ADD DATAFILE '/home/dmdba/dmdata/DAMENG/TS_APP02.DBF'
SIZE 256
AUTOEXTEND ON NEXT 64 MAXSIZE 2048;
此时 TS_APP 同时拥有 TS_APP01.DBF 和 TS_APP02.DBF,两者共同为该表空间提供容量。
9.4 修改数据文件自动扩展属性
已经存在的数据文件也可以后续开启或调整 AUTOEXTEND。
ALTER TABLESPACE TS_APP
DATAFILE '/home/dmdba/dmdata/DAMENG/TS_APP01.DBF'
AUTOEXTEND ON NEXT 64 MAXSIZE 2048;
9.5 将用户默认表空间切换到新表空间
前面的用户管理和表空间管理可以连起来实践:创建 TS_APP 后,将 APP_USER 的默认表空间和默认索引表空间切换过去。
ALTER USER APP_USER DEFAULT TABLESPACE TS_APP;
ALTER USER APP_USER DEFAULT INDEX TABLESPACE TS_APP;

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服