Seal^_^头像
关注
深入理解 DM 页:数据库存储管理的核心基石封面图

深入理解 DM 页:数据库存储管理的核心基石

一、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 日志实现崩溃恢复。

数据库实例

缓冲池 Buffer Pool

DM 页 Page

数据文件

控制文件

日志文件

操作系统磁盘

1.3 DM 页与相关概念的区别:层级关系与大小对比

在数据库存储体系中,DM 页与块、区、段等概念既有联系又有区别,理解它们的关系有助于深入掌握数据库存储原理。

表空间 Tablespace

段 Segment

簇/区 Extent

DM 页 Page

操作系统块 OS Block

各概念的层级关系与大小对比如下:

| 层级 | 名称 | 典型大小 | 说明 |

| --- | --- | --- | --- |

| 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 页中真正存放用户数据的核心区域。以数据页为例,其内部采用行目录加行数据的组织方式,兼顾查找效率和空间利用率。

DM页内部结构

页头 Page Header

行目录 Row Directory

空闲空间 Free Space

行数据区 Row Data

页尾 Page Trailer

行数据的组织遵循以下规则:

  • (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 读页流程详解:缓冲池命中与磁盘加载

当数据库需要访问某个数据页时,首先会检查缓冲池中是否已缓存该页。如果命中缓存则直接使用,否则从磁盘读取。

命中未命中

SQL 请求访问数据

计算目标页号

缓冲池是否命中?

返回缓冲页地址

从磁盘读取页

申请空闲缓冲槽

有空闲槽?

读入数据页

执行 LRU 淘汰

被淘汰页是脏页?

刷盘后回收

直接回收

返回所需数据

读页流程的关键步骤说明:

  • (1) 页号定位:通过对象 ID 和数据偏移计算目标页号。
  • (2) 缓存查找:在缓冲池的哈希表中快速定位。
  • (3) LRU 淘汰:基于最近最少使用算法管理缓冲页。
  • (4) 预读优化:顺序访问时触发异步预读。

3.2 写页流程详解:WAL 机制与脏页管理

DM 页的写入采用 "先写日志后写数据" 的 WAL (Write-Ahead Logging) 机制,确保数据的一致性和可恢复性。

事务修改数据

在缓冲页中修改

生成 Redo 日志

写入日志缓冲区

日志刷盘 WAL

标记缓冲页为脏页

加入脏页链表

Checkpoint 触发刷盘

脏页写入数据文件

从脏页链表移除

写页操作的核心要点:

  • (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 定时触发

脏页比例超阈值

系统空闲时主动刷新

事务提交强制刷新

扫描脏页链表

按 LSN 排序

批量写入磁盘

更新 Checkpoint LSN

清理已刷脏页记录

三种刷新方式的对比:

| 刷新方式 | 触发条件 | 优先级 | 性能影响 |

| --- | --- | --- | --- |

| Checkpoint | 定时或日志量阈值 | 高 | 较大,可能阻塞 |

| LRU 淘汰 | 缓冲池不足 | 中 | 中等 |

| 空闲刷新 | 系统空闲 | 低 | 极小 |

四、DM 页的性能优化:页大小、缓冲池与监控

4.1 页大小选择策略:基于场景的参数决策

页大小是影响数据库性能的关键参数,需要在建库时慎重选择。不同的应用场景适合不同的页大小配置。

OLTP小于 2KB2KB 8KBOLAP混合负载

页大小选择决策

应用类型?

单行数据大小?

选择 8KB 页

选择 16KB 页

选择 32KB 页

选择 16KB 页

验证缓冲命中率

命中率大于 95%?

配置合理

调整缓冲池大小

页大小选择的参考原则:

  • (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 页的运行状态进行持续监控,是保障数据库稳定运行的重要手段。达梦数据库提供了丰富的系统视图用于诊断。

DM 页监控体系

缓冲池监控

页 I/O 监控

等待事件监控

空间使用监控

V$BUFFERPOOL

V$BUFREM

V$SYSSTAT

V$DATAFILE

V$TRXWAIT

DBA_SEGMENTS

DBA_TABLESPACES

常用的监控 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 页中存在大量碎片时,会导致空间浪费和性能下降。以下是完整的诊断与处理流程。

行链接行迁移页空洞

性能下降现象

检查表碎片率

碎片率大于 30%?

排查其他原因

分析碎片成因

碎片类型?

增大页大小或调整行结构

执行表重建

执行 ALTER TABLE MOVE

验证优化效果

性能达标?

优化完成

进一步调优

碎片诊断的具体 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 页的健康运行,建议数据库管理员建立完善的日常运维检查清单。

DM 页日常运维

每日检查

每周检查

每月检查

缓冲命中率

脏页比例

锁等待情况

碎片率分析

I/O 趋势分析

表空间使用率

页大小评估

缓冲池容量规划

归档日志分析

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

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--