我们的一个Reporting Service服务上部署了比较多的SSRS报表,其中有一个系统的SSRS报表部署后,执行时间相对较长,加之供应商又在ASP.NET页面里面嵌套了Reporting Service的报表,使得用户对报表响应速度非常不满,于是和几个同事研究了一番如何定位、优化SSRS报表性能。

案例环境:

操作系统   :   Windows Server 2008 R2 Standard SP1

数据库版本 :   SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64)

现象描述:

综合了用户、开发人员那边反馈的问题后,发现该SSRS服务器上部署的其它系统的报表响应速度非常快,测试了其中几张报表发现基本在1~3秒内,但是这个系统(模块)的SSRS报表全部比较慢,基本上都8秒以上。而且是第一次访问非常慢,如果刷新或第二次访问非常快,但是如果修改报表URL参数时,也会非常慢。于是我就其中一个报表为例,查看该报表的的执行日志信息,如下所示,我们通过ExecutionLog与Catalog关联查看报表WF_MarkerRoom_Report的执行记录。具体细节可以参考一下Reporting Services 执行和跟踪日志记录

 

USE [ReportServer];

GO

 

SELECT  C.Name                         AS ReportName

       ,E.ReportID                     AS ReportID

       ,E.UserName                     AS UserName

       ,E.Format                       AS Format

       ,E.Parameters                   AS Parameters

       ,E.TimeStart                    AS TimeStart

       ,E.TimeEnd                      AS TimeEnd

       ,E.TimeDataRetrieval*1.0/1000   AS TimeDataRetrieval

       ,E.TimeProcessing*1.0/1000      AS TimeProcessing

       ,E.TimeRendering*1.0/1000       AS TimeRendering

       ,DATEDIFF(SECOND, TimeStart, TimeEnd)

                                       AS  CostTime

FROM ReportServer.dbo.ExecutionLog E WITH(NOLOCK)

INNER JOIN ReportServer.dbo.Catalog C WITH(NOLOCK)ON E.ReportID = C.ItemID

WHERE C.Name ='WF_MarkerRoom_Report'

   AND E.TimeStart > CAST('2014-12-25 00:00' AS DATETIME)

  AND E.TimeStart <= CAST('2014-12-25 12:00' AS DATETIME)

ORDER BY TimeStart DESC

    部分执行结果截图

从上可以看出报表的时间消耗在TimeDataRetrieval上,TimeDataRetrieval是SSRS检索数据、处理报表以及呈现报表所用的毫秒数(SQL里面,我转化为秒),于是我们首先怀疑是报表里面的SQL语句性能问题,于是将报表里面涉及的SQL语句、存储过程全部取出验证测试,结果测试发现所有SQL语句执行时间几百毫秒,没有超过1秒, 这个设想与验证结果有很大出入,于是又怀疑是否因为SSRS报表都是传入存储过程参数获取数据,是否因为“参数嗅探”导致测试结果有差异,于是修改、验证发现依然测试结果不到一秒。于是可以断定问题还是出在SSRS上, 以前碰到过因为安全验证导致过报表超时的案例,但是除了这个模块SSRS报表依然很慢。其它模块报表速度非常快,如果是安全验证问题,应该其它报表速度也会有问题。很是纳闷,也检查了很多设置,依然没有答案。

问题究竟出在哪里呢?经过一番虐心的仔细对比后,居然发现其它模块的报表,在数据源设置上使用SQL认证的方式连接数据库,而这个模块使用的Windows认证方式访问数据库,于是我尝试将报表的数据源连接方式改为一个SQL认证的账号,从 Windows Authentication using a domain account改为SQL Authentication

如上所示,测试SSRS报表的速度结果以及TimeDataRetrieval时间让人吃惊,在官网论坛也有看到讨论:Performance Issue with Shared DataSources using Windows vs SQL Authentication  应该是使用Windows认证方式(Windows Authentication Using a Domain Account)需要涉及加密、域账号认证等消耗了不少时间。 当然,由于对SSRS了解不是非常深入,也没法分析得更深入,在官方文档“性能比较: 安全性设计选择(构建分布式应用程序)”里面,我们可以看到不同的认证方式的Response Time不一样。我想SSRS应该也不例外。

参考资料:

http://msdn.microsoft.com/zh-cn/library/bb934330.aspx

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/43d09604-cc7a-479e-810f-a141f5f402f0/performance-issue-with-shared-datasources-using-windows-vs-sql-authentication?forum=sqlreportingservices

