注册
DM9新特性探索之分区表索引重建高能案例【#达梦数据库 #达梦同行者征文】
专栏/技术分享/ 文章详情 /

DM9新特性探索之分区表索引重建高能案例【#达梦数据库 #达梦同行者征文】

羽书飞影 2026/09/18 352 2 0
摘要

目 录 1
1. 概述 2
1.1 测试目的 2
1.2 功能定义 2
2. 测试环境 2
3. 前置条件——测试数据准备 2
3.1 创建三级分区表(Range → Hash → Hash) 2
3.2 插入测试数据 3
3.3 创建本地索引 3
4. 测试场景与用例 5
场景一:指定索引对象的精确重建 5
测试用例:TC-DM9-IDXREBUILD-001 5
测试用例:TC-DM9-IDXREBUILD-002 6
测试用例:TC-DM9-IDXREBUILD-003 7
场景二:指定表分区的批量维护 7
测试用例:TC-DM9-IDXREBUILD-004 8
测试用例:TC-DM9-IDXREBUILD-005 9
场景三:指定表子分区的深度维护 9
测试用例:TC-DM9-IDXREBUILD-006 9
测试用例:TC-DM9-IDXREBUILD-007 10
5. 附录 12
5.1 操作维度汇总 12
5.2 索引状态查询参考 12
5.3 测试清理脚本 13
6. 测试结果汇总 13
6.1 测试用例执行结果 13
6.2 索引损坏方式验证——达梦9兼容性分析 14
6.3 语法兼容性总结 15
6.4 综合结论 16
6.5 测试结果统计 16

1. 概述

1.1 测试目的

验证达梦数据库(DM9)分区表索引重建功能,确保其支持对分区表中特定分区或子分区的索引进行精确重建,兼容 Oracle 语法,覆盖一级分区索引重建、二级及以上子分区索引重建、以及通过表维度批量重建本地索引等多种场景。

1.2 功能定义

该特性旨在支持对分区表中的特定分区或子分区进行索引重建,除修复损坏索引外,主要用于解决因大量 DML 操作导致特定分区索引碎片过多而引发的性能问题。此功能深度兼容 Oracle 语法,支持一级分区、二级及以上分区的索引精确重建。

2. 测试环境

image.png

3. 前置条件——测试数据准备

在执行所有测试场景前,需先完成以下数据准备工作。

3.1 创建三级分区表(Range → Hash → Hash)

CREATE TABLE t1 (
    c1 INT,
    c2 BIGINT,
    c3 NUMBER(10,1),
    c4 FLOAT(10),
    c5 CHAR(60),
    c6 VARCHAR(50),
    c7 BINARY(8),
    c8 DATE,
    c9 TIME(6)
)
PARTITION BY RANGE(c1)
SUBPARTITION BY HASH(c2) SUBPARTITION TEMPLATE (
    SUBPARTITION h1, SUBPARTITION h2, SUBPARTITION h3
),
SUBPARTITION BY HASH(c3) SUBPARTITION TEMPLATE (
    SUBPARTITION q1, SUBPARTITION q2
)
(
    PARTITION p1 VALUES LESS THAN (1300),
    PARTITION p2 VALUES LESS THAN (11300),
    PARTITION p3 VALUES LESS THAN (MAXVALUE)
);

3.2 插入测试数据

INSERT INTO t1 SELECT
    LEVEL, LEVEL, LEVEL, LEVEL, LEVEL, LEVEL,LEVEL,
    '2024-06-11', '2024-06-11 17:00:00'
FROM DUAL CONNECT BY LEVEL <= 1000000;
COMMIT;

3.3 创建本地索引

CREATE INDEX t1_idx1 ON t1(c1);
CREATE INDEX t1_idx2 ON t1(c2);

4. 测试场景与用例

场景一:指定索引对象的精确重建

此类操作直接作用于索引对象,适用于已知特定分区索引损坏或碎片化的情况。

测试用例:TC-DM9-IDXREBUILD-001

image.png
执行脚本:
– 重建前检查索引分区状态

SELECT INDEX_NAME, PARTITION_NAME, STATUS
FROM USER_IND_PARTITIONS
WHERE INDEX_NAME = 'T1_IDX1';

image.png
– 重建一级分区索引

ALTER INDEX t1_idx1 REBUILD PARTITION p1;

– 重建后验证状态

SELECT INDEX_NAME, PARTITION_NAME, STATUS
FROM USER_IND_PARTITIONS
WHERE INDEX_NAME = 'T1_IDX1';

image.png

测试用例:TC-DM9-IDXREBUILD-002

image.png
执行脚本:
– 重建前检查索引子分区状态

SELECT INDEX_NAME, PARTITION_NAME, SUBPARTITION_NAME, STATUS
FROM USER_IND_SUBPARTITIONS
WHERE INDEX_NAME = 'T1_IDX1' AND SUBPARTITION_NAME='H1';

image.png
– 重建特定子分区索引

ALTER INDEX t1_idx1 REBUILD SUBPARTITION p1_h1;

image.png
– 重建后验证状态

SELECT INDEX_NAME, PARTITION_NAME, SUBPARTITION_NAME, STATUS
FROM USER_IND_SUBPARTITIONS
WHERE INDEX_NAME = 'T1_IDX1';

image.png

测试用例:TC-DM9-IDXREBUILD-003

image.png
执行脚本:
– 仅指定子分区名,系统深度优先匹配

