通过收集计数器信息,并将计数器信息汇总为不同粒度存储,以Reporting Service报表服务器显示。以下是计数器收集汇总的基本架构。

笔者需要收集的SQL Server计数器包括:SQL Server计数器属性详解

一、SQL Server计数器基本架构图

1、 生产服务器通过ODBC开发数据库互联ODBC配置访问监控监控服务器的SQLPerfData,将数据写入该数据库。详情请见计数器部署 SQL Server性能计数器部署(批量)

2、 通过作业调用存储过程spb_Perf_CounterDataCollect将数据从SQLPerfData写入SQLPerfDataStat数据库。

 /****************************** 功能描述:<性能计数器15秒统计>
* 创建者:<HuangCH〉
* 创建日期:<2014-09-22>
* 备注说明:<根据具体业务而定,每分钟一次>
##########
Change Log
##########
Date Changer Description
--------------------------------------------------
<2014-09-22> <HuangCH> <新建>
--------------------------------------------------
***************************/
ALTER PROC [dbo].[spb_Perf_CounterDataCollect]
as
--定义当前时间
SET NOCOUNT ON
DECLARE @FifteenSec DATETIME
,@OneMinute DATETIME
,@FiveMinute DATETIME
,@HalfHour DATETIME
,@OneHour DATETIME
,@SixHour DATETIME
,@OldFifteenSec DATETIME DECLARE @MaxRecordIndex INT
DECLARE @MinRecordIndex INT SET @FifteenSec=CONVERT(VARCHAR(23),GETDATE(),120)
SET @OneMinute=CONVERT(VARCHAR(16),@FifteenSec,120)
SET @FiveMinute=Dateadd(mi,Datepart(mi,@OneMinute) / 5 * 5 - Datepart(mi,@OneMinute),@OneMinute)
SET @HalfHour=Dateadd(mi,Datepart(mi,@OneMinute) / 30 * 30 - Datepart(mi,@OneMinute),@OneMinute)
SET @OneHour=CONVERT(VARCHAR(14),@FifteenSec,120)+'00:00'
SET @SixHour=Dateadd(HH,Datepart(mi,@OneHour) / 30 * 30 - Datepart(mi,@OneHour),@OneHour) ------进入循环收集处理----------------------------------------------- DECLARE @MachineName SYSNAME
DECLARE CUR_COUNTERDATA CURSOR FOR
SELECT DISTINCT MachineName
FROM [dbo].[CounterDetails_Collect] WITH(NOLOCK)
OPEN CUR_COUNTERDATA
FETCH NEXT FROM CUR_COUNTERDATA INTO @MachineName WHILE @@FETCH_STATUS=0
BEGIN IF NOT EXISTS (SELECT TOP 1 1 FROM [dbo].[CounterDetails_Dts] WHERE [MachineName]=@MachineName)
BEGIN
--添加未插入的数据 INSERT INTO [dbo].[CounterDetails_Dts]
SELECT @MachineName,0,@FifteenSec,@OneMinute,@FiveMinute,@HalfHour,@OneHour,@SixHour,@OneMinute,@OneMinute,@FifteenSec FETCH NEXT FROM CUR_COUNTERDATA INTO @MachineName
CONTINUE
END SELECT @MinRecordIndex=[LastRecordIndex],@OldFifteenSec=LastFifteenSec FROM [dbo].[CounterDetails_Dts] WITH(NOLOCK)
WHERE [MachineName]=@MachineName IF DATEDIFF(MI,@OldFifteenSec,@FifteenSec)>25
BEGIN
SET @MinRecordIndex=0
END SELECT @MaxRecordIndex=MAX([RecordIndex]),@FifteenSec=MAX(CONVERT(DATETIME,LEFT(A.CounterDateTime,23)))
FROM [SQLPerfData].[dbo].[CounterData] A WITH(NOLOCK)
WHERE CounterID=(SELECT TOP 1 CounterID FROM [dbo].[CounterDetails_Collect] B WITH(NOLOCK) WHERE B.MachineName=@MachineName)
AND [RecordIndex]>@MinRecordIndex --若由于重启导致index恢复,则要重新计算
IF @MaxRecordIndex IS NULL
BEGIN SET @MaxRecordIndex=@MinRecordIndex--上次最大值
SELECT @MinRecordIndex=NumberOfRecords FROM --当前最大值
(
SELECT ROW_NUMBER() OVER(ORDER BY LogStartTime DESC) ROW_ID,NumberOfRecords
FROM [SQLPerfData].[dbo].[DisplayToID]
WHERE GUID IN(
SELECT DISTINCT A.GUID FROM [SQLPerfData].[dbo].[CounterData] A WITH(NOLOCK)
JOIN [dbo].[CounterDetails_Collect] B WITH(NOLOCK) ON A.CounterID=B.CounterID
WHERE B.MachineName=@MachineName)
) AA
WHERE ROW_ID=1 --删除已经收集的
DELETE A FROM [SQLPerfData].[dbo].[CounterData] A WITH(NOLOCK)
JOIN [dbo].[CounterDetails_Collect] B WITH(NOLOCK) ON A.CounterID=B.CounterID
WHERE A.[RecordIndex]>@MinRecordIndex AND A.[RecordIndex]<=@MaxRecordIndex AND B.MachineName=@MachineName --恢复当前有效值
SET @MaxRecordIndex=@MinRecordIndex
SET @MinRecordIndex=0
END IF @MaxRecordIndex IS NOT NULL
BEGIN
BEGIN TRY
--BEGIN TRAN
----收集
INSERT INTO [dbo].[CounterData_FifteenSeconds](CounterID,CounterDateTime,CounterValue)
SELECT A.CounterID,CONVERT(DATETIME,LEFT(A.CounterDateTime,23)),A.CounterValue
FROM [SQLPerfData].[dbo].[CounterData] A WITH(NOLOCK)
JOIN [dbo].[CounterDetails_Collect] B WITH(NOLOCK) ON A.CounterID=B.CounterID
WHERE A.[RecordIndex]>@MinRecordIndex AND A.[RecordIndex]<=@MaxRecordIndex AND B.MachineName=@MachineName UPDATE [dbo].[CounterDetails_Dts]
SET LastFifteenSec=@FifteenSec,[LastRecordIndex]=@MaxRecordIndex
WHERE MachineName=@MachineName
--COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT>0
COMMIT;
--THROW
END CATCH --更新
/*
UPDATE [dbo].[CounterDetails_Dts]
SET LastFifteenSec=@FifteenSec,[LastRecordIndex]=@MaxRecordIndex
WHERE [CounterID]=@CounterID */ --删除30分钟内的数据 END DELETE A
FROM [CounterData_FifteenSeconds] A
JOIN [dbo].[CounterDetails_Collect] B WITH(NOLOCK) ON A.CounterID=B.CounterID
WHERE B.MachineName=@MachineName AND CounterDateTime<DATEADD(WEEK,-1,@FifteenSec) FETCH NEXT FROM CUR_COUNTERDATA INTO @MachineName
END
CLOSE CUR_COUNTERDATA
DEALLOCATE CUR_COUNTERDATA --监控

