SQL Server性能计数器收集汇总方案(Reporting Service)
通过收集计数器信息,并将计数器信息汇总为不同粒度存储,以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)的更多相关文章
- SQL Server 2016 CTP3.2 开荒 Reporting Service 篇
仅仅是开荒资源页,反正过不了多久就会有新的CTP. 下面是MSDN I Tell you 提供的 不过是中文,个人不是很建议,因为现在大多的资源页都是英文的ed2k://|file|cn_sql_se ...
- SQL Server 127个SQL server热门资料汇总
SQL Server 127个SQL server热门资料汇总 最近有许多关于如何学习SQLSERVER的问题,其实新手入门的资源和贴子很多,现在向大家隆重推荐经过精心整理的[SQLSer ...
- SQL Server游标 C# DataTable.Select() 筛选数据 什么是SQL游标? SQL Server数据类型转换方法 LinQ是什么? SQL Server 分页方法汇总
SQL Server游标 转载自:http://www.cnblogs.com/knowledgesea/p/3699851.html. 什么是游标 结果集,结果集就是select查询之后返回的所 ...
- 【转】sql server数据收集和监控
转自:https://www.cnblogs.com/zhijianliutang/p/4476403.html 相关系列: https://www.cnblogs.com/zhijianliutan ...
- SQL Server性能计数器部署(批量)
一.计数器部署项目介绍 SQL Server每个服务器,日常需要监控的计数器指标高达上百,若一个个手动添加非常麻烦.此项目通过命令行工具针对指定计数器集成部署,提高部署效率.此包括开发数据库互联(OD ...
- 大数据时代下的SQL Server第三方负载均衡方案----Moebius测试
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 架构原理(Architecture) 测试环境(Environment) 安装Moebius( ...
- (转)大数据时代下的SQL Server第三方负载均衡方案----Moebius测试
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 架构原理(Architecture) 测试环境(Environment) 安装Moebius( ...
- 找回丢失的SQL Server性能计数器
There was one time when I was delivering a Service using a tool that gathers performance data throug ...
- sql server 性能计数器
常规计数器 收集操作系统服务器的服务器性能信息,包括Processor.磁盘.网络.内存 Processor 处理器 1.1 % Processor Time指处理器用来执行非闲置线程时间的百分比.通 ...
随机推荐
- 用css改变默认的checkbox样式
自己常用的改变checkbox样式的两个方法: 一.利用background用图片代替checkbox效果 缺点:你首先得有一张好看的图片 优点:浏览器兼容性好 <!doctype html&g ...
- auto_clipboard
黄山松发表于博客园:http://www.cnblogs.com/tomview/p/6137179.html #ifndef __HSS_AUTO_CLIPBOARD_HSS__#define __ ...
- 【JS/CSS3】实现带预览图幻灯片效果~
一.前期准备 1.1 案例分析 适用场景:单例布局1.2 方法论 V视图 HTML+CSS+调试C js实现控制流程D数据 优化扩展 二.代码 结构 <div class="slide ...
- Java使用MyEclipse构建webService简单案例
什么是WebServices? 它是一种构建应用程序的普遍模型,可以在任何支持网络通信的操作系统中实施运行;它是一种新的web应用程序分支,是自包含.自描述.模块化的应用,可以发布.定位.通过web ...
- c# float显示时保存一位小数
UI显示时候,需求保留一位小数 //保留一位小数 参考: http://blog.sina.com.cn/s/blog_620531730100kfz6.html float ff = 1.01f; ...
- java util 下的concurrent包
------------------------------------------java util 下的concurrent包--------并发包--------------------.jav ...
- chrome快捷键
常用的为: Ctrl + ] 下一个面板 Ctrl + [ 上一个面板 Ctrl + Alt + [ 去上一个历史记录的面板Ctrl + Alt + ] 去下一个历史记录的面板 Ct ...
- 解决ASP.NET上传文件大小限制
第一种方法,主要适用于IIS6.0版本 一.修改配置Web.Config文件中的httpRuntime节点对于asp.net,默认只允许上传4M文件,增加如下配置,一般可以自定义最大文件大小.一.修改 ...
- [LeetCode] Rotate Function 旋转函数
Given an array of integers A and let n to be its length. Assume Bk to be an array obtained by rotati ...
- [LeetCode] Trapping Rain Water 收集雨水
Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...