这次学习主要围绕达梦分区表上线后的日常维护展开。
分区表的价值不在于“所有查询都会变快”,而在于把一张大表按时间、范围或业务规则拆成更容易管理的多个分区。这样在历史数据清理、归档、按周期装载、按分区统计和局部维护时会更方便。
简单理解:分区表更像是“把大表按规则切成几个管理单元”。如果 SQL 条件能够命中分区键,数据库就有机会只扫描相关分区;如果维护历史数据,也可以直接处理某个分区,而不是对整张大表执行大批量 DELETE。
本次学习可以简化为 5 类常见动作。真正现场执行时,不建议只记语法,更要先判断它改变的是“数据”、“分区结构”,还是“索引和统计信息”。
| 操作 | 一句话理解 | 主要风险 |
|---|---|---|
| ADD / SPLIT | 新增周期分区;如果已有 MAXVALUE,通常要拆 PMAX | 分区边界错误、PMAX 数据量大导致耗时 |
| DROP PARTITION | 删除整个分区及其中数据 | 误删后依赖备份或归档恢复 |
| TRUNCATE PARTITION | 保留分区结构,只清空数据 | 不可按条件细分恢复,需关注索引状态 |
| EXCHANGE PARTITION | 交换分区 | 交换分区本身执行很快,但如果目标分区选错,可能把错误周期的数据换出去或换进来,导致归档周期混乱 |
| SPLIT / MERGE | 拆分或合并分区 | 数据重组、索引维护,数据量大时需要维护窗口 |
| ROW MOVEMENT | 允许更新分区键后跨分区移动 | 误更新分区键会改变数据物理位置 |
如果表尾已经存在 PMAX / MAXVALUE 分区,再直接 ADD 新范围分区,容易因为边界顺序问题失败。更常见的处理方式是先统计 PMAX 中的数据量,再在测试环境验证 SPLIT PMAX,把新周期分区从兜底分区中拆出来。
-- 示例:从 PMAX 中拆出 P202604
ALTER TABLE TEST_PART_LOG
SPLIT PARTITION PMAX AT ('2026-05-01')
INTO (PARTITION P202604, PARTITION PMAX);
DELETE 是行级删除,适合小范围、带条件的删除;TRUNCATE PARTITION 是清空某个分区但保留结构;DROP PARTITION 是连分区结构和数据一起删除。历史数据清理时,优先考虑分区级维护,不建议对大历史表直接做大批量 DELETE。
分区维护不只是表本身的动作,还会影响索引。局部索引通常只影响对应分区,全局索引可能跨多个分区维护,成本更高。达梦分区维护语法中不要照搬 Oracle 的 UPDATE GLOBAL INDEXES / IGNORE GLOBAL INDEXES 子句,操作后应检查 DBA_INDEXES、DBA_IND_PARTITIONS,必要时重建索引。
-- 维护后检查索引状态
SELECT INDEX_NAME, STATUS
FROM DBA_INDEXES
WHERE TABLE_NAME = UPPER('TEST_PART_LOG');
分区新增、清空、交换、拆分、合并后,数据分布可能发生变化。如果统计信息没有及时更新,优化器可能仍按旧数据量估算成本,导致执行计划不理想。大表不一定每次都全表收集,可以优先收集变更分区、条件列、关联列和索引列的统计信息。
如果把分区维护当成一次小型变更,我建议按“前查、执行、后验”三个阶段处理。
| 阶段 | 要做什么 | 目的 |
|---|---|---|
| 变更前 | 确认目标表、目标分区、边界值、行数、最近备份、索引类型、空间余量、是否存在长事务 | 避免操作对象错误,确认有回退路径 |
| 执行中 | 优先在测试环境验证语法和耗时;生产环境避开业务高峰;记录开始时间、结束时间和报错 | 降低执行风险,便于复盘 |
| 变更后 | 检查分区结构、目标分区行数、索引状态、统计信息、关键 SQL 执行计划和应用功能 | 确认维护结果符合预期 |
这次学习后,我对分区表维护的理解是:语法本身并不复杂,真正需要谨慎的是边界、数据量、索引和回退方案。分区维护的优势是可以把大表维护转化为分区级操作,但前提是分区设计、索引设计和统计信息维护要配套。
分区表维护时,优先确认三个问题:第一,操作对象和分区边界是否准确;第二,是否存在全局索引、长事务或空间不足风险,存在风险时是否有可用备份;第三,操作后是否完成索引状态、统计信息和业务 SQL 验证。只要把这三个问题控制住,大多数分区维护操作就能做到有准备、有验证、可回退。
文章
阅读量
获赞
