第三章——使用系统函数、存储过程和DBCC SQLPERF命令来监控SQLServer(2)-阿里云开发者社区

开发者社区> 杰克.陈> 正文

第三章——使用系统函数、存储过程和DBCC SQLPERF命令来监控SQLServer(2)

简介: 原文: 第三章——使用系统函数、存储过程和DBCC SQLPERF命令来监控SQLServer(2) 承接上文,本文讲述如何使用系统存储过程来监控系统。
+关注继续查看
原文: 第三章——使用系统函数、存储过程和DBCC SQLPERF命令来监控SQLServer(2)

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

 

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

 

情景:

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

 

准备工作:

 

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

 

  • Sp_who
  • Sp_who2

 

步骤:

 

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

 

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

 

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中,150(含)为系统会话。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_whosp_who2返回更多的信息,但是sp_who2是未公开的系统存储过程,意味着你在联机丛书中找不到相关信息。

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
thinkphp常用系统配置大全
'APP_DEBUG' => false, // 是否开启调试模式'APP_DOMAIN_DEPLOY' => false, // 是否使用独立域名部署项目'APP_PLUGIN_ON' => false, // 是否开启插件机制'APP_FILE_CASE' => false, // 是否检查文件的大小写 对Windows平台有效'APP_GROUP_DEPR' => '.
1354 0
【译】Databricks使用Spark Streaming和Delta Lake对流式数据进行数据质量监控介绍
本文主要对Databricks如何使用Spark Streaming和Delta Lake对流式数据进行数据质量监控的方法和架构进行了介绍,本文探讨了一种数据管理架构,该架构可以在数据到达时,通过主动监控和分析来检测流式数据中损坏或不良的数据,并且不会造成瓶颈。
1086 0
Android Native禁止使用系统私有库详解
解读Android Native对于系统私有库的限制,老版本的黑科技代码在N版本之后都可能导致APP崩溃。
1652 0
Sql Server 存储过程使用技巧
1、创建带Try。。。Catch的存储过程模板   Copy下面的代码,然后新建查询,就可以写sql语句,执行完后,一个你自己的存储过程就建立好了! USE [DB]--设定对应的数据库 GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER O...
673 0
[Unity3d]Unity系统自带函数生命周期以及相互关系
Unity脚本从唤醒到销毁都有着一套比较完善的生命周期,添加任何脚本都要遵守生命周期法则! 接下来介绍几种系统自调用的重要方法。首先要我们先来说明一下它们的执行顺序: Awake --> Start --> Update --> FixedUpdate --> LateUpdate -->OnGUI -->Reset --> OnDisable -->OnDestroy 下面我们针对每一个方法进行详细的说明: 1.Awake:用于在游戏开始之前初始化变量或游戏状态。
1019 0
linux 内存文件系统使用 - tmpfs, ramfs, shmfs
linux 内存文件系统使用 - tmpfs, ramfs, shmfs
824 0
使用阿里云Serverless函数计算实现HTTP健康检查+故障短信通知
定时对网站/API进行请求,根据请求响应判断服务是否可用,网站是否存在宕机,当发生宕机时,发送短信通知管理员.
1054 0
+关注
杰克.陈
一个安静的程序猿~
9798
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载