Last Updated on Friday, 02 December 2011
I've recently written a report for SQL Server Reporting Services 2008 R2 (SSRS) which will compare up to 4 reports and will compare the time taken for each one. The breakdown or what I was able to measure with the default installation are the times taken for "data retrieval", "processing", "rendering", and then the totals of these.
I haven't Googled this at the time of print so there may be a million better solutions out there, this is just how I did it. This may look like a horrible report which would fail an accessibility test but visually it says straight away which is the better report; and when comparing to the previous runs (using a second dataset) you can tell where changes were made and how this affected the reports' performance.
What?
What I'm trying to do is display a set of results (comparing various reports) in a table and then to color the backgrounds based on whether they are the fastest or slowest in the set.
Something like:
The DataSet
This should work on your reporting server as well. I'm using the database "ReportServer".
- select * from
- (
- SELECT TOP 1
- c.[Name] AS [ReportName]
- , e.[ReportID] AS [ReportID]
- , e.[TimeStart] AS [TimeStamp]
- , e.[Parameters] AS [Parameters]
- , e.[ByteCount] AS [Size]
- , e.[TimeDataRetrieval] AS [Data Retrieval]
- , e.[TimeProcessing] AS [Process Time]
- , e.[TimeRendering] AS [Render Time]
- , DATEDIFF(MILLISECOND, e.TimeStart, e.TimeEnd) [Total Time]
- ,RANK() OVER (ORDER BY e.[TimeStart] DESC) [Rank]
- FROM
- [ReportServer].[dbo].[ExecutionLogStorage] e
- INNER JOIN
- [ReportServer].[dbo].[Catalog] c ON e.ReportID = c.ItemID
- WHERE
- e.[ReportID] = @ReportParameter1
- union all
- SELECT TOP 1
- c.[Name] AS [ReportName]
- , e.[ReportID] AS [ReportID]
- , e.[TimeStart] AS [TimeStamp]
- , e.[Parameters] AS [Parameters]
- , e.[ByteCount] AS [Size]
- , e.[TimeDataRetrieval] AS [Data Retrieval]
- , e.[TimeProcessing] AS [Process Time]
- , e.[TimeRendering] AS [Render Time]
- , DATEDIFF(MILLISECOND, e.TimeStart, e.TimeEnd) [Total Time]
- ,RANK() OVER (ORDER BY e.[TimeStart] DESC) [Rank]
- FROM
- [ReportServer].[dbo].[ExecutionLogStorage] e
- INNER JOIN
- [ReportServer].[dbo].[Catalog] c ON e.ReportID = c.ItemID
- WHERE
- e.[ReportID] = @ReportParameter2
- union all
- SELECT TOP 1
- c.[Name] AS [ReportName]
- , e.[ReportID] AS [ReportID]
- , e.[TimeStart] AS [TimeStamp]
- , e.[Parameters] AS [Parameters]
- , e.[ByteCount] AS [Size]
- , e.[TimeDataRetrieval] AS [Data Retrieval]
- , e.[TimeProcessing] AS [Process Time]
- , e.[TimeRendering] AS [Render Time]
- , DATEDIFF(MILLISECOND, e.TimeStart, e.TimeEnd) [Total Time]
- ,RANK() OVER (ORDER BY e.[TimeStart] DESC) [Rank]
- FROM
- [ReportServer].[dbo].[ExecutionLogStorage] e
- INNER JOIN
- [ReportServer].[dbo].[Catalog] c ON e.ReportID = c.ItemID
- WHERE
- e.[ReportID] = @ReportParameter3
- union all
- SELECT TOP 1
- c.[Name] AS [ReportName]
- , e.[ReportID] AS [ReportID]
- , e.[TimeStart] AS [TimeStamp]
- , e.[Parameters] AS [Parameters]
- , e.[ByteCount] AS [Size]
- , e.[TimeDataRetrieval] AS [Data Retrieval]
- , e.[TimeProcessing] AS [Process Time]
- , e.[TimeRendering] AS [Render Time]
- , DATEDIFF(MILLISECOND, e.TimeStart, e.TimeEnd) [Total Time]
- ,RANK() OVER (ORDER BY e.[TimeStart] DESC) [Rank]
- FROM
- [ReportServer].[dbo].[ExecutionLogStorage] e
- INNER JOIN
- [ReportServer].[dbo].[Catalog] c ON e.ReportID = c.ItemID
- WHERE
- e.[ReportID] = @ReportParameter4
- ) AS t1
- ORDER BY
- t1.[TimeStamp] ASC
- SELECT Name, ItemID
- FROM Catalog
- WHERE Type = 2
- ORDER BY Name
The Side-by-Side Table
As you know, most datasets will return the rows as ... rows. My pic above shows my 4 reports results side by side. To do this, I had to insert a Matrix rather than a Tablix:
- Insert a "Matrix" into the body of your report.
- Drag "ReportName" into the field that says "Columns".
- Right-click on the grey left margin and select "Insert Row" then "Outside Group - Below".
- Delete the row with the left parenthesis
- Click on the dropdown of "Data" and select "TimeStamp".
- Click in the left of that column and type the word "TimeStamp".
- Right-click on the left grey margin of this and select "Insert Row" then "Below".
- Repeat with all values you want to compare.
- For each Data cell, Set the background fill expression as per the MDX expression below.
The MDX Expression
This is to be applied to the "Fill" expression of the textbox with the field name changed for each cell you apply this to; note that in the following example, "Data_Retrieval" is the field to compare (of all "Data_Retrieval" values) and "Report1" is the name of my dataset:
- =IIF(
- Fields!Data_Retrieval.Value=MAX(Fields!Data_Retrieval.Value, "Report1"),
- "Red",
- IIF(
- Fields!Data_Retrieval.Value=MIN(Fields!Data_Retrieval.Value, "Report1"),
- "Green",
- IIF(
- Fields!Data_Retrieval.Value<AVG(Fields!Data_Retrieval.Value, "Report1"),
- "Yellow",
- "Orange"
- )
- )
- )
Previously on SSRS...
If you want the second dataset I use in my report to show how the reports you are comparing performed in their previous run, here it is:
- select * from
- (
- SELECT TOP 2
- c.[Name] AS [ReportName]
- , e.[ReportID] AS [ReportID]
- , e.[TimeStart] AS [TimeStamp]
- , e.[Parameters] AS [Parameters]
- , e.[ByteCount] AS [Size]
- , e.[TimeDataRetrieval] AS [Data Retrieval]
- , e.[TimeProcessing] AS [Process Time]
- , e.[TimeRendering] AS [Render Time]
- , DATEDIFF(MILLISECOND, e.TimeStart, e.TimeEnd) [Total Time]
- ,RANK() OVER (ORDER BY e.[TimeStart] DESC) [Rank]
- FROM
- [ReportServer].[dbo].[ExecutionLogStorage] e
- INNER JOIN
- [ReportServer].[dbo].[Catalog] c ON e.ReportID = c.ItemID
- WHERE
- e.[ReportID] = @ReportParameter1
- union all
- SELECT TOP 2
- c.[Name] AS [ReportName]
- , e.[ReportID] AS [ReportID]
- , e.[TimeStart] AS [TimeStamp]
- , e.[Parameters] AS [Parameters]
- , e.[ByteCount] AS [Size]
- , e.[TimeDataRetrieval] AS [Data Retrieval]
- , e.[TimeProcessing] AS [Process Time]
- , e.[TimeRendering] AS [Render Time]
- , DATEDIFF(MILLISECOND, e.TimeStart, e.TimeEnd) [Total Time]
- ,RANK() OVER (ORDER BY e.[TimeStart] DESC) [Rank]
- FROM
- [ReportServer].[dbo].[ExecutionLogStorage] e
- INNER JOIN
- [ReportServer].[dbo].[Catalog] c ON e.ReportID = c.ItemID
- WHERE
- e.[ReportID] = @ReportParameter2
- union all
- SELECT TOP 2
- c.[Name] AS [ReportName]
- , e.[ReportID] AS [ReportID]
- , e.[TimeStart] AS [TimeStamp]
- , e.[Parameters] AS [Parameters]
- , e.[ByteCount] AS [Size]
- , e.[TimeDataRetrieval] AS [Data Retrieval]
- , e.[TimeProcessing] AS [Process Time]
- , e.[TimeRendering] AS [Render Time]
- , DATEDIFF(MILLISECOND, e.TimeStart, e.TimeEnd) [Total Time]
- ,RANK() OVER (ORDER BY e.[TimeStart] DESC) [Rank]
- FROM
- [ReportServer].[dbo].[ExecutionLogStorage] e
- INNER JOIN
- [ReportServer].[dbo].[Catalog] c ON e.ReportID = c.ItemID
- WHERE
- e.[ReportID] = @ReportParameter3
- union all
- SELECT TOP 2
- c.[Name] AS [ReportName]
- , e.[ReportID] AS [ReportID]
- , e.[TimeStart] AS [TimeStamp]
- , e.[Parameters] AS [Parameters]
- , e.[ByteCount] AS [Size]
- , e.[TimeDataRetrieval] AS [Data Retrieval]
- , e.[TimeProcessing] AS [Process Time]
- , e.[TimeRendering] AS [Render Time]
- , DATEDIFF(MILLISECOND, e.TimeStart, e.TimeEnd) [Total Time]
- ,RANK() OVER (ORDER BY e.[TimeStart] DESC) [Rank]
- FROM
- [ReportServer].[dbo].[ExecutionLogStorage] e
- INNER JOIN
- [ReportServer].[dbo].[Catalog] c ON e.ReportID = c.ItemID
- WHERE
- e.[ReportID] = @ReportParameter4
- ) AS t1
- WHERE
- t1.[Rank]=2
- ORDER BY
- t1.[TimeStamp] ASC
- ssrs background color based on results
- ssrs colours depending on field values
Latest Posts
-
Joes Revolver Map (JRM)
-
Fri 17-May-13
Hmmm... Sounds like a problem with the identifier. Was it working before and has there been a change ...
-
Fri 17-May-13
Hello Joel: Yes, I do have it published on all pages of the site. I just went back to Revolver maps to ...
-
Fri 17-May-13
Hi Bill, From the developers of RevolverMaps, "the module would need to be published on every page ...
-
Fri 17-May-13
Hi Bill, I'll investigate further as you're not the first to say this happens. In the meantime, simply ...
-
Fri 17-May-13
Its a great extension. But when I set it up I only show my presence on the 3D map and no other visitors ...
-
Fri 17-May-13

