达梦数据库采用 单进程、多线程 架构。整个数据库只有一个操作系统进程(dmserver),但内部包含多种类型的线程,协同完成数据库的各项任务。通过查看线程信息,可以了解数据库的运行状态、资源分配和潜在的性能瓶颈。
SELECT * FROM V$THREADS;
输出示例(共156行,以下为前3行):
| ID | NAME | START_TIME | THREAD_DESC | SESS_ID | PROCESSOR_ID | WAIT_SEQ | WAIT_STATUS | WAIT_TIME |
|---|---|---|---|---|---|---|---|---|
| 13896 | temp_worker_thd | 2026-07-30 09:11:18.000000 | Temp worker thread | NULL | 65535 | 0 | NOTHING TO WAIT | -1 |
| 13897 | dm_tskwrk_thd | 2026-07-30 09:11:23.000000 | Task Worker Thread for SQL parsing and execution | NULL | 65535 | 0 | NOTHING TO WAIT | -1 |
| 13898 | dm_tskwrk_thd | 2026-07-30 09:11:23.000000 | Task Worker Thread for SQL parsing and execution | NULL | 65535 | 0 | NOTHING TO WAIT | -1 |
各列含义:
| 列名 | 说明 |
|---|---|
ID |
线程 ID(内部标识) |
NAME |
线程名称(用于区分线程类型) |
START_TIME |
线程启动时间 |
THREAD_DESC |
线程描述(说明该线程的具体作用) |
SESS_ID |
关联的会话 ID(如果是用户会话线程) |
PROCESSOR_ID |
处理器 ID(CPU 亲和性,65535 表示无绑定) |
WAIT_SEQ |
等待序列号(用于调试) |
WAIT_STATUS |
当前等待状态(NOTHING TO WAIT 表示空闲) |
WAIT_TIME |
等待时间(毫秒,-1 表示无等待) |
SELECT NAME, THREAD_DESC, COUNT(*)
FROM V$THREADS
GROUP BY NAME, THREAD_DESC
ORDER BY COUNT(*) DESC;
输出:
| 线程名称(NAME) | 说明(THREAD_DESC) | 数量 |
|---|---|---|
temp_worker_thd |
Temp worker thread | 75 |
dm_pthd_thd |
Parallel working thread | 16 |
dm_osio_thd |
os io thread | 16 |
dm_lpq_thd |
Local parallel working thread | 10 |
dm_tskwrk_thd |
Task Worker Thread for SQL parsing and execution | 9 |
dm_wrkgrp_thd |
User working thread | 6 |
dm_hio_thd |
IO thread for HFS to read data pages | 4 |
dm_rsyswrk_thd |
Asynchronous archiving thread | 2 |
dm_audit_thd |
Thread for flush audit logs | 2 |
| 其他16种 | 各类专用线程 | 各 1 个 |
SELECT * FROM V$THREADS WHERE WAIT_STATUS != 'NOTHING TO WAIT';
输出:未选定行(当前没有线程在等待资源)。
SELECT * FROM V$PROCESS;
输出:
| PID | PNAME | TRACE_NAME | TYPE$ |
|---|---|---|---|
| 13796 | dmserver | 1 |
验证了达梦是单进程多线程架构。
SELECT * FROM V$LATCHES;
输出:未选定行(当前没有线程在等待锁存器)。
SELECT * FROM V$LOCK WHERE BLOCKED = 1;
输出:未选定行(当前没有被阻塞的锁)。
首先查看列结构:
DESC V$TRXWAIT;
输出:
| NAME | TYPE$ | NULLABLE |
|---|---|---|
| ID | BIGINT | Y |
| WAIT_FOR_ID | BIGINT | Y |
| WAIT_TIME | INT | Y |
| THRD_ID | INT | Y |
| LOCK | BIGINT | Y |
| WAIT_FOR_LOCK | BIGINT | Y |
各列含义:
ID:等待事务的 ID(被阻塞的事务)WAIT_FOR_ID:持有锁的事务 ID(阻塞方)WAIT_TIME:等待时间(毫秒)THRD_ID:线程 IDLOCK / WAIT_FOR_LOCK:锁相关地址SELECT * FROM V$TRXWAIT;
输出:未选定行(当前没有事务在等待锁)。
SELECT SESS_ID, USER_NAME, STATE, CLNT_IP, TRX_ID
FROM V$SESSIONS WHERE STATE = 'ACTIVE';
输出:
| SESS_ID | USER_NAME | STATE | CLNT_IP | TRX_ID |
|---|---|---|---|---|
| 140711410203816 | SYSDBA | ACTIVE | ::1:45552 | 90190 |
当前有 1 个活动会话。
| 线程名称(NAME) | 说明(THREAD_DESC) | 作用 |
|---|---|---|
dm_lsnr_thd |
Service listener thread | 监听线程,在服务器端口上循环监听客户端连接请求 |
dm_wrkgrp_thd |
User working thread | 工作线程,负责处理用户会话的 SQL 请求 |
dm_tskwrk_thd |
Task Worker Thread for SQL parsing and execution | 任务工作线程,负责服务器自身的 SQL 解析和执行 |
dm_osio_thd |
os io thread | OS IO 线程,负责磁盘数据页的读写操作 |
dm_redolog_thd |
Redo log thread, used to flush log | 重做日志线程,负责将日志缓冲区中的 Redo 日志写入日志文件 |
dm_rsyswrk_thd |
Asynchronous archiving thread | 异步归档线程,负责将 Redo 日志归档到归档目录 |
dm_chkpnt_thd |
Flush checkpoint thread | 检查点线程,触发检查点将脏页写入数据文件 |
dm_sched_thd |
Server scheduling thread | 调度线程,触发后台检查点、时间触发器等任务 |
dm_pwr_thd |
flush PWR log thread | PWR 日志刷新线程 |
dm_sqllog_thd |
Thread for writing dmsql dmserver | SQL 日志写入线程 |
dm_sql_thd |
User session thread | 用户会话线程 |
dm_sql_aux_thd |
User session auxiliary thread | 用户会话辅助线程 |
dm_audit_thd |
Thread for flush audit logs | 审计日志刷新线程 |
dm_deadlock_chk_thd |
Thread for transaction deadlock check | 死锁检查线程,定期检测事务死锁 |
dm_purge_thd |
Purge thread | 清理线程,清理过期数据 |
dm_trxbro_thd |
trx active view broadcast thread | 事务活跃视图广播线程 |
dm_trctsk_thd |
Thread for writing trace information | Trace 信息写入线程 |
dm_tlog_thd |
Thread for writing tlog dmserver | Tlog 写入线程 |
dm_pthd_thd |
Parallel working thread | 并行工作线程,用于并行查询 |
dm_lpq_thd |
Local parallel working thread | 本地并行工作线程 |
dm_hio_thd |
IO thread for HFS to read data pages | HFS 数据页读取 IO 线程 |
dm_quit_thd |
Thread for executing shutdown-normal operation | 正常关闭执行线程 |
temp_worker_thd |
Temp worker thread | 临时工作线程,用于排序、哈希等临时操作 |
nlgn_task_thread |
Thread for writing login information | 登录信息写入线程 |
nsvr_console_thread |
Thread for nsvr console | 控制台线程 |
-- 1. 查看所有线程
SELECT * FROM V$THREADS;
-- 2. 按类型统计线程数量
SELECT NAME, THREAD_DESC, COUNT(*)
FROM V$THREADS
GROUP BY NAME, THREAD_DESC
ORDER BY COUNT(*) DESC;
-- 3. 查找等待中的线程(排查阻塞)
SELECT * FROM V$THREADS WHERE WAIT_STATUS != 'NOTHING TO WAIT';
-- 4. 查看进程信息
SELECT * FROM V$PROCESS;
-- 5. 查看被阻塞的锁
SELECT * FROM V$LOCK WHERE BLOCKED = 1;
-- 6. 查看事务等待关系
DESC V$TRXWAIT;
SELECT * FROM V$TRXWAIT;
-- 7. 查看活动会话
SELECT SESS_ID, USER_NAME, STATE, CLNT_IP, TRX_ID
FROM V$SESSIONS WHERE STATE = 'ACTIVE';
-- 8. 查看等待的锁存器
SELECT * FROM V$LATCHES;
当系统响应变慢时,按以下顺序排查线程争用:
查看线程等待状态:
SELECT * FROM V$THREADS WHERE WAIT_STATUS != 'NOTHING TO WAIT';
如果返回非空,说明有线程在等待资源,查看 WAIT_TIME 判断等待时长。
查看锁阻塞:
SELECT * FROM V$LOCK WHERE BLOCKED = 1;
如果返回非空,说明存在锁阻塞,结合 V$TRXWAIT 定位阻塞方。
查看事务等待:
SELECT * FROM V$TRXWAIT;
如果返回非空,说明存在事务等待,通过 WAIT_FOR_ID 找到持有锁的事务。
查看活动会话:
SELECT SESS_ID, SQL_TEXT, STATE FROM V$SESSIONS WHERE STATE = 'ACTIVE';
找到长时间运行的 SQL,分析是否需要优化。
执行所有诊断命令后,结果汇总如下:
| 检查项 | 结果 | 状态 |
|---|---|---|
V$THREADS 等待状态 |
所有线程均为 NOTHING TO WAIT |
正常 |
V$LOCK WHERE BLOCKED=1 |
无阻塞锁 | 正常 |
V$TRXWAIT |
无事务等待 | 正常 |
V$LATCHES |
无锁存器等待 | 正常 |
V$SESSIONS 活动会话 |
1 个活动会话 | 正常 |
结论:当前系统运行正常,无任何线程争用或锁阻塞。
文章
阅读量
获赞
