2016-12-16 46 views
5

(üretimde daha fazla sütun vardır) iki sütun ile basit denetim masası bulunduğunu varsayalım: istek işlendiğindeölçün uygulama performansı

ID | Date 

, bu tabloya bir kayıt eklemek . İstekler gruplar halinde işlenir, toplu olarak herhangi bir sayıda öğe olabilir. Her öğe için bir kayıt ekleyeceğiz. Gruplar arasında en az 2 saniyelik gecikme olacaktır (sayı yapılandırılabilir).

Performans, istekleri, örneğin, saniye başına, birim başına ne kadar hızlı işleyebileceğimiz ile ölçülür. Bu örnek verileri göz önünde bulundurun (2 kümeleri, öğelerin sayısı demo amaçlı eşittir):

--2016-01-29 10:27:25.603 
--2016-01-29 10:27:25.620 
--2016-01-29 10:27:25.637 
--2016-01-29 10:27:25.653 
--2016-01-29 10:27:25.723 
--Avg time between requests = 24ms 

--2016-01-29 10:27:34.647 
--2016-01-29 10:27:34.667 
--2016-01-29 10:27:34.680 
--2016-01-29 10:27:34.690 
--2016-01-29 10:27:34.707 
--Avg time = 12ms 

Biz en kötü ihtimalle 41,67 istekleri saniyede işlenebilir söyleyebiliriz ve 83,33 en iyi ihtimalle. Ortalama parti performansını da bilmek güzel olurdu.

Soru. Bu metrikleri tek başına T-SQL kullanarak elde etmek mümkün mü?

DÜZENLEME: Sonuçları istatistiksel olarak anlamlı hale getirmek için, toplu öğeleri 10 öğeden daha küçük olandan (yapılandırılabilir) ayırmak yararlı olabilir.

cevap

3

Belki üzerinde aşağıdaki

Declare @YourTable table (ID int,Date datetime) 
Insert Into @YourTable values 
(1,'2016-01-29 10:27:25.603'), 
(2,'2016-01-29 10:27:25.620'), 
(3,'2016-01-29 10:27:25.637'), 
(4,'2016-01-29 10:27:25.653'), 
(5,'2016-01-29 10:27:25.723'), 
(6,'2016-01-29 10:27:34.647'), 
(7,'2016-01-29 10:27:34.667'), 
(8,'2016-01-29 10:27:34.680'), 
(9,'2016-01-29 10:27:34.690'), 
(10,'2016-01-29 10:27:34.707') 


Declare @BatchSecondsGap int = 2 -- Seconds Between Batches 
Declare @MinObservations int = 5 -- Batch must n or greater 

;with cte as (
     Select *,Cnt = sum(1) over (Partition By Batch) 
     From (
       Select *,Batch = sum(Flg) over (Order By Date) 
       From (
        Select ID,Date 
          ,Flg = case when DateDiff(SECOND,Lag(Date,1,null) over (Order By Date),Date)>[email protected] then 1 else 0 end 
          ,MS = case when DateDiff(SECOND,Lag(Date,1,Date) over (Order By Date),Date)>[email protected] then 0 else DateDiff(MILLISECOND,Lag(Date,1,Date) over (Order By Date),Date) end 
         From @YourTable 
        ) A 
      ) B 
) 
Select Title = 'Total' 
     ,DateR1 = min(Date) 
     ,DateR2 = max(Date) 
     ,BatchCnt = count(Distinct Batch) 
     ,TransCnt = count(*) 
     ,MS_Ttl = sum(MS) 
     ,MS_Avg = avg(MS*1.0) 
     ,MS_Std = stdev(MS) 
From cte 
Where Cnt>[email protected] 
Union All 
Select Title = concat('Batch ',Batch) 
     ,DateR1 = min(Date) 
     ,DateR2 = max(Date) 
     ,BatchCnt = count(Distinct Batch) 
     ,TransCnt = count(*) 
     ,MS_Ttl = sum(MS) 
     ,MS_Avg = avg(MS*1.0) 
     ,MS_Std = stdev(MS) 
From cte 
Where Cnt>[email protected] 
Group By Batch 

İade

enter image description here


aşağıda görüntü için cezalandırılmaz göstermektedir isteğinizi basitleştirilmiş ama dikkate ettik gruplar arasındaki süre, bu nedenle son sonuçlar için basit bir toplama olur

enter image description here

+0

Baştan başlamanızın mükemmel olduğunu düşünüyorum, yine de başımı SQL kodunun etrafına sarmak gerekiyor. İstatistiksel olarak anlamlı verileri içermek için 'HAVING sayısı (*)> 10' eklendi, ancak değişimlerim istatistiksel olarak önemsiz görünüyor. :) Sistemin günlerce iyi performansa ve kötü performans günlerine sahip olduğu görülüyor, ortalama işlem hızında 20 kat fark var. Yani, bir toplam ortalamanın hesaplanması gerçekten çok az anlam ifade eder. Toplam AVG = 91.21 ms, SD = 193,52 ms. Daha fazla anlam kazanmaya çalışmak için tarih aralıkları ekleyeceğim. Büyük cevap, kabul ... – Neolisk

+1

@Neolisk Yardım etmek için mutlu. Herhangi bir yardıma ihtiyacınız varsa bana ping –

+0

Orada ne olduğunu anladım, bir HAVING yan tümcesini eklesem de, sadece parti sayısını etkiledi ve "toplam" ölçüleri etkilemedi. SQL'inizi ayarlayabilir misiniz, böylece "toplam", yığınları yalnızca birkaç öğe ile birlikte atlar mı? – Neolisk