我的问题是关于SSRS中数据集执行的顺序。我对应该做什么有一些理论,但我希望人们提出意见。
情况:我被要求查看运行缓慢的报告。在查看了报告之后,我注意到该报告多次重复使用带有不同的where子句的查询。因此,我建立了一个索引良好的临时表和一个建立该表的存储过程。一切正常,并大大减少了执行时间。
问题:现在,我有15个数据集,而不是执行原始的大型查询,而是执行
选择*
在临时数据上带有自己的where子句。
现在,我需要确保存储过程运行一次,然后再执行所有数据集。我不想对每个查询或表添加检查以维护报告数据的“最近刷新”日期时间。我应该注意存储过程中有来自SSRS的参数。 我所考虑的是:
A。。向报表添加一个额外的参数,该参数是最终参数,并取决于已填写的所有其他参数。此参数将仅调用存储过程,并返回一个“构建日期”以显示在参数页面中。我看到的问题是,如果用户随后更改了第一个参数(这是一个日期),那么存储过程将使用新参数再次运行,或者有可能在重新加载报表之前永远不会重新执行该存储过程。
B。。将SP创建为数据集,然后对数据集进行排序,以使它们具有单一执行。我的问题是有序执行(可能不确定)会杀死报表执行数据集的并行性,这将使整个报表变慢。
有人以前遇到过这个问题吗?如果是这样,您采取了什么选择,还是我没有想到的更好的选择?
答案 0 :(得分:1)
因此,我改变了对如何稍微解决此问题的看法。 我测试了数据集排序,它确实降低了性能,因为它不仅一次执行一个数据集,而且每次都打开和关闭连接。
因此,我所做的更改改变了报表的工作方式,因为每个数据集对正在构建的临时表的查询都稍有不同,并且主要的问题是在开始数据集之前对构建进行排序。
因此,我在单个存储过程中进行了一个大型联合查询,并将其作为第一列添加到每一行,即数据集名称。这样我就可以拥有一个数据集,在查询开始时建立临时表,并在查询结束时将其丢弃。 使用这种方法,我不得不对报表进行某种程度的修改,以替换普通的字段映射以使用= lookup函数。
但是除此之外,辛苦的工作正在卸载到SSRS服务器上,我再也没有排序问题了!
Caz
答案 1 :(得分:0)
如果我理解正确,则每个数据集都是相同的select语句,而where子句中的值不同。如果是这样,您能否将select语句放在单个数据集中,并使用适当的表达式并传递适当的隐藏参数来填充报表?