A partire dal SQL Server 2008 R2, fare analisi sulle performance dei reporting services è diventato ancora più semplice con l’aggiunta, all’interno del database ReportServer (o ReportServer$<nome istanza>), della vista [ExecutionLog3].
In questa vista, tre sono le informazioni in grado di farci analizzare i tempi necessari a generare un report:
In sostanza potremmo definire questa equazione:
TempoTotale = TimeDataRetrieval + TimeProcessing + TimeRendering
Se volessi trovare i dieci report più lenti, come tempo totale, potrei quindi scrivere qualcosa come:
WITH myQuery AS ( SELECT TOP 10 ItemPath , TimeDataRetrieval + TimeProcessing + TimeRendering AS [TotalTime ms] FROM ExecutionLog3 ) SELECT ItemPath, [TotalTime ms], ([TotalTime ms]/1000.0) as [TotalTime sec] FROM myQuery ORDER BY [TotalTime ms] DESC;
Quali azioni posso considerare per diminuire eventuali alti tempi di elaborazione?
La vista [ExecutionLog3], oltre a quanto sopra, può essere utilizzata per una serie di analisi utili a comprendere il reale utilizzo della soluzione di reportistica.
Qualche esempio…
Report richiamati in un giorno
DECLARE @d date = '20120731'; WITH myQuery AS ( SELECT CAST( timestart AS date )AS reportDate , ItemPath FROM ExecutionLog3 WHERE ItemPath != '' ) SELECT COUNT( reportDate )AS Nr , reportDate , ItemPath FROM myQuery WHERE reportDate = @d GROUP BY reportDate , ItemPath ORDER BY COUNT( reportDate )DESC;
Utenti più attivi negli ultimi trenta giorni
SELECT UserName, COUNT(1) AS Nr FROM ExecutionLog3 WHERE TimeStart > GETDATE() - 30 GROUP BY UserName ORDER BY COUNT(1) DESC
Prima / ultima e numero di esecuzioni
SELECT MIN( dbo.ExecutionLog3.TimeStart ) AS [First Execution] , MAX( dbo.ExecutionLog3.TimeStart ) AS [Last Execution] , COUNT( dbo.ExecutionLog3.TimeStart ) AS Nr , ItemPath FROM dbo.ExecutionLog3 WHERE Status = 'rsSuccess' AND ItemPath != '' GROUP BY ItemPath ORDER BY Nr desc;