生产服务器中的 SSRS 报告超时(刷新 3 次后除外)

SSRS Report Timing out in Production Server (except after refreshing 3 times)

该报告在 DEV 和 QA 服务器中运行良好,但在生产环境中出现以下错误:

An error occurred during client rendering. 
An error has occurred during report processing. 
Query execution failed for dataset 'Registration_of_Entity'. 
Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 

奇怪的是,管理员向我保证,此报告现已设置,因此根本没有超时。

每天早上刷新报告 3 次,错误消息消失。

我该怎么做才能解决这个问题,使报告永远不会收到这个错误?

您知道您的查询是否陷入僵局吗?可能是报告在高​​峰时段在服务器上被阻止。

考虑优化您的查询,或者如果可以读取未提交的数据,请在每个 FROM 和 Join 子句后添加 WITH (NOLOCK)。如果您不熟悉它,请务必 google WITH(NOLOCK),这样您就知道 read uncommitted 可以做什么。

有几个步骤可以正确解决这个问题。
我建议按照以下顺序关注它们:


1.减少查询执行时间
在 SSMS 中执行数据集 Registration_of_Entity 的查询,看看需要多长时间才能完成。
如果您的查询需要比为 DataSet 指定的超时时间更多的时间来执行,您应该首先尝试减少这个时间,例如:

  • 更改查询结构(重新考虑连接,使用 CTE,...)
  • 添加索引

查看执行计划会有帮助。


2。降低查询复杂度

这些都需要吗rows/columns?
您需要在数据库端进行所有这些计算吗?
可以改为在报告中完成吗?
您可以尝试:

  • 降低查询复杂度
  • 将查询拆分为更小的查询

同样,查看执行计划会有帮助。


3。探索与查询本身无关的其他优化
您确实需要这个查询,但是您需要实时数据吗?
此服务器上是否正在执行许多其他查询?
您可以查看:

  • 缓存
  • 复制/负载平衡

Note that from SSRS 2008 R2, the new Shared DataSets can be cached. I know it doesn't apply in your case but who knows, it could help others.


4.不得已
如果上述所有步骤都无法解决问题,那么您可以增加超时时间。
Here 是一个 link 博客 post 解释不同的超时以及如何增加它们。