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



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

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

情景:

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

准备工作:

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

  • Sp_who
  • Sp_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是未公开的系统存储过程,意味着你在联机丛书中找不到相关信息。

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

时间: 2024-08-07 12:38:11

使用系统存储过程来监控SQLServer进程和会话详解的相关文章

查看登陆系统用户的信息的三种方法详解

查看登陆系统用户的信息的三种方法详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.who这个命令显示可以谁在登陆,但是这个有很多的花式玩法,这个命令超简单 语法:who [OPTION]... [ FILE | ARG1 ARG2 ] 1.参数:-u,显示闲置时间,若该用户在前一分钟之内有进行任何动作,将标示成"."号,如果该用户已超过24小时没有任何动作,则标示出"old"字符串. 例如: 2.参数:-m,此参数的效果和指定"a

如何恢复SQLServer表级数据详解

 最近几天,公司的技术维护人员频繁让我恢复数据库,因为他们总是少了where条件,导致update.delete出现了无法恢复的后果,加上那些库都是几十G.恢复起来少说也要十几分钟.为此,找了一些资料和工作总结,给出一下几个方法,用于快速恢复表,而不是库,但是切记,防范总比亡羊补牢好.上章分享了如何使用SQLCMD在SQLServer执行多个脚本详解需要的朋友可以看下. 在生产环境或者开发环境,往往都有某些非常重要的表.这些表存放了核心数据.当这些表出现数据损坏时,需要尽快还原.但是,正式环

(转)SqlServer索引及优化详解(1)

(一)深入浅出理解索引结构 ??????? 实际上,您可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonclustered index,也称非聚类索引.非簇集索引).下面,我们举例来说明一下聚集索引和非聚集索引的区别: ??????? 其实,我们的汉语字典的正文本身就是一个聚集索引.比如,我们要查"安"字,就会很自然地翻开字典的前几页,因为"安"的拼音是&q

AppWidght全面学习之电量监控小部件的实现详解

前几天翻看之前下载的各种资料,无意中发现了一款AppWidght应用的源代码,想起之前一直想研究这块,却一直没机会,于是花费了两天时间,把这款桌面电量监控小插件的实现研究了一下,收获颇丰,特此把学到的东西与大家分享.明天就是苦逼的信息论的期末考试了,我是一点看不懂,唉,就这样吧,重修再说吧,我们换个好心情,看一下这款小软件是如何实现的. 虽然这个小软件实现的不错,但是代码质量我却不敢恭维,费了好大劲,才把很多没用的代码和文件剔除,并且对一些实现进行了优化,话不多说,咱们先来看看效果图饱饱眼福.

C#网络编程基础之进程和线程详解

在C#的网络编程中,进程和线程是必备的基础知识,同时也是一个重点,所以我们要好好的掌握一下. 一:概念 首先我们要知道什么是"进程",什么是"线程",好,查一下baike. 进程:是一个具有一定独立功能的程序关于某个数据集合的一次活动.它是操作系统动态执行的基本单元, 在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元. 线程:是"进程"中某个单一顺序的控制流. 关于这两个概念,大家稍微有个印象就行了,防止以后被面试官问到. 二:进程

CentOS7进程管理systemd详解

概述: 系统启动过程中,当内核启动完成,后加载根文件系统,后就绪的一些用户空间的服务的管理工作,就交由init进行启动和管理,在CentOS6之前的init的管理方式都类似,相关的内容我们在之前的文章中也做出过介绍.在CentOS7上,init变成了systemd,其管理方式也发生了重大的变化,本章就跟大家欧一起探讨一些关于CentOS7上的systemd的新特性的内容.具体分为一下几个方面: 1.systemd新特性简介 2.systemd如何管理系统系统上的各服务 3.systemd管理各个

Linux 进程间通讯详解二

消息队列 --消息队列提供了本机上从一个进程向另外一个进程发送一块数据的方法 --每个数据块都被认为有一个类型,接收者进程接收的数据块可以有不同的类型值 --消息队列也有管道一样的不足,就是每个消息的最大长度是由上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有一个上限(MSGMNI) 消息大小的三大限制 cat /proc/sys/kernel/msgmax --最大消息的长度限制(65536) cat /proc/sys/kernel/msg

Android 进程和线程详解转

我们都知道,在操作系统中进程是OS分配资源的最小单位,而线程是执行任务的最小单位.一个进程可以拥有多个线程执行任务,这些线程可以共享该进程分配到的资源.当我们的app启动运行后,在该app没有其他组件正在运行的前提下,Android系统会启动一个新Linux进程来运行app,这个进程只包含了一个线程在运行.在默认情况下,app的组件都运行在该进程中,最初就包含的这个线程也被称为主线程或者UI线程.如果我们启动该app的时候,系统中已经有一个进程在运行该app的组件,那么该app也会在该进程中运行

windows - 进程 - CreateProcess函数详解

CreateProcess函数原型如下: [cpp] view plaincopy BOOL CreateProcess( PCTSTR pszApplicationName, PTSTR pszCommandLine, PSECURITY_ATTRIBUTES psaProcess, PSECURITY_ATTRIBUTES psaThread, BOOL bInheritHandles, DWORD fdwCreate, PVOID pvEnvironment, PCTSTR pszCurD