索引作为关系型数据库中控制 I/O 和优化检索的核心机制,其底层原理(如 B 树平衡、代价模型估算、最左匹配原则等)在各大数据库之间大多相通。不过此前主要在 PG / openGauss 生态下工作,转到达梦后,其在对象管理体系、物理存储规划以及数据字典的设计上更偏向 Oracle 体系。
通读手册内容,DM 对索引类型的划分比较系统,日常使用中相对高频的有以下几类:
管理员手册中强调的管理准则偏向防御性规范,结合以往经验来看,这些考量点在生产运维中确实比较关键:
在测试库建了一张基础表,根据手册指引进行了几次基础语法演练。
CREATE TABLE WZL.TEST_USER (
USER_ID INT PRIMARY KEY, -- 隐式创建主键聚集/唯一索引
USER_CODE VARCHAR(30) UNIQUE, -- 隐式创建唯一索引
USER_NAME VARCHAR(60),
DEPT_ID INT,
STATUS CHAR(1),
CREATE_TIME DATE
);
DM 支持在创建索引时直接指定专属表空间和存储分配参数:
-- 1. 普通单列索引(指定存放在独立索引表空间 TBS_INDEX)
CREATE INDEX WZL.IDX_USER_DEPT ON WZL.TEST_USER(DEPT_ID) TABLESPACE TBS_INDEX;
-- 2. 复合索引(匹配部门与时间范围的联合查询)
CREATE INDEX WZL.IDX_USER_DEPT_TIME ON WZL.TEST_USER(DEPT_ID, CREATE_TIME) TABLESPACE TBS_INDEX;
-- 3. 基于函数的索引
CREATE INDEX WZL.IDX_USER_NAME_UPPER ON WZL.TEST_USER(UPPER(USER_NAME));
-- 4. 位图索引(适用于低基数状态列)
CREATE BITMAP WZL.INDEX IDX_USER_STATUS ON WZL.TEST_USER(STATUS);
与习惯的执行计划分析类似,DM 可以直接使用 EXPLAIN 查看优化器生成的执行路径:
EXPLAIN SELECT * FROM WZL.TEST_USER WHERE DEPT_ID = 20;
在执行计划的算子输出中:
CSCN2:表示对聚集结构进行扫描,普通表场景下通常可以理解为全表扫描。SSEK2:表示通过索引进行范围查找,例如 scan_range[20,30]。BLKUP2:表示通过索引定位记录后,回到聚集数据区域获取完整数据行。SLCT2:表示对扫描结果进行条件过滤。需要注意,不能仅根据算子名称判断索引类型,建议结合执行计划中的索引名称和 DBA_INDEXES.INDEX_TYPE 一起判断。
与 PG 系直接查 pg_indexes 或 pg_class 不同,DM 的元数据管理更贴近 Oracle 风格的数据字典视图:
-- 查看指定表的索引状态与基本信息
SELECT INDEX_NAME, INDEX_TYPE, UNIQUENESS, STATUS
FROM DBA_INDEXES
WHERE TABLE_NAME = 'TEST_USER';
-- 查看复合索引中字段的排布顺序
SELECT INDEX_NAME, COLUMN_NAME, COLUMN_POSITION
FROM DBA_IND_COLUMNS
WHERE TABLE_NAME = 'TEST_USER'
ORDER BY INDEX_NAME, COLUMN_POSITION;
表经过大批量 DELETE 或高频更新后,B 树叶子节点会出现空间闲置与碎片问题。低峰维护期可以执行重建:
-- 常规重建
ALTER INDEX WZL.IDX_USER_DEPT REBUILD;
-- 在线重建(尽可能降低对在线 DML 事务的排他阻塞)
ALTER INDEX WZL.IDX_USER_DEPT REBUILD ONLINE;
-- 删除冗余或无效索引
DROP INDEX WZL.IDX_USER_DEPT;
这次通读手册并进行了几次基础上手操作,初步体会到以下两点:
DBA_* / USER_*)、表空间物理分配以及聚集索引与主键的默认绑定机制上有着自己的规范,在后续实际项目配置时需要多留意这类细节差异。文章
阅读量
获赞