spb_Perf_CounterDataCollect

3、 汇总取均值,将15秒钟数据汇总成1分钟,5分钟,半小时,一小时,六小时数据。各个粒度的数据用于不同时段的报表显示。例如1分钟数据汇总可用于显示一天内的报表,一个月的报表则需要一小时的数据才能正常显示。通过作业调用spb_Perf_CounterDataDts汇总。

 /****************************** 功能描述:<性能计数器15秒统计>
* 创建者:<HuangCH〉
* 创建日期:<2014-09-22>
* 备注说明:<根据具体业务而定,每分钟一次>
##########
Change Log
##########
Date Changer Description
--------------------------------------------------
<2014-09-22> <HuangCH> <新建>
--------------------------------------------------
***************************/
ALTER PROC [dbo].[spb_Perf_CounterDataDts]
as
--定义当前时间
SET NOCOUNT ON
DECLARE @OneMinute DATETIME
,@FiveMinute DATETIME
,@HalfHour DATETIME
,@OneHour DATETIME
,@SixHour DATETIME
DECLARE @OldOneMinute datetime
,@OldFiveMinute datetime
,@OldHalfHour datetime
,@OldOneHour datetime
,@OldSixHour datetime
,@OldFifteenSec DATETIME --MachineName
DECLARE @MachineName SYSNAME DECLARE CUR_CounterDataDts CURSOR FOR SELECT DISTINCT MachineName
FROM [dbo].[CounterDetails_Dts] WITH(NOLOCK)
OPEN CUR_CounterDataDts
FETCH NEXT FROM CUR_CounterDataDts INTO @MachineName WHILE @@FETCH_STATUS=0
BEGIN
SELECT
@OldFifteenSec= LastFifteenSec,
@OldOneMinute= LastOneMinute,
@OldFiveMinute= LastFiveMinute,
@OldHalfHour=LastHalfHour,
@OldOneHour=LastOneHour,
@OldSixHour=LastSixHour
FROM [dbo].[CounterDetails_Dts] WITH(NOLOCK)
WHERE MachineName=@MachineName SET @OneMinute=CONVERT(VARCHAR(16),@OldFifteenSec,120)
SET @FiveMinute=Dateadd(mi,Datepart(mi,@OneMinute) / 5 * 5 - Datepart(mi,@OneMinute),@OneMinute)
SET @HalfHour=Dateadd(mi,Datepart(mi,@OneMinute) / 30 * 30 - Datepart(mi,@OneMinute),@OneMinute)
SET @OneHour=CONVERT(VARCHAR(14),@OneMinute,120)+'00:00'
SET @SixHour=Dateadd(HH,Datepart(HH,@OneHour) / 6 * 6 -Datepart(hh,@OneHour),@OneHour) --超过60分钟未收集,则只收集60分钟以内的数据
IF DATEDIFF(MI,@OldOneMinute,@OneMinute)>60
BEGIN
SET @OldOneMinute=DATEADD(MI,-60,@OneMinute)
END UPDATE [dbo].[CounterDetails_Dts]
SET LastOneMinute=@OneMinute,LastFiveMinute=@FiveMinute,LastHalfHour=@HalfHour,LastOneHour=@OneHour,LastSixHour=@SixHour
WHERE MachineName=@MachineName BEGIN TRY
--一分钟
INSERT INTO [dbo].[CounterData_OneMinute]
SELECT A.CounterID,CONVERT(VARCHAR(16),A.CounterDateTime,120),AVG(A.CounterValue)
FROM [dbo].[CounterData_FifteenSeconds] A WITH(NOLOCK)
JOIN [dbo].[CounterDetails_Collect] B WITH(NOLOCK) ON A.CounterID=B.CounterID
WHERE B.MachineName=@MachineName AND A.CounterDateTime <= @OneMinute And A.CounterDateTime > @OldOneMinute
GROUP BY A.CounterID,CONVERT(VARCHAR(16),A.CounterDateTime,120) END TRY
BEGIN CATCH
IF @@ROWCOUNT>0
COMMIT
END CATCH
BEGIN TRY
--五分钟
INSERT INTO [dbo].[CounterData_FiveMinute]
SELECT A.CounterID,Dateadd(mi,Datepart(mi,A.CounterDateTime) / 5 * 5 - Datepart(mi,A.CounterDateTime),CONVERT(DATETIME,CONVERT(CHAR(16),A.CounterDateTime,120))),AVG(A.CounterValue)
FROM [dbo].[CounterData_OneMinute] A WITH(NOLOCK)
JOIN [dbo].[CounterDetails_Collect] B WITH(NOLOCK) ON A.CounterID=B.CounterID
WHERE B.MachineName=@MachineName AND A.CounterDateTime <= @FiveMinute And A.CounterDateTime > @OldFiveMinute
GROUP BY A.CounterID,Dateadd(mi,Datepart(mi,A.CounterDateTime) / 5 * 5 - Datepart(mi,A.CounterDateTime),CONVERT(DATETIME,CONVERT(CHAR(16),A.CounterDateTime,120))) END TRY
BEGIN CATCH
IF @@ROWCOUNT>0
COMMIT END CATCH
BEGIN TRY
--半个小时
INSERT INTO [dbo].[CounterData_HalfHour]
SELECT A.CounterID,Dateadd(mi,Datepart(mi,A.CounterDateTime) / 30 * 30 - Datepart(mi,A.CounterDateTime),CONVERT(DATETIME,CONVERT(CHAR(16),A.CounterDateTime,120))),AVG(A.CounterValue)
FROM [dbo].[CounterData_OneMinute] A WITH(NOLOCK)
JOIN [dbo].[CounterDetails_Collect] B WITH(NOLOCK) ON A.CounterID=B.CounterID
WHERE B.MachineName=@MachineName AND A.CounterDateTime <= @HalfHour And A.CounterDateTime > @OldHalfHour
GROUP BY A.CounterID,Dateadd(mi,Datepart(mi,A.CounterDateTime) / 30 * 30 - Datepart(mi,A.CounterDateTime),CONVERT(DATETIME,CONVERT(CHAR(16),A.CounterDateTime,120))) END TRY
BEGIN CATCH
IF @@ROWCOUNT>0
COMMIT
END CATCH BEGIN TRY
--一小时
INSERT INTO [dbo].[CounterData_OneHour]
SELECT A.CounterID,CONVERT(VARCHAR(14),A.CounterDateTime,120)+'00:00',AVG(A.CounterValue)
FROM [dbo].[CounterData_OneMinute] A WITH(NOLOCK)
JOIN [dbo].[CounterDetails_Collect] B WITH(NOLOCK) ON A.CounterID=B.CounterID
WHERE B.MachineName=@MachineName AND A.CounterDateTime <= @OneHour And A.CounterDateTime > @OldOneHour
GROUP BY A.CounterID,CONVERT(VARCHAR(14),A.CounterDateTime,120) END TRY
BEGIN CATCH
IF @@ROWCOUNT>0
COMMIT
END CATCH BEGIN TRY
--六小时
INSERT INTO [dbo].[CounterData_SixHour]
SELECT A.CounterID,Dateadd(HH,Datepart(HH,A.CounterDateTime) / 6 * 6 -Datepart(hh,A.CounterDateTime),A.CounterDateTime),AVG(A.CounterValue)
FROM [dbo].[CounterData_OneMinute] A WITH(NOLOCK)
JOIN [dbo].[CounterDetails_Collect] B WITH(NOLOCK) ON A.CounterID=B.CounterID
WHERE B.MachineName=@MachineName AND A.CounterDateTime <= @SixHour And A.CounterDateTime > @OldSixHour
GROUP BY A.CounterID,Dateadd(HH,Datepart(HH,A.CounterDateTime) / 6 * 6 -Datepart(hh,A.CounterDateTime),A.CounterDateTime)
END TRY
BEGIN CATCH
IF @@ROWCOUNT>0
COMMIT
END CATCH
FETCH NEXT FROM CUR_CounterDataDts INTO @MachineName
END
CLOSE CUR_CounterDataDts
DEALLOCATE CUR_CounterDataDts

