摘要
本文档提供了两个用于监控 Microsoft SQL Server 数据库阻塞和锁情况的查询脚本。第一个查询用于获取详细的进程信息(包括进程ID、阻塞状态、数据库名、登录用户等)以及当前正在执行的具体 SQL 语句。第二个查询用于快速查看活跃进程的基本状态信息。文档末尾还包含需要谨慎使用的操作命令(如终止进程)和使用说明。
查询列表
查询1:获取详细的进程信息和当前执行的SQL语句
SELECT *
FROM (
SELECT TOP 1000
spid AS 进程ID, -- 服务器进程ID
blocked AS 被阻塞进程ID, -- 阻塞当前进程的进程ID,0表示未被阻塞
DB_NAME(sp.dbid) AS 数据库名, -- 进程当前使用的数据库
program_name AS 程序名称, -- 客户端程序名称
waitresource AS 等待资源, -- 进程正在等待的资源
lastwaittype AS 最后等待类型, -- 最后一次或当前等待类型
sp.loginame AS 登录名, -- 进程登录名
sp.hostname AS 主机名, -- 客户端主机名
a.[Text] AS 完整SQL文本, -- 完整的SQL批处理文本
SUBSTRING(
A.text,
sp.stmt_start / 2,
(CASE
WHEN sp.stmt_end = -1
THEN DATALENGTH(A.text)
ELSE sp.stmt_end
END - sp.stmt_start) / 2
) AS 当前执行语句 -- 当前正在执行的具体SQL语句
FROM sys.sysprocesses AS sp
OUTER APPLY sys.dm_exec_sql_text(sp.sql_handle) AS A
WHERE spid > 0
ORDER BY spid
) t1
查询2:获取活跃进程的基本信息
SELECT TOP 1000
spid AS 进程ID, -- 服务器进程ID
kpid AS 线程ID, -- Windows线程ID
blocked AS 被阻塞进程ID, -- 阻塞当前进程的进程ID
waittime AS 等待时间毫秒, -- 当前等待的持续时间(毫秒)
lastwaittype AS 最后等待类型, -- 最后一次或当前等待类型
DB_NAME(dbid) AS 数据库名, -- 进程当前使用的数据库
waitresource AS 等待资源, -- 进程正在等待的资源
open_tran AS 打开事务数, -- 进程打开的事务数量
hostname AS 主机名, -- 客户端主机名
[program_name] AS 程序名称, -- 客户端程序名称
hostprocess AS 主机进程ID, -- 客户端进程ID
loginame AS 登录名, -- 进程登录名
[status] AS 进程状态 -- 进程当前状态(running、sleeping等)
FROM sys.sysprocesses WITH (NOLOCK)
WHERE kpid > 0
AND [status] <> 'sleeping'
AND spid > 0
AND spid <> @@SPID -- 排除当前会话
ORDER BY spid
常用操作命令(谨慎使用)
-- 终止指定进程(请谨慎使用)
-- KILL 58
-- 清空指定表(请谨慎使用)
-- TRUNCATE TABLE OTHERS.CDC.FOR_CALCULAT_订单商品_药约约
-- 终止指定进程(请谨慎使用)
-- KILL 52
使用说明
- 第一个查询:用于查看详细的进程信息,包括当前执行的 SQL 语句
- 第二个查询:用于查看活跃进程的基本状态信息
- 可以根据需要取消注释相应的过滤条件
- KILL 命令请谨慎使用,建议先确认进程状态
