一、DM 页概述:理解存储管理的基本概念
1.1 什么是 DM 页:基本定义与核心特征
DM 页是达梦数据库中数据存储和管理的最小逻辑单元,也是数据库系统进行磁盘 I/O 操作的基本单位。在达梦数据库的体系结构中,所有的数据、索引、控制信息都以页为单位进行组织和管理。
DM 页的大小在创建数据库时指定,默认值为 8KB,也可以设置为 4KB、16KB 或 32KB。一旦数据库创建完成,页大小便不可更改,因此合理选择页大小对数据库性能至关重要。
DM 页的核心特点如下:
- (1) 固定大小:每个页的大小在数据库初始化时确定。
- (2) 唯一标识:每个页通过页号进行唯一标识。
- (3) 原子读写:数据库对页的读写操作是原子性的。
- (4) 缓冲管理:页通过缓冲池进行缓存管理。
1.2 DM 页的作用与意义:承上启下的存储枢纽
DM 页在达梦数据库中承担着承上启下的关键作用,向上为表、索引等逻辑对象提供存储载体,向下与操作系统文件系统进行交互。
DM 页的核心价值体现在以下几个方面:
- (1) 统一的存储管理:所有对象使用统一的页格式存储。
- (2) 高效的 I/O 性能:以页为单位批量读写,减少 I/O 次数。
- (3) 事务支持:基于页实现 MVCC 多版本并发控制。
- (4) 故障恢复:通过页的 redo/undo 日志实现崩溃恢复。
1.3 DM 页与相关概念的区别:层级关系与大小对比
在数据库存储体系中,DM 页与块、区、段等概念既有联系又有区别,理解它们的关系有助于深入掌握数据库存储原理。
各概念的层级关系与大小对比如下:
| 层级 | 名称 | 典型大小 | 说明 |
| --- | --- | --- | --- |
| 1 | 表空间 | 多个数据文件 | 最大的逻辑存储单元 |
| 2 | 段 | 动态扩展 | 同一对象占用的所有空间 |
| 3 | 簇/区 | 默认 16 个页 | 连续的页集合,分配基本单位 |
| 4 | DM 页 | 8KB/16KB/32KB | I/O 操作的最小单元 |
| 5 | 操作系统块 | 4KB/8KB | 文件系统块大小 |
二、DM 页的内部结构:页头、数据区与校验机制
2.1 页头信息详解:元数据的存储与解析
每个 DM 页的开头都包含一个固定的页头,用于存储该页的元数据信息。页头是数据库管理系统识别和管理页的关键依据。
页头主要包含以下字段:
| 字段名 | 长度 | 说明 |
| --- | --- | --- |
| page_type | 1 字节 | 页类型标识 |
| page_version | 1 字节 | 页版本号 |
| page_no | 4 字节 | 页号,全局唯一 |
| page_lsn | 8 字节 | 页面对应的日志序列号 |
| free_space | 2 字节 | 空闲空间大小 |
| object_id | 4 字节 | 所属对象 ID |
DM 页的类型主要包括以下几种:
- (1) 数据页:存储表中的行数据。
- (2) 索引页:存储 B 树索引节点。
- (3) 回滚页:存储 undo 信息。
- (4) 系统页:存储系统元数据。
- (5) 大字段页:存储 LOB 数据。
2.2 数据存储区详解:行目录与行数据的组织
数据存储区是 DM 页中真正存放用户数据的核心区域。以数据页为例,其内部采用行目录加行数据的组织方式,兼顾查找效率和空间利用率。
行数据的组织遵循以下规则:
- (1) 行从页底向上增长,行目录从页头向下增长。
- (2) 新行插入时优先使用空闲空间。
- (3) 删除行后产生的空洞通过行迁移或页整理回收。
- (4) 每行数据包含行头和列数据两部分。
行头结构的关键字段说明:
-- 查询 DM 页中行数据的存储情况
-- 需要以 SYSDBA 身份连接数据库
SELECT
TABLESPACE_NAME,
TABLE_NAME,
NUM_ROWS,
AVG_ROW_LEN,
BLOCKS AS PAGE_COUNT
FROM USER_TABLES
WHERE TABLE_NAME = 'YOUR_TABLE_NAME';
2.3 页尾校验与完整性保护:物理一致性的保障
DM 页的页尾存储校验信息,用于检测页在写入磁盘过程中是否发生损坏。这一机制是数据库物理完整性的重要保障。
页尾主要包含以下内容:
- (1) 校验和:基于页内容计算的校验值。
- (2) 页号副本:与页头页号对照,防止页错位。
- (3) LSN 副本:与页头 LSN 对照,保证一致性。
三、DM 页的读写流程:缓存、WAL 与脏页刷新
3.1 读页流程详解:缓冲池命中与磁盘加载
当数据库需要访问某个数据页时,首先会检查缓冲池中是否已缓存该页。如果命中缓存则直接使用,否则从磁盘读取。
读页流程的关键步骤说明:
- (1) 页号定位:通过对象 ID 和数据偏移计算目标页号。
- (2) 缓存查找:在缓冲池的哈希表中快速定位。
- (3) LRU 淘汰:基于最近最少使用算法管理缓冲页。
- (4) 预读优化:顺序访问时触发异步预读。
3.2 写页流程详解:WAL 机制与脏页管理
DM 页的写入采用 "先写日志后写数据" 的 WAL (Write-Ahead Logging) 机制,确保数据的一致性和可恢复性。
写页操作的核心要点:
- (1) 修改操作先在内存缓冲页中进行。
- (2) Redo 日志必须在脏页刷盘前先写入磁盘。
- (3) 脏页通过后台线程异步刷新到磁盘。
- (4) Checkpoint 机制确保恢复时间可控。
以下是通过系统视图监控脏页情况的 SQL:
-- 查询缓冲池脏页统计信息
SELECT
NAME AS 缓冲池名称,
N_PAGES AS 总页数,
N_DIRTY AS 脏页数,
ROUND(N_DIRTY * 100.0 / N_PAGES, 2) AS 脏页比例
FROM V$BUFFERPOOL
ORDER BY N_DIRTY DESC;
3.3 脏页刷新机制详解:多策略协同的刷盘方案
DM 数据库通过多种机制协同刷新脏页,在保证数据安全的同时兼顾性能。主要包括 Checkpoint 刷新、LRU 刷新和空闲刷新三种方式。
三种刷新方式的对比:
| 刷新方式 | 触发条件 | 优先级 | 性能影响 |
| --- | --- | --- | --- |
| Checkpoint | 定时或日志量阈值 | 高 | 较大,可能阻塞 |
| LRU 淘汰 | 缓冲池不足 | 中 | 中等 |
| 空闲刷新 | 系统空闲 | 低 | 极小 |
四、DM 页的性能优化:页大小、缓冲池与监控
4.1 页大小选择策略:基于场景的参数决策
页大小是影响数据库性能的关键参数,需要在建库时慎重选择。不同的应用场景适合不同的页大小配置。
页大小选择的参考原则:
- (1) OLTP 场景推荐 8KB,单页容纳更多行,提高缓存效率。
- (2) OLAP 场景推荐 32KB,减少全表扫描的 I/O 次数。
- (3) 大字段较多时选择较大页,减少行链接。
- (4) 并发更新频繁时选择较小页,降低页锁竞争。
4.2 缓冲池配置优化:命中率提升与参数调优
缓冲池是 DM 页在内存中的缓存区域,合理配置缓冲池大小直接决定数据库的读取性能。
-- 查询当前缓冲池配置与命中率
SELECT
NAME AS 缓冲池名称,
N_PAGES AS 总页数,
N_LOGIC_READ AS 逻辑读次数,
N_PHYSICAL_READ AS 物理读次数,
ROUND(
(1 - N_PHYSICAL_READ * 1.0 / NULLIF(N_LOGIC_READ, 0)) * 100,
2
) AS 缓冲命中率
FROM V$BUFFERPOOL;
缓冲池调优的关键指标:
- (1) 缓冲命中率:应保持在 95% 以上。
- (2) 等待事件:关注 buffer busy waits 等待。
- (3) 脏页比例:控制在 20% 以下。
- (4) LRU 淘汰频率:淘汰过快说明缓冲不足。
缓冲池配置的建议:
-- 设置缓冲池大小 (需重启生效)
-- 示例:设置内存缓冲池为 4GB
ALTER SYSTEM SET 'BUFFER' = 4096 DEFERRED;
-- 查看内存配置参数
SELECT PARA_NAME, PARA_VALUE
FROM V$DM_INI
WHERE PARA_NAME IN ('BUFFER', 'MAX_BUFFER', 'RECYCLE');
4.3 监控与诊断方法:系统视图与告警阈值
对 DM 页的运行状态进行持续监控,是保障数据库稳定运行的重要手段。达梦数据库提供了丰富的系统视图用于诊断。
常用的监控 SQL 汇总:
-- 1. 监控各数据文件的 I/O 情况
SELECT
PATH AS 文件路径,
PHY_RBLK_CNT AS 物理读块数,
PHY_WBLK_CNT AS 物理写块数,
READ_TIME AS 读耗时,
WRITE_TIME AS 写耗时
FROM V$DATAFILE
ORDER BY PHY_RBLK_CNT DESC;
-- 2. 监控缓冲池等待事件
SELECT
NAME AS 事件名称,
TRX_ID AS 事务ID,
WAIT_TIME AS 等待时间
FROM V$TRXWAIT
WHERE WAIT_TIME > 0
ORDER BY WAIT_TIME DESC;
-- 3. 查看表空间页使用情况
SELECT
TABLESPACE_NAME AS 表空间名,
BYTES / 1024 / 1024 AS 已用空间MB,
(BYTES / MAXBYTES) * 100 AS 使用率
FROM DBA_TABLESPACES T
JOIN V$DATAFILE F ON T.TABLESPACE_NAME = F.TABLESPACE_NAME;
监控指标的告警阈值参考:
| 监控指标 | 正常范围 | 告警阈值 | 危险阈值 |
| --- | --- | --- | --- |
| 缓冲命中率 | 大于 95% | 90% 至 95% | 小于 90% |
| 脏页比例 | 小于 10% | 10% 至 20% | 大于 20% |
| 物理读速率 | 小于 1000/秒 | 1000-5000/秒 | 大于 5000/秒 |
| 页等待时间 | 小于 10ms | 10-50ms | 大于 50ms |
五、DM 页的实践案例:碎片、锁争用与综合调优
5.1 页碎片问题诊断与处理:从发现到消除
当 DM 页中存在大量碎片时,会导致空间浪费和性能下降。以下是完整的诊断与处理流程。
碎片诊断的具体 SQL:
-- 1. 查询表的碎片情况
SELECT
TABLE_NAME AS 表名,
NUM_ROWS AS 行数,
BLOCKS AS 占用页数,
EMPTY_BLOCKS AS 空页数,
AVG_SPACE AS 平均空闲空间,
CHAIN_CNT AS 行链行数,
ROUND(
(1 - NUM_ROWS * AVG_ROW_LEN / (BLOCKS * 8192)) * 100,
2
) AS 碎片率
FROM USER_TABLES
WHERE CHAIN_CNT > 0
OR BLOCKS > 1000
ORDER BY 碎片率 DESC;
-- 2. 消除行链接和行迁移
-- 方式一:导出导入重建表
-- 导出数据
EXPORT TABLE SCHEMA.TABLE_NAME TO '/path/export.dmp';
-- 清空表
TRUNCATE TABLE SCHEMA.TABLE_NAME;
-- 导入数据
IMPORT TABLE SCHEMA.TABLE_NAME FROM '/path/export.dmp';
-- 方式二:在线重定义 (生产环境推荐)
-- 创建新表
CREATE TABLE SCHEMA.TABLE_NAME_NEW AS
SELECT * FROM SCHEMA.TABLE_NAME WHERE 1=0;
-- 交换数据
ALTER TABLE SCHEMA.TABLE_NAME
EXCHANGE PARTITION WITH TABLE SCHEMA.TABLE_NAME_NEW;
5.2 页锁争用问题优化:高并发场景的破局
在高并发场景下,多个事务争用同一 DM 页会导致严重的锁等待问题。正确识别和优化页锁争用是提升并发性能的关键。
页锁争用诊断 SQL:
-- 1. 查询当前锁等待情况
SELECT
W.TRX_ID AS 等待事务ID,
W.TABLE_ID AS 表ID,
W.LTYPE AS 锁类型,
W.LMODE AS 锁模式,
W.BLOCKED AS 阻塞事务ID,
S.SQL_TEXT AS 当前SQL
FROM V$TRXWAIT W
LEFT JOIN V$SESSIONS S ON W.TRX_ID = S.TRX_ID
WHERE W.WAIT_TIME > 1000;
-- 2. 查询热点页信息
SELECT
TABLE_NAME AS 表名,
PAGE_NO AS 页号,
LOCK_COUNT AS 锁次数,
WAIT_COUNT AS 等待次数,
AVG_WAIT_TIME AS 平均等待时间
FROM V$LOCK_STAT
WHERE WAIT_COUNT > 100
ORDER BY WAIT_COUNT DESC;
5.3 综合性能调优实战:报表查询优化全流程
结合前面介绍的知识点,下面通过一个真实案例展示 DM 页的完整调优过程。
调优前后的关键指标对比:
| 指标 | 调优前 | 调优后 | 提升幅度 |
| --- | --- | --- | --- |
| 缓冲命中率 | 82.3% | 97.6% | +15.3% |
| 平均查询时间 | 3.2 秒 | 0.4 秒 | -87.5% |
| 物理读次数 | 152 万 | 23 万 | -84.9% |
| 脏页比例 | 28% | 8% | -71.4% |
调优实施的关键 SQL 步骤:
-- 步骤 1: 增大缓冲池
ALTER SYSTEM SET 'BUFFER' = 8192 DEFERRED;
-- 步骤 2: 设置检查点间隔优化
ALTER SYSTEM SET 'CKPT_INTERVAL' = 180 DEFERRED;
ALTER SYSTEM SET 'CKPT_FLUSH_RATE' = 5 DEFERRED;
-- 步骤 3: 重建热点表消除碎片
ALTER TABLE REPORT_DAILY MOVE ONLINE;
-- 步骤 4: 优化索引
-- 删除低效索引
DROP INDEX IDX_REPORT_DATE_old;
-- 创建组合索引
CREATE INDEX IDX_REPORT_DATE_REGION
ON REPORT_DAILY(REPORT_DATE, REGION_CODE)
ONLINE;
-- 步骤 5: 验证优化效果
SELECT
NAME AS 缓冲池名称,
N_LOGIC_READ AS 逻辑读,
N_PHYSICAL_READ AS 物理读,
ROUND((1 - N_PHYSICAL_READ * 1.0 /
NULLIF(N_LOGIC_READ, 0)) * 100, 2) AS 命中率
FROM V$BUFFERPOOL;
六、DM 页管理的最佳实践:运维清单与配置推荐
6.1 日常运维清单:日周月三级检查体系
为保障 DM 页的健康运行,建议数据库管理员建立完善的日常运维检查清单。
6.2 参数配置推荐:OLTP 场景的黄金配置
根据不同的应用场景,以下是 DM 页相关参数的推荐配置:
-- OLTP 场景推荐配置
ALTER SYSTEM SET 'BUFFER' = 4096 DEFERRED;
ALTER SYSTEM SET 'MAX_BUFFER' = 8192 DEFERRED;
ALTER SYSTEM SET 'RECYCLE' = 1024 DEFERRED;
ALTER SYSTEM SET 'CKPT_INTERVAL' = 180 DEFERRED;
ALTER SYSTEM SET 'CKPT_FLUSH_RATE' = 5 DEFERRED;
ALTER SYSTEM SET 'FAST_POOL_PAGES' = 5000 DEFERRED;
ALTER SYSTEM SET 'FAST_ROLLBACK' = 1 DEFERRED;
6.3 常见问题速查表:现象、原因与方案
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
| --- | --- | --- | --- |
| 缓冲命中率低 | 缓冲池不足 | 查 V$BUFFERPOOL | 增大 BUFFER 参数 |
| 查询变慢 | 页碎片过多 | 查 USER_TABLES | 重建表 |
| 并发等待 | 页锁争用 | 查 V$TRXWAIT | 优化业务或分散数据 |
| 磁盘 I/O 高 | 脏页刷盘频繁 | 查 V$SYSSTAT | 调整检查点参数 |
| 空间增长快 | 页空洞过多 | 查 DBA_SEGMENTS | 收缩表空间 |
| 恢复时间长 | Checkpoint 落后 | 查 V$RLOG | 调整刷脏策略 |
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/qq_41840843/article/details/163720678




