一、引言
在数据库管理领域,性能监控与调优是永恒的主题。达梦数据库作为国产数据库的代表,通过动态性能视图(以V$为前缀的系统视图)为管理员提供了一扇观察数据库内部运行状态的窗口。这些视图实时反映数据库的内存使用、会话活动、SQL 执行效率等关键指标,是诊断性能问题、优化系统配置的核心工具。
达梦动态性能视图作为数据库运行过程中的重要辅助工具,其数据构建于内存结构、进程状态及系统统计等信息之上。相较于常规用户表,这类视图呈现出较为独特的特性:数据状态往往与数据库运行状态紧密关联,呈现出随系统运行动态更新的特征,且在数据库关闭时,相关数据通常会失去存储状态。
本文将结合达梦官方文档与实际案例,全面解析动态性能视图的原理、分类、常用场景及最佳实践,帮助读者掌握通过动态视图实现高效运维的核心技能。了解一些常见动态视图,然后能通过这些动态视图排查问题。
二、动态性能视图的基础架构与权限管理
2.1 视图结构与命名规范
达梦的动态性能视图采用与 Oracle 类似的V$命名约定,例如V$SESSIONS(会话信息)、V$SQL_PLAN(SQL 执行计划)等。这些视图由系统自动维护,数据实时更新,无需用户干预。
- 全局同义词:所有动态视图在
SYS模式下定义,但DM为每个视图创建了同名的全局同义词,用户可直接通过V$VIEW_NAME访问,无需指定模式名。 - DMDPC 环境支持:在
DMDPC集群中,查询动态视图会自动汇总所有节点的信息,方便跨节点监控。
2.2 权限控制与安全注意事项
- 权限要求:默认情况下,仅
SYSDBA用户或具有DBA角色的用户可访问动态视图。普通用户需通过GRANT SELECT ON SYS.VIEW_NAME TO USER显式授权。 - 敏感信息保护:动态视图包含数据库版本、内存分配、事务状态等敏感数据,需严格控制访问权限,避免信息泄露。
三、核心动态性能视图详解
达梦的动态性能视图覆盖系统信息、存储结构、SQL 执行、事务管理等多个维度,以下是关键视图的深度解析。
3.1 系统信息与资源监控
3.1.1 V$INSTANCE:实例状态监控
核心功能:提供数据库实例的基本信息,包括版本号、启动时间、运行状态(如
MOUNTED、OPEN)、主机名等。该视图的查询结果能够快速判断数据库是否正常运行、是否启用归档(影响数据恢复能力)、以及当前版本是否需要补丁更新等关键信息。核心字段:
- INSTANCE_NAME: 实例名称(默认与数据库名称一致);
- STATUS$: 实例状态(
STARTUP/MOUNTED/OPEN/SUSPENDED) - START_TIME: 实例启动时间
- SVR_VERSION: 数据库版本号
- HOST_NAME: 运行实例的主机名
- BUILD_TIME: 实例初始化时间
典型应用场景:
SELECT INSTANCE_NAME, VERSION, STARTUP_TIME, STATUS FROM V$INSTANCE;复制
如下图所示,即为查询视图V$INSTANCE所展示结果。
3.1.2 V$MEM_POOL:内存池管理
核心功能:达梦数据库采用内存池(
Memory Pool)机制管理内存,V$MEM_POOL视图详细记录了各内存池的分配与使用情况。监控达梦内存池(MEMORY_POOL)的使用情况,包括总内存、已用内存、碎片率等。核心字段:
- NAME: 内存池名称
- ORG_SIZE:初始大小,参数文件配置大小(字节)
- RESERVED_SIZE:实际使用大小(字节)
- DATA_SIZE:当前分配出去的数据占用大小(字节)
- TOTAL_SIZE:当前内存池总大小(字节)
- EXTEND_SIZE: 每次拓展的块大小(字节)
- TARGET_SIZE: 可以扩展到的大小,当TARGET_SIZE为0时,不限制此内存池的扩展;对于共享内存池,即时TARGET_SIZE不为0,也不限制其扩展,TARGET_SIZE 用于提示系统尽快把内存占用释放到 TARGET_SIZE 以下
典型应用场景: 检查内存池使用情况
SELECT NAME, ROUND(ORG_SIZE/1024/1024, 2) AS ORG_MB, ROUND(RESERVED_SIZE/1024/1024, 2) AS RESERVED_MB, ROUND(DATA_SIZE/1024/1024, 2) AS DATA_MB, ROUND(TOTAL_SIZE/1024/1024, 2) AS TOTAL_MB, ROUND(EXTEND_SIZE/1024/1024, 2) AS EXTEND_MB, ROUND(TARGET_SIZE/1024/1024, 2) AS TARGET_MB FROM V$MEM_POOL复制

