使用 sp_WhoIsActive 监视活动
sp_WhoIsActive存储过程可以监视SQL Server中当前正在运行的活动。
介绍
如果服务器速度变慢时,数据库管理员需要不断检查SQL Server实例上正在运行的操作。
系统存储过程“sp_who”和“sp_who2”可以检查实例上所有正在运行的进程,但它们缺乏很多有助于性能监控和分析过程的有用信息,也显示了很多如系统进程等无用的信息。
为此,Adam Machanic(自 2004 年起成为 Microsoft MVP)开发了一个名为“sp_whoisactive”的更强大的存储过程,以填补 DBA 的实际需求与当前提供的过程(sp_who 和 sp_who2)之间的差距。
下面将会简要介绍sp_who和sp_who2存储过程,及如何使用sp_whoisactive
sp_Who和sp_Who2介绍
官方介绍,sp_who提供有关 Microsoft SQL Server 数据库引擎实例中当前用户、会话和进程的信息。可以过滤信息以仅返回那些非空闲、属于特定用户或属于特定会话的进程。
sp_who返回诸如会话进程ID (SPID-session process ID)、执行上下文ID (ECID-execution context ID)、进程状态(status)、阻塞会话ID(blk)、数据库名称(dbname)、与此进程关联的登录名(loginame)和主机名(hostname)以及命令类型(Cmd-command type)等信息。
blk为阻塞执行的会话ID
sp_Who2与sp_Who类似,但没有文档记录也没有支持,但它从当前进程返回更多信息和性能计数器,例如执行命令的程序名称(ProgramName)、磁盘IO(DiskIO-磁盘读写总次数)、CPU时间(CPUTime-占用CPU运行的总时间)、上次批处理执行时间(LastBatch-最后一次调用存储过程或者执行查询的时间)。
如截图所示,输出显示了包含不需要的所有正在运行的系统和用户进程,并且只能使用loginname和sessionid过滤结果。而实际可能需要隐藏系统进程。
并且,以上输出不包含任何有关当前运行的SQL命令的信息,如开始执行时间、执行持续时间、等待信息等。
sp_Who和sp_Who2返回活动的、某个用户或SPID的进程信息
- 返回某个用户的进程信息
如下,返回sa用户的会话进程信息
exec sp_who 'sa';
-- exec sp_who2 'sa';
-- exec sp_who @loginame='sa';
- 返回活动的进程信息
exec sp_who 'ACTIVE';
-- EXEC sp_who2 'active';
- 返回指定进程ID的信息
exec sp_who2 '1';
exec sp_who2 1;
-- exec sp_who '1';
-- exec sp_who 1;
保存sp_Who2过滤结果
如下,有个示例可以保存sp_Who2的结果到表或表变量或临时表中。用于过滤显示
DECLARE @Table TABLE(
SPID INT,
Status VARCHAR(MAX),
LOGIN VARCHAR(MAX),
HostName VARCHAR(MAX),
BlkBy VARCHAR(MAX),
DBName VARCHAR(MAX),
Command VARCHAR(MAX),
CPUTime INT,
DiskIO INT,
LastBatch VARCHAR(MAX),
ProgramName VARCHAR(MAX),
SPID_1