Mida el performance de la aplicación al agregar loggings de auditoría SQL

Supongamos que hay una tabla de auditoría simple con dos columnas (en producción hay más columnas):

ID | Date 

Cuando se procesa la request, agregamos un logging en esta tabla. Las requestes se procesan en lotes, puede haber cualquier cantidad de artículos en un lote. Para cada artículo, agregaremos un logging. Habrá al less 2 segundos de retraso entre los lotes (el número es configurable).

El performance se mide por la rapidez con que podemos procesar las requestes, por unidad de time, por ejemplo, por segundo. Tenga en count esta muestra de datos (2 clústeres, la cantidad de elementos es igual solo para fines de demostración):

 --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 

Podemos decir que, en el peor de los casos, se pueden procesar 41.67 requestes por segundo y 83.33 en el mejor de los casos. Sería bueno saber el performance del lote promedio también.

Pregunta. ¿Es posible get estas métricas usando solo T-SQL y cómo?

EDITAR: para hacer que los resultados sean estadísticamente significativos, puede ser útil descartar lotes que tengan less de 10 elementos de tamaño (configurables).

Tal vez he simplificado demasiado su request, pero considere lo siguiente

 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 

Devoluciones

enter image description here


La siguiente image muestra que no se le penalizará por el time entre lotes, por lo que se convierte en una simple agregación para los resultados finales

enter image description here