3.1.3 V$BUFFERPOOL:数据缓冲区监控
核心功能:数据缓冲区(Buffer Pool)是内存中最重要的部分,V$BUFFERPOOL视图专门用于监控缓冲区性能,分析数据缓冲区(
BUFFER)的使用效率,包括命中率、脏页数量、缓冲区大小等。核心字段:
NAME: 缓冲区名称
PAGE_SIZE: 基缓冲区页大小,不包括扩展池页
N_PAGES: 页数
FREE: 空闲页数目
N_DIRTY: 脏页数目
N_TOTAL_PAGES: 页总数,包括扩展池页
N_LOGIC_READS: READ 命中的次数
N_PHY_READS: READ 未命中的次数
RAT_HIT: 命中率
典型应用场景:
命中率计算:
SELECT NAME,CASE WHEN (N_LOGIC_READS + N_PHY_READS)=0 THEN 0 ELSE(1 - (N_PHY_READS / (N_LOGIC_READS + N_PHY_READS))) * 100 END AS BUFFER_HIT_RATIO FROM V$BUFFERPOOL;复制
SELECT NAME,RAT_HIT * 100 as BUFFER_HIT_RATIO FROM V$BUFFERPOOL;复制

- 若命中率低于 80%,需考虑增加
BUFFER参数值或优化 SQL 减少物理读。
3.2 会话与事务管理
3.2.1 V$SESSIONS:会话状态监控
核心功能:实时跟踪所有会话的详细信息,包括会话 ID、用户、客户端 IP、执行的 SQL 语句、等待事件等。
核心字段:
SESS_ID: 会话 ID,系统内部标识
SQL_TEST: 取 sql 的头 1000 个字符
STATE: 会话状态。
CREATE创建,表示会话对象已创建,但还不能使用;STARTUP启动,表示会话正在启动中;IDLE空闲,表示会话当前没有执行操作;ACTIVE活动,表示会话当前正在执行操作;PENDING限流等待,当INI参数MAX_CONCURRENT_TRX>0时,会话可能会因为并行事务限流而处于此状态;FREEING正在释放,表示会话正在被释放;USER_NAME: 当前用户
TRX_ID: 事务 id,为 0 表示事务未开始或事务已结束
CLNT_IP: 客户端 IP
CLNT_HOST: 客户端主机名
典型应用场景:
查询活跃会话:
SELECT SESS_ID, USER_NAME, CLNT_IP, SQL_TEXT FROM V$SESSIONS WHERE STATE= 'ACTIVE';复制
定位阻塞会话:结合
V$LOCK和V$TRXWAIT视图分析锁等待问题。

3.2.2 V$TRX:事务监控
核心功能:记录当前所有事务的状态,包括事务 ID、开始时间、锁持有情况、回滚段使用等。
核心字段:
ID: 当前活动事务的 ID 号
STATUS: 当前事务的状态。
NOT START未开始任何操作;ACTIVE活动;LOCK WAIT锁等待;ROLLING正在回滚;PRE_COMMIT两阶段事务的预提交状态;TO_RELEASE DPC环境下分布式事务的等待释放状态。分布式事务完成第二阶段提交后转入TO_RELEASE状态,分布式事务在所有节点都转入TO_RELEASE状态后才允许释放ISOLATION: 隔离级。0:读未提交;1:读提交;2:可重复读;3:串行化
SESS_ID: 当前事务的所在会话 ID,系统内部标识
THRD_ID: 当前事务对应的线程 ID
典型应用场景:
等待事务排查:
//查询正在等待的事务列表 SELECT * FROM V$TRXWAIT;复制
//根据查询出来的事务id查询事务详情
SELECT ID,SESS_ID,SQL_TEST,CLNT_IP, SQL_TEXT
FROM VTRXALEFTJOINVSESSIONS B WHEN A.SESS_ID = B.SESSID
WHERE ID = (上面查询出来的id)
3.3 SQL 执行与优化
3.3.1 V$SQLTEXT:缓冲区中SQL 语句信息
核心功能:V$SQL视图存储了数据库缓存的 SQL 语句信息,是 SQL 性能优化的核心依据。
核心字段:
SQL_ID:SQL 语句唯一标识
SQL_TEXT:SQL 语句内容
N_EXEC:执行次数
典型应用场景:
- 查找执行次数最多的SQL
SELECT SQL_ID,SQL_TEXT,N_EXEC FROM V$SQLTEXT ORDER BY N_EXEC DESC LIMIT 1复制

