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

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

忘了说明:本系列文章出自《Microsoft SQL Server 2012 Performance Tuning Cookbook》,将会陆续推出译文,但是由于工作需要,没有按顺序贴出来。

本系列文章包含三部分:

1、 
使用系统统计函数(system statistical functions)来监控系统健康程度。

2、 使用系统存储过程来监控SQLServer进程和会话。

3、 
使用DBCC SQLPERF命令来监控日志空间使用情况。

 

前言:

        
SQLServer提供了一些系统函数、系统存储过程和DBCC命令来分析SQLServer性能相关的问题,不过绝大部分这些工具所获得的信息都可以通过DMVs和DMFs来获得。很多人依旧使用本文的工具的原因是因为他们长期使用这些工具来监控SQLServer,已经成为了一个习惯,所以为了向后兼容,微软依旧保留这些工具,但是建议新入门的人尽可能从DMO(DMVs和DMFs的统称)中获取信息。

 

      性能监控有很多工具,SQL Profiler、扩展事件、DMO及本系列文章提供的工具等,来获取信息,对于简单的性能问题,使用某一种即可,但是对于复杂的性能问题,往往需要多个工具协同使用。

 

下面先介绍使用系统统计函数来监控SQLServer的健康程度。

 

使用系统统计函数来监控SQLServer

 

        SQLServer提供了一些列非常有用的系统统计函数来监控当前SQLServer的状态。这些函数用于检查和监控服务器的健康状态非常有效。

 

       现在假设一个情况,在你的数据库环境中,一个web应用程序对数据集的操作是一行一行的。为了读取每一行,应用程序会在数据库中往返访问,导致经常需要开启新的连接。为了处理这个问题,需要经常监控SQLServer的连接数,下面将演示如何操作。

 

准备工作:

 

SQLServer提供了下面这些有用的系统函数:

 

@@CONNECTIONS

@@TIMETICKS

@@CPU_BUSY

@@IDLE

@@IO_BUSY

@@PACK_RECEIVED

@@PACK_SENT

@@PACKET_ERRORS

@@TOTAL_READ

@@TOTAL_WRITE

@@TOTAL_ERRORS

 

本例子中将使用这些函数,并创建脚本来获取信息。

 

环境准备:

 

使用SQLServer2008企业版(本机只有企业版)和示例数据库AdventureWorks。

 

步骤:

 

1、  打开SQLServer(这里使用SQLServer Management Studio后面简称SSMS),然后新开一个查询窗口(ctrl+m)。

 

2、  在窗口上输入一下脚本:

 

--创建一个表来存储统计信息
IF OBJECT_ID('[dbo].[tbl_ServerHealthStatistics]') IS NULL
    BEGIN
        CREATE TABLE [dbo].[tbl_ServerHealthStatistics]
            (
              ID INT IDENTITY(1, 1) ,
              StatDateTime DATETIME DEFAULT GETDATE() ,
              TotalConnections INT ,
              TimeTicks INT ,
              TotalCPUBusyTime INT ,
              TotalCPUIdleTime INT ,
              TotalIOBusyTime INT ,
              TotalReceivedPackets INT ,
              TotalSentPackets INT ,
              TotalErrorsInNetworkPackets INT ,
              TotalPhysicalReadOperations INT ,
              TotalWriteOperations INT ,
              TotalReadWriteErrors INT
            )
    END
GO 

--收集信息到表中
INSERT  INTO [dbo].[tbl_ServerHealthStatistics]
        ( TotalConnections ,
          TimeTicks ,
          TotalCPUBusyTime ,
          TotalCPUIdleTime ,
          TotalIOBusyTime ,
          TotalReceivedPackets ,
          TotalSentPackets ,
          TotalErrorsInNetworkPackets ,
          TotalPhysicalReadOperations ,
          TotalWriteOperations ,
          TotalReadWriteErrors
        )
        SELECT  @@CONNECTIONS TotalConnections ,
                @@TIMETICKS TimeTicks ,
                @@CPU_BUSY TotalCPUBusyTime ,
                @@IDLE TotalCPUIdleTime ,
                @@IO_BUSY TotalIOBusyTime ,
                @@PACK_RECEIVED TotalReceivedPackets ,
                @@PACK_SENT TotalSentPackets ,
                @@PACKET_ERRORS TotalErrorsInNetworkPackets ,
                @@TOTAL_READ TotalPhysicalReadOperations ,
                @@TOTAL_WRITE TotalWriteOperations ,
                @@TOTAL_ERRORS TotalReadWriteErrors

 