spb_Perf_CounterDataDts

4、 计算历史数据为基线数据,与当前数据对比。SQL Server基线算法(同比和环比)

二、SQL Server汇总统计架构

如上图所示,计数器架构分别存储三个数据库SQLPerfData、SQLPerfDataStat、SQLPerfDataStat_Histroy;这三个计数器的功能具体如下:

1、 SQLPerfData接收计数器信息

DisplayToID:计数器自动生成,记录计数器启动信息

CounterDetails:计数器自动生成,记录计数器的基本信息

CounterData:记录计数器传入的数据

2、 SQLPerfDataStat统计计数器信息

基本信息模块:

CounterDetails_Collect:用于同步 CounterDetails表数据,用于轮训统计

CounterDetails_Collect_bak:无用计数器备份

CounterDetails_Dts:统计传输控制表,以服务器为单位,记录服务器统计传输时间。

CounterDetails_Report:同步CounterDetails_Collect表信息,通过优化,用于报表显示作用。

数据模块:

CounterData_FifteenSeconds:15秒数据收集,用于同步CounterData表数据。

CounterData_OneMinute:一分钟数据收集,15秒数据均值计算而成;适合查看当天数据。保留7天数据。

CounterData_FiveMinute:五分钟数据收集,一分钟数据均值计算而成;适合查看4天内数据。保留7天数据。

