当我创建SSRS报告时,我总是面临着“如何以最少的生成时间创建报告”的困境。
通常,生成时间(或演奏时间)分为两个主要部分:
如您所知,SSRS中正在执行的一些事情可以在SQL查询中完成,反之亦然。
例如:
Group by
子句,但在使用带有组定义的表时也可以这样做。Casting
来比较SQL中的两个值,也可以直接在表达式中进行比较。还有更多......
我的问题是:
A。哪个部分(SQL查询或SSRS)花费更多时间(假设可以在SSRS和SQL中执行任务)?
B。有什么指导方针(如果有的话),我应该根据dillema在哪里执行给定的情况作出决定?
答案 0 :(得分:5)
与性能问题一样:
底线:让代码清晰明确指导解决特定问题的位置,并在性能成为问题时有选择地进行优化。
Eric Lippert写了a nice blog post关于何时以及如何担心性能的问题。上下文是C#,但基本思想也适用于其他情况,例如SSRS / SQL。
顺便说一下,如果你看一下上面提到的ExecutionLog2视图,你会发现实际上你应该知道三个组件中的三个组件:
了解瓶颈所处的位置是了解如何解决性能问题的关键。
根据我的经验提出建议:
根据经验,偏好SQL优于SSRS 如果您担心性能,尤其是聚合。如果需要,还可以考虑调整数据库(索引等)。
如果我可以通过事实和研究来支持,那么这个经验法则是最好的。唉,我没有。我可以说,根据我自己的经验,大多数情况下,当我的报告将聚合和计算从SSRS移动到SQL时会出现性能问题,这有助于解决此问题。
答案 1 :(得分:1)
重要的是要记住SSRS是智能的,并在您需要之前保存异常。如果您要导出,那么它将提取所有数据。此外,如果您在线查看并且您已展开和折叠行,则在您想要查看它们之前不会执行它们。在该理论上,首选基本SQL。
最好将聚合留给SSRS,因为报告将尝试在Tablix中进行聚合。至于图表,除非你有Tablix,否则最好聚合。
至于简单计算,这应该在SQL中完成,例如比较等。
请记住,SSRS比您更智能 ,并且最简单的SQL使此服务能够最佳地运行,并且此服务主要用于显示。
如果您使用MS SQL服务器作为数据集,那么该服务将以最佳状态运行。