我组织中的人员在 SSRS 报告中使用 SQL 查询:例如
SELECT name, age
FROM egTable
然后,此查询在数据库上运行,然后他们使用 SSRS 中的 FILTER 删除不需要的行。例如,SSRS 中有一个名为 AGE 的过滤器,它类似于Age = 11
我的建议是,这很糟糕:这种做事方式意味着我们正在查询整个表,然后从 GIANT 结果集中我们只是摆脱了不需要的行。相反,我们应该引入一个参数:@age,然后编写如下查询:
SELECT name, age
FROM egTable
WHERE age = @age
我说第一种方法拉整个表是否正确,而我的方法效率更高,因为它只返回一个小的结果集?
我如何验证/证明这一点?
TL/DR
ExecutionLog
是的,您是正确的,您可以通过在 SSRS 数据库中显示结果来证明这一点。更长的答案
我基于 Adventureworks 数据库创建了 2 份相同的报告,一份在数据集上为 City 设置了过滤器,另一份在 City 的查询中设置了参数。
报告 1
此报告的查询是:
过滤器是这样添加的:
该报告的结果是:
报告 2
此报告的查询是
此数据集上没有过滤器
该报告的结果是:
在哪里可以看到相同的数据,但行为不同,因为用户必须为过滤器输入一个值(标记为黄色)
如果这是不希望的,可以通过向参数添加默认值并将可见性设置为隐藏来克服,如下所示:
和这个:
效率证明
两种报告的效率都可以通过查询执行日志表和视图来证明,如下所示:
这 2 份报告返回:
因此,第二种方法不仅获取的行数要少得多(26 对 19614),而且处理和呈现报告的时间也更少。