SSRS Reports 2008性能优化案例的更多相关文章

  1. SSRS Reports 2008性能优化案例二

    前几天一同事反映海外工厂A的SSRS报表比较慢,让我检查优化一下.于是我检查了下2015-07-13到2015-07-15 12:00这段时间报表的耗时记录 USE [ReportServer];   ...

  2. 老李案例分享:Weblogic性能优化案例

    老李案例分享:Weblogic性能优化案例 POPTEST的测试技术交流qq群:450192312 网站应用首页大小在130K左右,在之前的测试过程中,其百用户并发的平均响应能力在6.5秒,性能优化后 ...

  3. SQL性能优化案例分析

    这段时间做一个SQL性能优化的案例分析, 整理了一下过往的案例,发现一个比较有意思的,拿出来给大家分享. 这个项目是我在项目开展2期的时候才加入的, 之前一期是个金融内部信息门户, 里面有个功能是收集 ...

  4. Android性能优化案例研究

    译 者前言: 这是Google的Android开发工程师Romain Guy刊登在个人Blog上的一篇文章.Romain Guy 作为Android图形渲染和系统优化的专家,是Android 4.1中 ...

  5. mysql的性能优化案例

    在一次项目实现中,以前写了个程序,将在txt文件中的电话号码和对应的类型往数据库中插入,小数据量的情况下,用个数组遍历循环的方式,很容易解决,但是当数据量一下 但是,几十万个电话一次性插入,就变得耗时 ...

  6. 消息服务dubbo接口性能压测性能优化案例

    最近项目中的消息服务做了运营商的改动,导致这个服务做了重新开发 压测脚本如下: 开启200线程压测: tps只有200-300之间,平均耗时在700ms左右 开启500线程压测 500并发压测,发现平 ...

  7. 一次压测中tomcat生成session释放不及时导致的频繁fullgc性能优化案例

    性能问题:老年代一直处于占满状态,为什么没有发生内存溢出 以HotSpot VM的分代式GC为例,普通对象分配都是在young gen进行的,具体是从在位于young gen中的eden space中 ...

  8. ORACLE实际执行计划与预估执行计划不一致性能优化案例

      在一台ORACLE服务器上做巡检时,使用下面SQL找出DISK_READ最高的TOP SQL分析时,分析过程中,有一条SQL语句的一些反常现象,让人觉得很奇怪: SELECT SQL_ID,    ...

  9. web应用性能优化经验总结

    常见性能优化要求      在我经历的性能优化案例中,常见的问题都是这样开始的:      a) 前台访问很慢,请帮忙分析优化      b) 用户对性能很不满意,再不解决就要投诉      c) 数 ...

随机推荐

  1. IOS中block和代理

    从ios4开始引入block,就是代码块,结构类c语言 基本结构 返回值 (^block名称)(参数):int(^BlockName)(int):返回值为int型,参数是一个int值的叫BlockNa ...

  2. 求一个数组的最大子数组(C/C++实现)

    最大子数组:要求相连,加起来的和最大的子数组就是一个数组的最大子数组.编译环境:VS2012,顺便说句其实我是C#程序员,我只是喜欢学C++. 其实这是个半成品,还有些BUG在里面,不过总体的思路是这 ...

  3. Entity Framework Model First下改变数据库脚本的生成方式

    在Entity Framework Model First下, 一个非常常见的需求是改变数据库脚本的生成方式.这个应用场景是指,当用户在Designer上单击鼠标右键,然后选择Generate Dat ...

  4. iOS的一些面试题分析总结(0)

    虽然一些东西在实际工作中我们是很少用到的,但是面试确实会经常问到一些我们不常用的东西,所以说有时候看一看还是有必要的,一方面面试也是很重要的一件事,另一方面某些情况下也能帮我们查漏补缺. 一.NSNo ...

  5. c#静态构造函数 与 构造函数 你是否还记得?

    构造函数这个概念,在我们刚开始学习编程语言的时候,就被老师一遍一遍的教着.亲,现在你还记得静态构造函数的适用场景吗?如果没有,那么我们一起来复习一下吧. 静态构造函数是在构造函数方法前面添加了stat ...

  6. 【原创】Silverlight DataGrid对核心控件DataGrid的任意单元格进行获取和设置分析。

    前几天,公司同事有个需求需要对系统中的DataGrid控件的指定单元格(如图,申请人ID)进行禁用设置,尝试了很多次总是 整行整列的 禁用 没实现效果. 网上资料较少,没找到解决措施. 尽管silve ...

  7. Xenocode Postbuild 2010 for .NET 使用说明

    文章转载自网络 用法一: .导入要加密的dotNET程序或assembly文件(.dll/.exe) .选择第二个选项卡“Protect” .点击“Select Pattern” .选中所有“Obje ...

  8. SQL Server 2005 数据库 可疑状态

    KJDY数据库名称 ALTER DATABASE KJDY SET EMERGENCY ---修改数据库为 紧急模式 ALTER DATABASE KJDY SET SINGLE_USER ---单用 ...

  9. 一个简单的WPF字体选择器实现

    很久没有写博客了. 这是放暑假中的第一篇博客,以后会多多更新!!! 这就是我写的一个字体选择器,界面如下: 本程序用到的技术比较简单,仅仅是用了Font类的几个方法和数据绑定而已. 首先建一个四行两列 ...

  10. [WCF编程]10.操作:流操作

    一.流操作概述 在默认情况下,当客户端调用服务时,服务只有在接收到完整的消息后才会被调用,同样,客户端只有在包含了调用结果的返回消息被完整接受时,才会解除对它的阻塞. 对于数据量小的消息,这种交换模式 ...