采集SQL Server 性能计数器并用×××S创建报表

 

问题描述

我想监控一些性能指标,但不想购买第三方监控产品。有没有方法采集性能指标数据并通过SQL Server Reporting Services展示图形化的趋势数据。

 

解决方案

有些不同的方法去采集特定的性能指标数据,但是这里我们将专注于用sys.dm_os_performance_counters DMV,以及用SQL Server Reporting Services图表去查看更具可读性的数据。这个动态性能视图不包含所有的性能计数器数据,但是它包含与SQL Server相关的计数值。(注意:在这个DMV中的有些计数值是从上次重启之后的累加值)

 

你可以查询这个DMV用下面的查询语句:

SELECT * FROM sys.dm_os_performance_counters

从上面的截屏中,看到数据是不易阅读的。它仅显示了在你查询时刻返回的当前值,所以你不知道之前的值,所以你不知道在数据库运行期间性能数据的波动情况。

 

采集SQL Server监控报表数据

出于简化目的,我们专注于一个计数器值,Page Life Expectancy (PLE)。我将显示如何去采集数据和创建供分析的图表。

首先,我们将创建存储性能指标的表:

CREATE TABLE [dbo].[CounterCollections](    [ID] [int] IDENTITY(1,1) NOT NULL,     [object_name] [varchar](128) NOT NULL,     [counter_name] [varchar](128) NOT NULL,     [cntr_value] [bigint] NOT NULL,     [collection_datetime] [datetime] NOT NULL )

接下来,我们需要一个脚本,用于插入数据到这个表中:

INSERT INTO CounterCollections    SELECT object_name, counter_name, cntr_value, GETDATE() collection_datetime     FROM sys.dm_os_performance_counters     WHERE object_name = 'SQLServer:Buffer Manager'     AND counter_name = 'Page life expectancy'

最后,我们需要创建一个SQL Server Agent作业,我们将会运行这个脚本在计划任务中:

我将会每5分钟运行该作业:

 

创建SQL Server监控报表

在该表采集数据的时候,我们可以利用Business Intelligence Development Studio (BIDS) 或 SQL Server Data Tools (SSDT) 创建一个显示数据的×××S报表。

在这个例子,我们用SSDT。选择File,New Project。在New Project对话框,选择Report Server Project,并输入项目的名字:

右击Shared Data Sources,点击Add New Data Source:

对这个例子,我们使用localhost:

下一步,右击Shared Dataset,点击Add New Dataset:

在此,我们构建在报表中使用到的查询语句。我将用下列语句,WHERE从句创建StartTime和EndTime时间参数:

接下来,点击Reports,Add,New Item:

点击Report,输入报表名称:

一个新的报表创建了。在Report Data窗口,右击Datasets并点击Add Dataset:

点击之前我们创建的Dataset,点击OK:

展开Parameters,双击每个参数并设置参数的类型为Date/Time:

从Toolbox窗口,点击Chart并拖拽到设计视图:

选择Line图表:

点击Chart,将会看到Chart Data窗口出现。添加cutr_value到Values,添加collection_datatime到Category Groups:

我们现在点击Preview去预览一下Page Life Expectancy相关的趋势图:

一旦数据正确显示,你可以格式化图表让它更友好显示:

这只是一个使用Page Life Expectany计数器的例子。你可以创建这种类型的报表用任何SQL Server提供的计数器。这种报表作为一种监控解决方案或用来定位SQL Server性能瓶颈。

 

另一个多计数器×××S监控报表示例

这是另一个报表示例,你可以创建含有多个性能计数器的报表。