指引网

当前位置: 主页 > 数据库 > SQLServer >

使用系统存储过程来监控SQLServer进程和会话详解

来源:网络 作者:佚名 点击: 时间:2018-03-14 07:48
[摘要] 65279; 65279;承接上文,本文讲述如何使用系统存储过程来监控系统。SQLServer同样也提供了一系列系统存储过程用于监控SQLServer,获取当前进程、会话、请求以及锁定的详细信息。本文将演示系统

承接上文,本文讲述如何使用系统存储过程来监控系统。

SQLServer同样也提供了一系列系统存储过程用于监控SQLServer,获取当前进程、会话、请求以及锁定的详细信息。本文将演示系统存储过程来实现这些监控。

情景:

有时候你会发现应用程序突然变得很慢,经常需要等待数据库响应,此时你需要快速查看是否请求被阻塞或者挂起。

准备工作:

在本文中,将使用以下存储过程来获取当前进程的信息:

Sp_whoSp_who2

步骤:

1、 打开SSMS连到SQLServer实例并打开新查询窗口。

2、 在新查询窗口中输入以下脚本


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 USE tempdb GO --创建测试表 IF OBJECT_ID('tempdb.dbo.#tbl_SPWho') IS NOT NULL BEGIN DROP TABLE tempdb.dbo.#tbl_SPWho END CREATE TABLE tempdb.dbo.#tbl_SPWho ( spid SMALLINT , ecid SMALLINT , [status] NVARCHAR(30) , loginame NVARCHAR(128) , hostName NVARCHAR(128) , blk CHAR(5) , dbname NVARCHAR(128) , cmd NVARCHAR(16) , request_id INT ) --从系统存储过程中获取数据并插入临时表中 INSERT INTO tempdb.dbo.#tbl_SPWho EXEC sp_who GO --创建存放sp_who2信息的临时表 IF OBJECT_ID('tempdb.dbo.#tbl_SPWho2') IS NOT NULL BEGIN DROP TABLE tempdb.dbo.#tbl_SPWho2 END CREATE TABLE tempdb.dbo.#tbl_SPWho2 ( spid SMALLINT , [status] NVARCHAR(30) , [login] NVARCHAR(128) , HostName NVARCHAR(128) , BlkBy CHAR(5) , DBName NVARCHAR(128) , Command NVARCHAR(16) , CPUTime INT , DiskIO INT , LastBatch NVARCHAR(50) , ProgramName NVARCHAR(100) , SPID2 SMALLINT , REQUESTID INT ) --从系统存储过程中获取数据并插入临时表中 INSERT INTO tempdb.dbo.#tbl_SPWho2 EXEC sp_who2 GO --查看特定数据库的数据 SELECT spid AS SessionID , ecid AS ExecutionContextID , [status] AS ProcessStatus , loginame AS LoginName , hostname AS HostName , blk AS BlockedBy , dbname AS DatabaseName , cmd AS CmomandType , request_id AS RequestID FROM dbo.#tbl_SPWho WHERE dbname = 'AdventureWorks' GO --仅查看阻塞的数据 SELECT spid AS SessionID , ecid AS ExecutionContextID , [status] AS ProcessStatus , loginame AS LoginName , hostname AS HostName , blk AS BlockedBy , dbname AS DatabaseName , cmd AS CmomandType , request_id AS RequestID FROM dbo.#tbl_SPWho WHERE blk > 0 GO --查看挂起的数据 SELECT spid AS SessionID , ecid AS ExecutionContextID , [status] AS ProcessStatus , loginame AS LoginName , hostname AS HostName , blk AS BlockedBy , dbname AS DatabaseName , cmd AS CmomandType , request_id AS RequestID FROM dbo.#tbl_SPWho WHERE [STATUS] = 'suspended' GO

分析:

本例中,创建了两个临时表,用于存放sp_who 和sp_who2存储过程返回的数据结果,然后通过INSERT…EXECUTE命令把结果插入到临时表中,例子中演示了对sp_who的使用,至于sp_who2的使用是一样的。

之所以使用临时表来存放数据,是因为sp_who/sp_who2这两个系统存储过程不能直接筛选结果,所以需要存到表里面做二次处理。

扩充信息:

现在来简单介绍一下,在DMO被加入到SQLServer之前,sp_moitor、sp_who2、sp_who这三个系统存储过程被广泛用于监控系统当前信息。

Sp_monitor在上文中已经提到过,并且可以和系统统计函数互换使用。

Sp_who是用于获取当前SQLServer进程、会话和请求的详细信息的系统存储过程。通过这个存储过程,可以知道谁执行了什么操作或者命令,和哪些进程被哪些进程阻塞了。这个存储过程有一些可选的参数:@loginame(类型为sysname),session ID(类型为smallint),和ACTIVE。可以通过传入@loginame来筛选特定的登录名的信息,如果Session ID也被定义,也会筛选特定sessionid的信息。如果没有参数,将范围实例级别的信息。如果你没有VIEW SYSTEM STATE权限,你仅仅可以查看自己这个会话的信息。如果使用了ACTIVE参数。存储过程将返回活动的进程。

对于sp_who返回的结果:

Spid:返回sessionID也就是会话ID,这些ID中,1到50(含)为系统会话。51及以上sessionid才是用户会话ID。

Exid:有时候结果中可能会有多个相同的SPID,这往往是因为发生了并行查询。这一列代表了查询的上下文ID。而0代表了父线程,其他值代表子线程。

Status:返回进程的的状态,包括:Dormant(休眠)、Running(正在运行)、Background(正在后台运行的进程如死锁侦测)、Rollback(事务正在回滚)、Pending(挂起,该会话正在等待可用的工作线程)、Runnable(会话的任务在等待获取时间量程时位于计划程序的可运行队列中)、Spinloop(会话的任务正在等待调节锁变为可用)、Suspended(会话正在等待时间如I/O完成)。

Loginame:会话所对应的登录名

Hostname:会话对应的机器名

Blk:如果会话被阻塞,这里将显示阻塞的会话ID,如果没有,降为0。

Dbname:返回特定会话所请求的数据库名。

Cmd:返回数据库引擎的命令类型。

Request_id:会话中的请求ID。

相对于sp_who,sp_who2返回更多的信息,但是sp_who2是未公开的系统存储过程,意味着你在联机丛书中找不到相关信息。

------分隔线----------------------------