ALTER INDEX t1_idx2 REBUILD SUBPARTITION h1;

image.png
– 验证被重建的子分区状态

SELECT INDEX_NAME, PARTITION_NAME, SUBPARTITION_NAME, STATUS
FROM USER_IND_SUBPARTITIONS
WHERE INDEX_NAME = 'T1_IDX2' AND SUBPARTITION_NAME = 'H1';

image.png

场景二:指定表分区的批量维护

此类操作通过修改表属性触发,适用于对整个分区内的所有本地索引进行统一维护。

测试用例:TC-DM9-IDXREBUILD-004

image.png
执行脚本:
– 检查当前索引状态

SELECT i.INDEX_NAME, ip.PARTITION_NAME, ip.STATUS
FROM USER_INDEXES i, USER_IND_PARTITIONS ip
WHERE i.INDEX_NAME = ip.INDEX_NAME
  AND i.TABLE_NAME = 'T1' AND ip.PARTITION_NAME='P1' and i.INDEX_NAME NOT like  'INDEX%';

image.png
– 批量重建分区下全部本地索引

ALTER TABLE t1 MODIFY PARTITION p1 REBUILD LOCAL INDEXES;

– 验证索引状态

FROM USER_INDEXES i, USER_IND_PARTITIONS ip
WHERE i.INDEX_NAME = ip.INDEX_NAME
  AND i.TABLE_NAME = 'T1' AND ip.PARTITION_NAME='P1' and i.INDEX_NAME NOT like  'INDEX%';

image.png

测试用例:TC-DM9-IDXREBUILD-005

image.png
执行脚本:
– 执行仅重建失效索引

ALTER TABLE t1 MODIFY PARTITION p1 REBUILD UNUSABLE LOCAL INDEXES;

– 验证:之前标记为 UNUSABLE 的分区应恢复为 USABLE

SELECT INDEX_NAME, PARTITION_NAME, SUBPARTITION_NAME, STATUS
FROM USER_IND_SUBPARTITIONS
WHERE INDEX_NAME IN ('T1_IDX1', 'T1_IDX2')
  AND PARTITION_NAME = 'P1';

image.png

场景三:指定表子分区的深度维护

针对二级或更深层级的子分区进行索引维护。

测试用例:TC-DM9-IDXREBUILD-006

image.png
执行脚本:
– 检查子分区索引状态

SELECT INDEX_NAME, PARTITION_NAME, SUBPARTITION_NAME, STATUS
FROM USER_IND_SUBPARTITIONS
WHERE SUBPARTITION_NAME = 'P1_H1';

image.png
– 重建子分区全部本地索引

ALTER TABLE t1 MODIFY SUBPARTITION p1_h1 REBUILD LOCAL INDEXES;

– 验证索引状态

SELECT INDEX_NAME, PARTITION_NAME, SUBPARTITION_NAME, STATUS
FROM USER_IND_SUBPARTITIONS
WHERE SUBPARTITION_NAME = 'P1_H1';

image.png

测试用例:TC-DM9-IDXREBUILD-007

image.png
执行脚本:
– 重建多级子分区失效索引

ALTER TABLE t1 MODIFY SUBPARTITION p1_h1_q1 REBUILD UNUSABLE LOCAL INDEXES;

– 验证索引恢复情况

SELECT INDEX_NAME, PARTITION_NAME, SUBPARTITION_NAME, STATUS
FROM USER_IND_SUBPARTITIONS
WHERE PARTITION_NAME = 'P1';

image.png

5. 附录

5.1 操作维度汇总

image.png

5.2 索引状态查询参考

-- 查询索引分区状态
SELECT INDEX_NAME, PARTITION_NAME, STATUS
FROM USER_IND_PARTITIONS
WHERE INDEX_NAME = '<INDEX_NAME>';

-- 查询索引子分区状态
SELECT INDEX_NAME, PARTITION_NAME, SUBPARTITION_NAME, STATUS
FROM USER_IND_SUBPARTITIONS
WHERE INDEX_NAME = '<INDEX_NAME>';

-- 批量查询所有不可用索引
SELECT INDEX_NAME, PARTITION_NAME, SUBPARTITION_NAME, STATUS
FROM USER_IND_SUBPARTITIONS
WHERE STATUS = 'UNUSABLE';

5.3 测试清理脚本

DROP TABLE t1 PURGE;

6. 测试结果汇总

6.1 测试用例执行结果

以下汇总了所有测试用例的实际执行结果(达梦 DM9-9.1.0.26):
image.png
image.png
以上 7 个测试用例中 7 个全部通过,通过率 100%。验证了达梦9在分区表索引重建方面的 Oracle 语法兼容性良好。

6.2 索引损坏方式验证——达梦9兼容性分析

为配合重建测试的正常执行,需先模拟索引损坏场景。以下是在达梦9环境下对各种损坏方式的验证结果:
image.png

6.3 语法兼容性总结

image.png
image.png

6.4 综合结论

基于本次测试,得出以下结论:
达梦9(DM9-9.1.0.26)在分区表索引重建方面对 Oracle 语法的兼容性良好。7 个核心测试用例全部通过验证,ALTER INDEX REBUILD PARTITION / SUBPARTITION 以及 ALTER TABLE MODIFY PARTITION / SUBPARTITION REBUILD [UNUSABLE] LOCAL INDEXES 均能稳定执行。

6.5 测试结果统计

image.png

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服