3、运行下面脚本,显示收集的服务器信息:

 

WITH    cteStatistics
          AS ( SELECT   *
               FROM     [dbo].[tbl_ServerHealthStatistics]
             )
    SELECT  Cur.TotalConnections AS CurrentConnections ,
            Cur.StatDateTime AS CurrentStatDateTime ,
            Prev.TotalConnections AS PreviousConnections ,
            Prev.StatDateTime AS Previous_StatDateTime ,
            Cur.TotalConnections - Prev.TotalConnections AS ConnectionsIncreamentedBy ,
            DATEDIFF(millisecond, Prev.StatDateTime, Cur.StatDateTime) AS ConnectionsIncreamentedIn
    FROM    cteStatistics AS Cur
            LEFT JOIN cteStatistics AS Prev ON Cur.ID = Prev.ID + 1

 

分析:

        上面例子中,先创建一个表[dbo].[tbl_ServerHealthStatistics],在创建之前,使用OBJECT_ID()函数来检查是否存在该表,如果存在则不创建,这是一个良好的编程习惯,建议在创建表(无论是实体表还是临时表)时使用。可以确保脚本可重复执行。

 

        步骤2的脚本中,通过INSERT..SELECT语句来收集数据并插入到表中。

 

        步骤3中,由于需要对比两行之间的数据,所以使用CTE(2005之前可以使用临时表)来暂时存放数据然后与目前数据做对比。

 

 

扩展信息:

 

下面是这些系统统计函数的简介,这些函数均返回从SQLServer启动以来的汇总值。

 

       @@Connections:这个函数返回SQLServer自启动以来,尝试连接到SQLServer的连接数,是一个数值型结果。不管这些连接是否成功,均会记录在里面。

 

    @@MAX_CONNECTIONS:返回允许同时连接的最大连接数,这个数与使用sp_configure 来配置的Max Connections值相同。也和SQLServer的版本和应用程序、硬件的限制有关。

 

    @@TIMETICKS:返回一个微妙级别的计数点。这个值依赖于操作系统的时间系统。通常为31.50毫秒。

 

       @@CPU_BUSY :返回自SQLServer服务启动以来的工作时间,结果为所有CPU事件的累计,所以可能会超出实际时间,乘以@@TIMETICKS即可换成为妙。注意:如果@@CPU_BUSY 或 @@IO_BUSY 中返回的时间超过累积的 CPU 时间约 49 天,则您将收到算术溢出警告。在这种情况下,@@CPU_BUSY、@@IO_BUSY 和 @@IDLE 变量值并不精确。

 

    @@IDLE:表示SQLServer空闲时的CPU时间。在多处理器情况下,返回值为所有CPU的汇总。

 

    @@IO_BUSY:返回SQLServer自启动以来执行输入输出操作的CPU总数。

 

    @@PACK_RECEIVED:返回SQLServer接收到的网络包总数。

 

    @@PACK_SENT:返回SQLServer发送的网络报总数。

 

    @@PACKET_ERRORS:返回SQLServer所遇到过的网络包错误的总数。

 

    @@TOTAL_READ:返回SQLServer所执行过的所有物理读操作总数。

 

    @@TOTAL_WRITE:返回所有物理写操作的总数。

 

    @@TOTAL_ERRORS:返回SQLServer遇到过的所有读写操作的错误总数。

 

注意:@@CPU_BUSY、@@IDLE和@@IO_BUSY返回的值是基于ticks而不是毫秒或者微妙。如果想知道微妙值,可以乘以@@timeticks。

 

        本例中的脚本收集某个时间点的SQLServer信息,可以借助SQLServer Agent,来定期、自动收集,以便用于后续分析之用。

 

       另外,sp_monitor系统存储过程可以返回本例中的信息,但是返回的结果集比较多,可能需要做二次处理来获取。

 

时间: 2024-10-26 18:30:58

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

unix系统编程-关于apue第三章fcntl函数

问题描述 关于apue第三章fcntl函数 其中的if(val & O_APPEND )是什么意思,还有就是fcntl(fdF_SETFL0):和fcntl(fdF_GETFL0)第三个参数设置为0 分别是什么意思 解决方案 fcntl()函数fcntl函数fcntl 函数

> 前言(补充) 和第三章 第一个C#程序(rainbow 翻译)(来自重粒子空间)

