注册
达梦数据库索引使用监控实战
培训园地/ 文章详情 /

达梦数据库索引使用监控实战

关注永雏塔菲 2026/08/17 205 0 0

达梦数据库索引使用监控实战

日常运维中,表上常常堆了很多二级索引。有的索引创建后业务几乎不怎么用,却一直占用空间,并增加 DML 维护成本。达梦数据库提供了索引使用监控功能,可通过 V$OBJECT_USAGE 判断索引在监控期间是否被使用过,从而辅助清理无用索引。

说明:索引监控仅支持用户创建的二级索引,不支持聚集索引、系统索引、虚索引、数组索引。

1. 准备测试环境

DROP TABLE T_IDX_MON PURGE; CREATE TABLE T_IDX_MON ( ID INT, C_CODE VARCHAR(32), C_NAME VARCHAR(64), C_NOTE VARCHAR(200) ); INSERT INTO T_IDX_MON SELECT LEVEL, 'C'||LEVEL, 'N'||LEVEL, 'NOTE'||LEVEL FROM DUAL CONNECT BY LEVEL <= 20000; COMMIT; -- 创建两个二级索引:一个后续会用到,一个刻意不用 CREATE INDEX IDX_T_CODE ON T_IDX_MON(C_CODE); CREATE INDEX IDX_T_NOTE ON T_IDX_MON(C_NOTE); -- 收集统计信息 CALL SP_TAB_STAT_INIT(USER, 'T_IDX_MON'); SELECT INDEX_NAME, TABLE_NAME FROM USER_INDEXES WHERE TABLE_NAME = 'T_IDX_MON';

01建表与索引.png

2. 确认监控模式

参数 MONITOR_INDEX_FLAG 控制监控方式:

  • 0:手动监控(默认)
  • 1:自动监控
SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME = 'MONITOR_INDEX_FLAG';

手动监控时,才能执行 ALTER INDEX ... MONITORING USAGE。若当前为自动监控,可先改回手动:

ALTER SYSTEM SET 'MONITOR_INDEX_FLAG' = 0 BOTH;

02监控参数.png

3. 开启索引监控

ALTER INDEX IDX_T_CODE MONITORING USAGE; ALTER INDEX IDX_T_NOTE MONITORING USAGE; SELECT * FROM V$OBJECT_USAGE;

刚开启时,USED 一般为 NO,表示监控开始后尚未被使用。

03监控初始状态.png

4. 验证索引是否被使用

执行会命中 C_CODE 条件的 SQL,并查看执行计划:

EXPLAIN SELECT * FROM T_IDX_MON WHERE C_CODE = 'C100';

04执行计划.png

SELECT * FROM T_IDX_MON WHERE C_CODE = 'C100'; SELECT INDEX_NAME, MONITORING, USED, START_MONITORING FROM V$OBJECT_USAGE ORDER BY INDEX_NAME;

此时通常可以看到:

  • IDX_T_CODEUSED 变为 YES
  • IDX_T_NOTE 仍为 NO

05USED对比.png

说明:USED=NO 只表示监控开启以来未见使用,不代表该索引永远无用,生产环境建议覆盖完整业务周期后再判断。

5. 清理未使用索引

确认无业务依赖后,可删除未使用索引:

DROP INDEX IDX_T_NOTE; SELECT INDEX_NAME, TABLE_NAME FROM USER_INDEXES WHERE TABLE_NAME = 'T_IDX_MON';

06删除后验证.png

清理完成后,建议关闭监控,避免额外开销:

ALTER INDEX IDX_T_CODE NOMONITORING USAGE;

6. 自动监控说明

若希望系统自动记录索引使用情况,可将参数设置为 1

ALTER SYSTEM SET 'MONITOR_INDEX_FLAG' = 1 BOTH;

自动监控开启后,一般不能再执行手动的 MONITORING / NOMONITORING。业务运行一段时间后,可通过 V$OBJECT_USAGEUSER_INDEXES 对比,找出未被记录为已使用的普通索引,再评估是否删除。

如需清空监控视图后重新观察,可执行:

CALL SP_DYNAMIC_VIEW_DATA_CLEAR('V$OBJECT_USAGE');

测试结束后建议改回手动模式:

ALTER SYSTEM SET 'MONITOR_INDEX_FLAG' = 0 BOTH;

7. 注意事项

  1. 唯一约束、外键相关索引即使短期未使用,也不要轻易删除。
  2. 删除前建议先备份建索引语句,方便回退。
  3. 观察窗口要覆盖业务高峰和批处理周期,避免误删。
  4. 聚集索引、主键索引不适用本方法。

8. 环境清理

DROP TABLE T_IDX_MON PURGE;

小结

通过 ALTER INDEX ... MONITORING USAGEV$OBJECT_USAGE,可以较客观地识别长期未使用的二级索引。结合业务周期评估后再清理,有助于降低存储占用和 DML 维护成本,提升库的整体健康度。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服