CounterData_HalfHour:30分钟数据收集,一分钟数据均值计算而成;适合查看一周内数据。保留7天数据。

CounterData_OneHour:一小时数据收集,一分钟数据均值计算而成;适合查看一个月内数据。保留永久

CounterData_SixHour:六小时数据收集,一分钟数据均值计算而成;适合查看一年内数据。保留永久

基线模块:

CBaseCounterData_OneMinute:同比基线,可以计算未来一周的数据走势。保留7天数据。

RBaseCounterData_OneMinute:环比基线,可以计算未来一天的数据走势。保留7天数据。

手动维护模块:

CounterTypeDetails:计数器类型和描述信息记录表。

MonitorContorl:手动维护,计数器报警监控控制表。

3、SQLPerfDataStat_Histroy归档计数器信息

CounterData_OneMinute_bak:一分钟数据备份,保留永久。

CounterData_FiveMinute_bak:五分钟数据备份,保留永久。

CounterData_HalfHour_bak:30分钟数据备份,保留永久。

基线模块:

CBaseCounterData_OneMinute_bak:同比基线备份,保留7天。

RBaseCounterData_OneMinute_bak:环比基线备份,保留7天。

SQL Server性能计数器收集汇总方案(Reporting Service)的更多相关文章

  1. SQL Server 2016 CTP3.2 开荒 Reporting Service 篇

    仅仅是开荒资源页,反正过不了多久就会有新的CTP. 下面是MSDN I Tell you 提供的 不过是中文,个人不是很建议,因为现在大多的资源页都是英文的ed2k://|file|cn_sql_se ...

  2. SQL Server 127个SQL server热门资料汇总

      SQL Server 127个SQL server热门资料汇总     最近有许多关于如何学习SQLSERVER的问题,其实新手入门的资源和贴子很多,现在向大家隆重推荐经过精心整理的[SQLSer ...

  3. SQL Server游标 C# DataTable.Select() 筛选数据 什么是SQL游标? SQL Server数据类型转换方法 LinQ是什么? SQL Server 分页方法汇总

    SQL Server游标   转载自:http://www.cnblogs.com/knowledgesea/p/3699851.html. 什么是游标 结果集,结果集就是select查询之后返回的所 ...

  4. 【转】sql server数据收集和监控

    转自:https://www.cnblogs.com/zhijianliutang/p/4476403.html 相关系列: https://www.cnblogs.com/zhijianliutan ...

  5. SQL Server性能计数器部署(批量)

    一.计数器部署项目介绍 SQL Server每个服务器,日常需要监控的计数器指标高达上百,若一个个手动添加非常麻烦.此项目通过命令行工具针对指定计数器集成部署,提高部署效率.此包括开发数据库互联(OD ...

  6. 大数据时代下的SQL Server第三方负载均衡方案----Moebius测试

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 架构原理(Architecture) 测试环境(Environment) 安装Moebius( ...

  7. (转)大数据时代下的SQL Server第三方负载均衡方案----Moebius测试

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 架构原理(Architecture) 测试环境(Environment) 安装Moebius( ...

  8. 找回丢失的SQL Server性能计数器

    There was one time when I was delivering a Service using a tool that gathers performance data throug ...

  9. sql server 性能计数器

    常规计数器 收集操作系统服务器的服务器性能信息,包括Processor.磁盘.网络.内存 Processor 处理器 1.1 % Processor Time指处理器用来执行非闲置线程时间的百分比.通 ...

随机推荐

  1. github入门到上传本地项目

    GitHub是基于git实现的代码托管.git是目前最好用的版本控制系统了,非常受欢迎,比之svn更好. GitHub可以免费使用,并且快速稳定.即使是付费帐户,每个月不超过10美刀的费用也非常便宜. ...

  2. 升级Ubuntu 16.04 LTS后 DSL拨号上网(ppp)连接自动断开解决办法

    原本在Ubuntu 15.10用拨号上网没有问题,但升级了16.04 LTS后发现原来的DSL连接不上了.主要表现为: 1.在NetworkManager里面选择DSL Connection能够尝试拨 ...

  3. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  4. [LeetCode] Can I Win 我能赢吗

    In the "100 game," two players take turns adding, to a running total, any integer from 1.. ...

  5. [LeetCode] Customers Who Never Order 从未下单订购的顾客

    Suppose that a website contains two tables, the Customers table and the Orders table. Write a SQL qu ...

  6. MVC系列——MVC源码学习:打造自己的MVC框架(二:附源码)

    前言:上篇介绍了下 MVC5 的核心原理,整篇文章比较偏理论,所以相对比较枯燥.今天就来根据上篇的理论一步一步进行实践,通过自己写的一个简易MVC框架逐步理解,相信通过这一篇的实践,你会对MVC有一个 ...

  7. python基础-面向对象编程

    一.三大编程范式 编程范式即编程的方法论,标识一种编程风格 三大编程范式: 1.面向过程编程 2.函数式编程 3.面向对象编程 二.编程进化论 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 ...

  8. 未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\106f9ae8\cc0e1

    在本地开发环境没问题,但是发布到服务器出现:未能写入输出文件"c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.Ne ...

  9. canvas-图片翻转

    图片90度翻转 在canvas中插入图片需先加载图片(利用Image对象);加载完成后再执行操作drawImage(obj,x,y,w,h) 插入图片的坐标宽高等值 <!DOCTYPE html ...

  10. C#图像处理笔记

    1.灰度拉伸 灰度拉伸又叫对比度拉伸,它是最基本的一种灰度变换,使用的是最简单的分段线性变换函数,它的主要思想是提高图像处理时灰度级的动态范围.