程序 <<展现C#>> 前言(补充) 和第三章 第一个C#程序(rainbow 翻译)   出处:http://www.informit.com/matter/ser0000001/chapter1/ch03.shtml 正文: 前言0.1  提要    欢迎阅读<展现 C#>(Presenting C#).这本书是你提高企业编程语言的一条捷径.这种企业编程语言带有下一代编程语言服务运行时(NGWS Runtime):C#(发音"C sharp").

Java初级笔记-第三章

第三章 程序设计基础 3.1 流程图 3.1.1 什么是流程图: 流程图是通过箭头(流程线)相互连接的几何图形来表达程序运行的方法. 流程图是算法的一种图形化描述,比较直观的表达了一件事务的处理过程.相对于代码来讲容易理解. 3.1.2 流程图的组成: 画流程图的方法是:从左到右.从上到下.根据问题的需要,确定解决问题的先后处理顺序以及前提条件,将流程线将各图形符号连接起来,直观的表达自己的逻辑思想或问题的处理方法,最终达到预期的结果. 注意事项: 一个流程图只能有一个开始框,开始框作为处理问题

Pro JavaScript Techniques第三章: 创建可重用的代码

 Pro JavaScript Techniques第三章: 创建可重用的代码 mozart0 [楼主] 匪徒田老大 版主 帖子 2326体力 6628 威望 177 注册 2003-6-18 #1 发表于 2007-4-8 12:46  资料  短消息  加为好友  Pro Javascript Techniques翻译连载:说明和目录 当与其它程序员共同开发代码时(这里对大多数合作或团队项目来说是很常见的),为了保持你们的清醒而维护良好的编程惯例将会变得极其重要.随着近年来JavaScrip

[转]李战大师-悟透delphi-第三章 多线程

第三章          多线程 古时候,有一位刚刚出道的的骑士去到牧马场挑选一匹好马.在马房和牧马人聊天的时候,他大吹特吹自己驾驭马匹的高超技能.牧马人听完他的唠叨之后说:"请你将草原上吃草的那群马引进马房,我送你一匹最好的马!".击掌为誓之后,骑士拿起长鞭骑马出去了.过了很久,那个骑士汗流满面灰溜溜地回来了.这时牧马人语重心长地对他说:"能驾驭一匹马不一定可以驾驭一群马,你在马背上的前程还长着呢!".骑士听了之后羞愧满面.多年以后,这位骑士成为了一位领兵打仗的将

perl 常用系统函数列表_基础教程

常用系统函数列表 指令:print语法:print Filehandle LIST说明:这个Filehandle可以看作在I(INPUT)/O(OUTPUT)之间的一个桥梁,可以利用FILEHANDLE来做出数据读入写出的动作.STDIN是代表从哪连输入数据,例如从电脑的键盘输入;STDOUT是代表从哪连输出数据;例如从电脑的屏幕输出;STDERR是代表从哪连输出错误的数据,例如从电脑的屏幕输出.而在PERL语言中有三个标准FILEHANDLE: 1.STDIN(标准输入):是代表STDIN的F

MySQL 第五篇:系统函数和联合查询

我把MySQL的内容整理成9篇博客,学完这9篇博客虽不能说能成为大神,但是应付一般中小企业的开发已经足够了,有疑问或建议的欢迎留言讨论. 一.系统函数 一.概念 函数是SQL里的关键字,用于对字段里的数据进行操作.函数是一个命令,通常与字段名称或者是表达式联合使用,处理输入的数据并产生结果 二.控制函数 1.case 语法:case 值 when 比较的值 then 返回的值 when 比较的值 THEN-. END SELECT s_name, CASE sex WHEN 0 THEN '女性

Android群英传笔记——第三章:Android控件架构与自定义控件讲解

Android群英传笔记--第三章:Android控件架构与自定义控件讲解 真的很久没有更新博客了,三四天了吧,搬家干嘛的,心累,事件又很紧,抽时间把第三章大致的看完了,当然,我还是有一点View的基础的,可以先看下我之前写的几篇基础的View博客 Android绘图机制(一)--自定义View的基础属性和方法 Android绘图机制(二)--自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解 Android绘图机制(三)--自定义View的三种实现方式以及实战

HBase in Action前三章笔记

最近接触HBase,看了HBase In Action的英文版.开始觉得还行,做了些笔记,但是后续看下去,越来越感觉到实战这本书比较偏使用上的细节,对于HBase的详细设计涉及得非常少.把前三章的一些笔记帖一下,后面几章内容不打算整理了,并不是说书内容不好. key-value存储,强一致性,多个RegionServer节点对client端是不暴露细节的 使用场景:典型的web-search, capture incremental data, ad. click stream, content