【问题标题】:SSRS Report takes almost 10 minutes to render reportSSRS Report 需要将近 10 分钟来呈现报告
【发布时间】:2017-06-09 12:15:00
【问题描述】:

我们有一个运行SQL Server 2012 (SQL Server 11.0.2100) 的开发服务器。当我们在同一台服务器上运行多个项目时,我们已经配置了单独的 SSRS 实例。

SQL 服务器:WIN-SRVR\SQL2012 SSRS 实例:WIN-SRVR\SQL2012SSRS

我们有一个 2012 年实例的数据库。 SSRSinstance Dataset 指向 2012。

现在的场景是当我们执行存储过程时,返回数据集的时间不到 1 秒。而同一份报告需要将近 10 分钟才能在页面上呈现。我试图从浏览器和报表生成器中直接从http:// WIN-SRVR/Reportserver2012 生成。每次显示报告都需要花费大量时间。

我检查的要点是:

  1. 64 GB 内存
  2. 至强处理器
  3. 平均内存利用率 18 GB(可用内存 > 40 GB)
  4. 数据集返回大约 4000 行。我猜这很容易被 4 GB RAM 服务器处理。
  5. 应用程序、数据库服务器、SSRS 服务器都在同一台机器上。

活动监视器在生成此查询时显示一个暂停的查询。

ReportServer.dbo.GetSessionData;1

我可以看到昂贵或等待的查询是:EXEC #am_get_querystats

检查了数据库上的资源锁定,这表明 ReportServer.dbo.GetSessionData;1 被 ReportServer.dbo.WriteLockSession;1 阻止。这将持续约 2 分钟,锁被释放,报告完成生成。

我尝试过的疑难解答

  1. 重新启动 SSRS 服务.. SQL 服务。所有 4 项服务,包括代理和浏览器。
  2. 重启服务器
  3. 重建服务器上的所有索引。检查执行计划以及是否缺少任何索引。创建它。
  4. 禁用所有正在运行的作业。
  5. 使用报表生成器和浏览器直接在服务器上生成报表。

没有任何帮助。

以下是活动监视器的截图

任何人都知道为什么当 SQL 查询不需要任何时间时会发生这种情况。但是报表渲染需要很长时间才能显示数据。

    DECLARE @fromdate VARCHAR(50)
    DECLARE @todate VARCHAR(50)
    DECLARE @usagetypeid NVARCHAR(10)
    DECLARE @paytype INT
    DECLARE @userid INT

    SET @fromdate = '01/01/2017'
    SET @todate = '09/06/2017'
    SET @usagetypeid = '0'

    SET @paytype = 0
    SET @userid = 1



    SELECT  CONVERT(VARCHAR, pb.PaymentDate, 103) AS PaymentDate ,
            pm.OldFormNo AS PropertyFormNo ,
            ROUND(CAST(pb.ReceiptNo AS NUMERIC), 0) AS ReceiptNo ,
            ISNULL(pm.OwnerFirstName, '') + ' ' + ISNULL(pm.OwnerMiddleName, '')
            + ' ' + ISNULL(pm.OwnerLastName, '') AS UserPersonName ,
            pm.OwnerFirstName AS 'OwnerFirstName' ,
            pb.PaidAmount ,
            pb.PayableAmount ,
            pb.ChequeDDno AS ChequeNo ,
            pb.BillPaymentId
    FROM    propertymaster pm
            JOIN PropertyBillPayment pb ON pm.PropertyId = pb.PropertyId
    WHERE   pb.PaymentDate BETWEEN CONVERT(DATE, @fromdate)
                           AND     CONVERT(DATE, @todate)
            AND pm.UsageTypeId = CASE WHEN @usagetypeid = 0 THEN pm.UsageTypeId
                                      ELSE @usagetypeid
                                 END
            AND pb.isDeleted = 0
            AND pb.cancel = 0
    ORDER BY pb.PaymentDate DESC

【问题讨论】:

  • 我们能否看到查询或至少了解查询在做什么? - 您使用的是集成的还是独立的共享点?
  • 您可能还对参数有问题-这里有一篇相关文章:stackoverflow.com/questions/23963262/…
  • 查询如下:
  • 正如我之前评论中提供的链接中所建议的那样,这个问题听起来像是一个参数嗅探问题,众所周知,您可以查看我建议的页面,特别关注 OPTION (RECOMPILE) 的使用- 如果这能解决您的问题,请告诉我们。

标签: sql-server sql-server-2008 reporting-services


【解决方案1】:

第一步是找出需要这么多时间的原因,您可以使用 ReportServer 数据库的 ExecutionLog3 视图找到它。 此视图包含 TimeDataRetrieval、TimeProcessing 和 TimeRendering 列,您可以按 TimeStart 和 ItemPath 对其进行过滤。

一旦您确定它正在呈现,您就可以对分页进行调查。 相反,如果是 TimeDataRetrieval,您应该调整您的查询

【讨论】:

  • TimeStart TimeEnd TimeDataRetrieval TimeProcessing TimeRendering Source Status ByteCount RowCount 2017-06-09 17:06:40.210 2017-06-09 17:16:12.357 558102 12641 1318 Live rsSuccess 67744 21766 2017-06-09 17:05:39.427 2017-06-09 17:15:05.837 553992 11381 1001 Live rsSuccess 67744 21766 2017-06-09 16:56:33.577 2017-06-09 17:05:29.253 522674 11997 970 Live rsSuccess 67744 21766
  • 所以查询执行时间总是需要将近 10 分钟,而不是 RENDERING。为什么写“SQL查询不需要任何时间。但是报表渲染需要很多时间来显示数据”?
  • 你的意思是你在管理工作室执行了“相同的”并且完全没有花费时间?
  • 是的。在 ssms 中只需 1 秒即可提供输出
  • 我从报告中调用的同一个 sp
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 2013-06-24
  • 2020-10-09
  • 2012-05-23
  • 1970-01-01
  • 2013-06-06
相关资源
最近更新 更多