3.3.2 V$SQL_PLAN:执行计划分析
核心功能:展示 SQL 语句的执行计划,包括操作符类型、访问路径、成本估算等。在 ini 参数 USE_PLN_POOL !=0 时才统计。
核心字段:
SQL_ID: 语句编号
SQLSTR: 语句内容
N_SUBPLNS: 子计划个数
PLN_ADDR: 计划在缓存中的地址
RT_METHOD: 计划的运行时方法
典型应用场景:
生成执行计划:
EXPLAIN SELECT * FROM TABLE_NAME WHERE COLUMN = 'VALUE'; SELECT * FROM V$SQL_PLAN;复制
3.3.3 V$LONG_EXEC_SQLS:慢查询监控
核心功能:当 INI 参数 ENABLE_MONITOR=1 时,显示系统最近 n 条执行时间超过预定值的 SQL 语句。n 由 INI 参数 LONG_EXEC_SQLS_CNT 指定。默认预定值为 1000 毫秒,可通过 SP_SET_LONG_TIME 系统函数修改,通过 SF_GET_LONG_TIME 系统函数查看当前值。记录执行时间超过阈值的 SQL 语句,包括执行时长、逻辑读、物理读等指标。
核心字段:
SESS_ID: 会话 ID,系统内部标识
SQL_TEXT: SQL 文本
EXEC_TIME: 执行时间,单位毫秒
FINISH_TIME: 执行结束时间
N_RUNS: 执行次数
TRX_ID: 事务号
典型应用场景:
TOP 10 慢查询:
SELECT SQL_TEXT, EXEC_TIME, SESS_ID FROM V$LONG_EXEC_SQLS ORDER BY EXEC_TIME DESC FETCH FIRST 10 ROWS ONLY;复制
对频繁执行的慢查询,需检查索引是否缺失或执行计划是否合理。
3.4 存储与 I/O 管理
3.4.1 V$SYSTEMINFO:系统信息视图
核心功能:监控操作系统的内存,磁盘,CPU负载和IO等信息
核心字段:
TOTAL_PHY_SIZE: 物理内存总大小,单位 BYTE
FREE_PHY_SIZE: 剩余物理内存大小,单位 BYTE
TOTAL_DISK_SIZE: 磁盘总大小,单位 BYTE
FREE_DISK_SIZE: 剩余磁盘大小,单位 BYTE
CPU_USER_RATE: 用户模式占用 CPU 使用率,仅 LINUX 环境有效
CPU_SYSTEM_RATE: 系统模式占用的 CPU 使用率,仅 LINUX 环境有效
SEND_BYTES_PER_SECOND: 当前每秒发送字节数,仅 LINUX 环境有效
RECEIVE_BYTES_PER_SECOND: 当前每秒接收字节数,仅 LINUX 环境有效
典型应用场景:
SELECT TOTAL_PHY_SIZE,FREE_PHY_SIZE, TOTAL_DISK_SIZE, FREE_DISK_SIZE, CPU_USER_RATE, CPU_SYSTEM_RATE, SEND_BYTES_PER_SECOND,RECEIVE_BYTES_PER_SECOND FROM V$SYSTEMINFO;复制

四、锁等待问题排查
为了便于我们更好的理解动态性能视图的使用,这里我们模拟演示如何通过达梦动态性能视图排查锁等待问题。
场景描述:应用程序出现响应超时,怀疑存在事务阻塞。
1.准备测试环境
首先创建测试表并插入数据
-- 创建测试表 CREATE TABLE test_lock ( id INT PRIMARY KEY, name VARCHAR(50) ); -- 插入测试数据 INSERT INTO test_lock VALUES (1, 'test'); COMMIT;复制

