在数据库管理领域,性能监控与调优是永恒的主题。达梦数据库作为国产数据库的代表,通过动态性能视图(以V$
为前缀的系统视图)为管理员提供了一扇观察数据库内部运行状态的窗口。这些视图实时反映数据库的内存使用、会话活动、SQL
执行效率等关键指标,是诊断性能问题、优化系统配置的核心工具。
达梦动态性能视图作为数据库运行过程中的重要辅助工具,其数据构建于内存结构、进程状态及系统统计等信息之上。相较于常规用户表,这类视图呈现出较为独特的特性:数据状态往往与数据库运行状态紧密关联,呈现出随系统运行动态更新的特征,且在数据库关闭时,相关数据通常会失去存储状态。
本文将结合达梦官方文档与实际案例,全面解析动态性能视图的原理、分类、常用场景及最佳实践,帮助读者掌握通过动态视图实现高效运维的核心技能。了解一些常见动态视图,然后能通过这些动态视图排查问题。
达梦的动态性能视图采用与 Oracle
类似的V$
命名约定,例如V$SESSIONS
(会话信息)、V$SQL_PLAN
(SQL
执行计划)等。这些视图由系统自动维护,数据实时更新,无需用户干预。
SYS
模式下定义,但 DM
为每个视图创建了同名的全局同义词,用户可直接通过V$VIEW_NAME
访问,无需指定模式名。DMDPC
集群中,查询动态视图会自动汇总所有节点的信息,方便跨节点监控。SYSDBA
用户或具有DBA
角色的用户可访问动态视图。普通用户需通过GRANT SELECT ON SYS.VIEW_NAME TO USER
显式授权。达梦的动态性能视图覆盖系统信息、存储结构、SQL
执行、事务管理等多个维度,以下是关键视图的深度解析。
V$INSTANCE
:实例状态监控核心功能:提供数据库实例的基本信息,包括版本号、启动时间、运行状态(如MOUNTED
、OPEN
)、主机名等。该视图的查询结果能够快速判断数据库是否正常运行、是否启用归档(影响数据恢复能力)、以及当前版本是否需要补丁更新等关键信息。
核心字段:
STARTUP/MOUNTED/OPEN/SUSPENDED
)典型应用场景:
SELECT INSTANCE_NAME, VERSION, STARTUP_TIME, STATUS
FROM V$INSTANCE;
如下图所示,即为查询视图V$INSTANCE所展示结果。
V$MEM_POOL
:内存池管理核心功能:达梦数据库采用内存池(Memory Pool
)机制管理内存,V$MEM_POOL
视图详细记录了各内存池的分配与使用情况。监控达梦内存池(MEMORY_POOL
)的使用情况,包括总内存、已用内存、碎片率等。
核心字段:
典型应用场景: 检查内存池使用情况
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
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;
BUFFER
参数值或优化 SQL 减少物理读。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
视图分析锁等待问题。
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)
V$SQLTEXT
:缓冲区中SQL 语句信息核心功能:V$SQL视图存储了数据库缓存的 SQL 语句信息,是 SQL 性能优化的核心依据。
核心字段:
SQL_ID:SQL 语句唯一标识
SQL_TEXT:SQL 语句内容
N_EXEC:执行次数
典型应用场景:
SELECT SQL_ID,SQL_TEXT,N_EXEC
FROM V$SQLTEXT
ORDER BY N_EXEC DESC
LIMIT 1
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;
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;
对频繁执行的慢查询,需检查索引是否缺失或执行计划是否合理。
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;
为了便于我们更好的理解动态性能视图的使用,这里我们模拟演示如何通过达梦动态性能视图排查锁等待问题。
场景描述:应用程序出现响应超时,怀疑存在事务阻塞。
首先创建测试表并插入数据
-- 创建测试表
CREATE TABLE test_lock (
id INT PRIMARY KEY,
name VARCHAR(50)
);
-- 插入测试数据
INSERT INTO test_lock VALUES (1, 'test');
COMMIT;
锁等待通常由于并发更新同一资源且未及时释放锁导致,以下通过两个会话模拟:
会话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执行时,我们会发现会话二阻塞了:
核心思路:
是否存在锁等待
哪个事务再等待,被哪个事务阻塞?
阻塞事务和等待事务执行了什么SQL?
通过V$TRXWAIT
视图查询当前活跃的锁等待关系
SELECT ID as 被阻塞的事务id,
WAIT_FOR_ID as 阻塞的事务id,
WAIT_TIME as 等待时间,
THRD_ID as 阻塞事务的线程id
FROM V$TRXWAIT;
说明当前存在锁等待,事务74260正在等待事务74259释放锁,以等待421772秒。
通过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
);
查询的结果如下:
-- 查看阻塞事务和等待事务执行的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
);
执行的结果如下:
通过查询出来的阻塞事务的操作方(通过客户端IP和操作用户定位),让其提交或者回滚事务:
COMMIT;
ROLLBACK;
执行后,会话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”>
记录也被成功修改
动态性能视图是达梦数据库运维的核心工具,掌握其使用方法可显著提升故障诊断和性能优化效率。数据库性能优化是一个持续迭代的过程,动态性能视图提供的实时数据是这一过程的基础。只有通过不断实践,才能熟练掌握这些工具,将其转化为解决实际问题的能力,最终实现数据库系统的稳定、高效运行。
文章
阅读量
获赞