基线介绍
基线为历史数据统计而成的数据,具有参考价值,并利用基线数据与当前值的对比,通过一定的报警机制,形成实时监控架构。SQL Server计数器采用同比和环比两种方式。
同比:可以计算未来一周的基线数据,取近八周同一天同一时刻的均值。
1 /****************************** 功能描述:<同比基线算法> 2 * 创建者:<HuangCH〉 3 * 创建日期:<2014-11-05> 4 * 备注说明:<每天执行一次> 5 ########## 6 Change Log 7 ########## 8 Date Changer Description 9 -------------------------------------------------- 10 <2014-11-05> <HuangCH> <新建> 11 说明: 12 1、同比算法取近八周数据可以统计一周后的数据 13 2、考虑当天前一周0点之前的数据已经归档SQLPerfDataStat_Histroy.dbo.CounterData_OneMinute_Bak,因此要计算前一天之前的数据。 14 15 2、计数器新建要超过一周才能开始计算 16 17 3、开始时间当天0点与结束时间不能超过一周--CONVERT(VARCHAR(26),DATEADD(WEEK,1,@LastCBaseEnd),23)<=@LastOneMinute 18 19 -------------------------------------------------- 20 ***************************/ 21 ALTER PROC [dbo].[spb_CBaseCounterData] 22 AS 23 SET NOCOUNT ON 24 DECLARE @LastOneMinute DATETIME 25 DECLARE @LastCBaseEnd DATETIME --计算一周之后的数据 26 DECLARE @RunCBaseEnd DATETIME 27 DECLARE @RunCBaseEtart DATETIME 28 DECLARE @CounterID INT 29 DECLARE @MachineName VARCHAR(128) 30 31 --若时间未超过一周,则取当前时间 32 UPDATE SQLPerfDataStat.dbo.CounterDetails_Dts 33 SET LastCBaseEnd=DATEADD(D,-1,LastOneMinute) 34 WHERE DATEADD(WEEK,-1,DATEADD(D,-1,LastOneMinute))<CreateTime 35 36 DECLARE CBaseCur CURSOR FOR 37 --计数器新建超过一周; 38 --只能计算当天0点之前的数据:CONVERT(DATETIME,CONVERT(VARCHAR(16),LastOneMinute,23)) 39 --计算当前的时间的前天之前 40 SELECT DISTINCT MachineName,DATEADD(D,-1,LastOneMinute) LastOneMinute,CONVERT(DATETIME,CONVERT(VARCHAR(16),LastCBaseEnd,120)) LastCBaseEnd 41 FROM SQLPerfDataStat.dbo.CounterDetails_Dts WITH(NOLOCK) 42 WHERE DATEDIFF(MI,CONVERT(DATETIME,CONVERT(VARCHAR(16),LastCBaseEnd,120)),DATEADD(D,-1,LastOneMinute))>=1 and DATEADD(WEEK,-1,DATEADD(D,-1,LastOneMinute))>=CreateTime 43 44 OPEN CBaseCur 45 46 FETCH NEXT FROM CBaseCur INTO @MachineName,@LastOneMinute,@LastCBaseEnd 47 48 WHILE @@FETCH_STATUS=0 49 BEGIN 50 51 IF CONVERT(VARCHAR(26),DATEADD(WEEK,1,@LastCBaseEnd),23)<=@LastOneMinute--超过一周未收集则时间为上次收集时间推迟一周 52 BEGIN 53 SET @RunCBaseEnd=CONVERT(VARCHAR(26),DATEADD(WEEK,1,@LastCBaseEnd),23) 54 SET @RunCBaseEtart=@LastCBaseEnd 55 END 56 ELSE 57 BEGIN 58 SET @RunCBaseEnd=@LastOneMinute 59 SET @RunCBaseEtart=@LastCBaseEnd 60 END 61 62 UPDATE SQLPerfDataStat.dbo.CounterDetails_Dts 63 SET LastCBaseEnd=@RunCBaseEnd 64 WHERE MachineName=@MachineName 65 66 BEGIN TRY 67 68 INSERT INTO dbo.CBaseCounterData_OneMinute(CounterID, CounterDateTime, CounterValue,MaxCounterValue) 69 SELECT CounterID 70 ,DATEADD(MI,-DATEDIFF(MI,CounterDateTime,Dateadd(week,1,@RunCBaseEnd))%(7*24*60),Dateadd(week,1,@RunCBaseEnd)) CounterDateTime 71 ,AVG(CounterValue) CounterValue,MAX(CounterValue) MaxCounterValue 72 FROM ( 73 SELECT CounterID,CounterDateTime,CounterValue 74 FROM SQLPerfDataStat_Histroy.dbo.CounterData_OneMinute_Bak a (NOLOCK) 75 WHERE 76 ( 77 (CounterDateTime>=Dateadd(week,-7,@RunCBaseEtart) 78 AND CounterDateTime<Dateadd(week,-7,@RunCBaseEnd)) 79 OR 80 (CounterDateTime>=Dateadd(week,-6,@RunCBaseEtart) 81 AND CounterDateTime<Dateadd(week,-6,@RunCBaseEnd)) 82 OR 83 (CounterDateTime>=Dateadd(week,-5,@RunCBaseEtart) 84 AND CounterDateTime<Dateadd(week,-5,@RunCBaseEnd)) 85 OR 86 (CounterDateTime>=Dateadd(week,-4,@RunCBaseEtart) 87 AND CounterDateTime<Dateadd(week,-4,@RunCBaseEnd)) 88 OR 89 (CounterDateTime>=Dateadd(week,-3,@RunCBaseEtart) --取近四周 90 AND CounterDateTime<Dateadd(week,-3,@RunCBaseEnd)) 91 OR 92 (CounterDateTime>=Dateadd(week,-2,@RunCBaseEtart) 93 AND CounterDateTime<Dateadd(week,-2,@RunCBaseEnd)) 94 OR 95 (CounterDateTime>=Dateadd(week,-1,@RunCBaseEtart) 96 AND CounterDateTime<Dateadd(week,-1,@RunCBaseEnd)) 97 ) AND EXISTS (SELECT TOP 1 1 FROM CounterDetails_Collect WITH(NOLOCK) WHERE CounterID = a.CounterID AND MachineName=@MachineName) 98 UNION ALL 99 SELECT CounterID,CounterDateTime,CounterValue 100 FROM dbo.CounterData_OneMinute a (NOLOCK) 101 WHERE (CounterDateTime>=@RunCBaseEtart 102 AND CounterDateTime<@RunCBaseEnd) 103 AND EXISTS (SELECT TOP 1 1 FROM CounterDetails_Collect WITH(NOLOCK) WHERE CounterID = a.CounterID AND MachineName=@MachineName) 104 ) AA 105 GROUP BY CounterID,DATEADD(MI,-DATEDIFF(MI,CounterDateTime,Dateadd(week,1,@RunCBaseEnd))%(7*24*60),Dateadd(week,1,@RunCBaseEnd)) 106 107 END TRY 108 BEGIN CATCH 109 IF @@TRANCOUNT >0 110 BEGIN 111 Rollback; 112 END; 113 THROW 114 END CATCH 115 116 FETCH NEXT FROM CBaseCur INTO @MachineName,@LastOneMinute,@RunCBaseEnd 117 END 118 CLOSE CBaseCur 119 DEALLOCATE CBaseCur