2.模拟锁等待
锁等待通常由于并发更新同一资源且未及时释放锁导致,以下通过两个会话模拟:
会话1(阻塞方): 开启事务更新数据,但不提交(持有排他锁)
-- 会话1:开启事务,更新id=1的行(不提交,持有行级排他锁) BEGIN TRANSACTION; UPDATE test_lock SET name = 'session1_update' WHERE id = 1; -- 注意:此处不执行COMMIT或ROLLBACK,保持事务活跃复制
会话2(被阻塞方): 尝试更新同一行数据(触发锁等待)
-- 会话2:尝试更新同一行,此时会进入锁等待(等待会话1释放锁) UPDATE test_lock SET name = 'session2_update' WHERE id = 1;复制
执行上述sql语句后,会话2会处于阻塞状态,需等待会话1释放锁才能继续,此时锁等待场景已模拟完成。
以下是会话1执行:

当会话2执行时,我们会发现会话二阻塞了:
3.通过动态性能视图排查锁等待
核心思路:
是否存在锁等待
哪个事务再等待,被哪个事务阻塞?
阻塞事务和等待事务执行了什么SQL?
步骤1:确定是否存在锁等待
通过V$TRXWAIT视图查询当前活跃的锁等待关系
SELECT ID as 被阻塞的事务id, WAIT_FOR_ID as 阻塞的事务id, WAIT_TIME as 等待时间, THRD_ID as 阻塞事务的线程id FROM V$TRXWAIT;复制

说明当前存在锁等待,事务74260正在等待事务74259释放锁,以等待421772秒。
步骤2:关联事务与会话,定位操作源
通过V$TRX(事务信息)和V$SESSIONS(会话信息)关联,获取事务对于的会话id和操作用户:
SELECT t.ID AS 事务ID, t.SESS_ID AS 会话ID, s.USER_NAME AS 操作用户, s.CLNT_IP AS 客户端IP, t.STATUS AS 事务状态 FROM V$TRX t JOIN V$SESSIONS s ON t.SESS_ID = s.SESS_ID WHERE t.TRX_ID IN ( SELECT ID FROM V$TRXWAIT UNION SELECT WAIT_FOR_ID FROM V$TRXWAIT );复制
查询的结果如下:
步骤3:查看事务执行的SQL语句
-- 查看阻塞事务和等待事务执行的SQL SELECT s.SESS_ID AS 会话ID, t.ID AS 事务ID, CASE WHEN t.ID IN (SELECT WAIT_FOR_ID FROM V$TRXWAIT) THEN '阻塞方' WHEN t.ID IN (SELECT ID FROM V$TRXWAIT) THEN '等待方' END AS 角色, SUBSTR(s.SQL_TEXT, 1, 200) AS 执行的SQL FROM V$SESSIONS s JOIN V$TRX t ON s.SESS_ID = t.SESS_ID WHERE t.ID IN ( SELECT ID FROM V$TRXWAIT UNION SELECT WAIT_FOR_ID FROM V$TRXWAIT );复制
执行的结果如下:

4.解决锁等待
(1).正常释放锁
通过查询出来的阻塞事务的操作方(通过客户端IP和操作用户定位),让其提交或者回滚事务:
COMMIT; ROLLBACK;复制
执行后,会话2的等待自动解除
(2).强制终止阻塞对话
若阻塞事务无法正常释放,可通过SP_CLOSE_SESSION存储过程种植阻塞会话
-- 终止阻塞会话(会话ID从步骤2的查询结果中获取,此处为281355455893000) SP_CLOSE_SESSION(281355455893000);复制

再次查看会话2,发现语句执行完成
<img src=“file:///C:/Users/15299/AppData/Roaming/marktext/images/2025-08-06-14-58-46-image.png” title="" alt="" width=“382”>
记录也被成功修改
五、总结
动态性能视图是达梦数据库运维的核心工具,掌握其使用方法可显著提升故障诊断和性能优化效率。数据库性能优化是一个持续迭代的过程,动态性能视图提供的实时数据是这一过程的基础。只有通过不断实践,才能熟练掌握这些工具,将其转化为解决实际问题的能力,最终实现数据库系统的稳定、高效运行。




