我遇到了类似的问题:返回 4,000 行并在 1 秒内自行运行的查询在 SSRS 中花费了很长时间,以至于超时。
原来问题是由 SSRS 处理多值参数的方式引起的。有趣的是,如果用户选择了多个值,报告会很快呈现(约 1 秒),但如果只选择一个值,则报告需要几分钟才能呈现。
这是原始查询的渲染时间比应有的时间长 100 倍以上:
SELECT ...
FROM ...
WHERE filename IN (@file);
-- @file is an SSRS multi-value parameter passed directly to the query
我怀疑问题在于 SSRS 引入了整个源表(超过 100 万行),然后执行了客户端过滤器。
为了解决这个问题,我最终通过表达式将参数传递到查询中,这样我就可以自己控制过滤器。也就是说,在“DataSet Properties”窗口中,在“Parameters”屏幕上,我用这个表达式替换了参数值:
=JOIN(Parameters!file.Value,",")
...(我还给结果起了一个新名称:filelist),然后我将查询更新为如下所示:
SELECT ...
FROM ...
WHERE ',' + @filelist + ',' LIKE '%,' + FILENAME + ',%';
-- @filelist is passed to the query as the following expression:
-- =JOIN(Parameters!file.Value,",")
我猜想将查询移动到存储过程也是缓解问题的有效方法(因为 SSRS 在将多值参数传递给存储过程之前基本上会执行相同的 JOIN)。但就我而言,在报告中处理这一切要简单一些。
最后,我应该指出,LIKE 运算符可能不是过滤项目列表的最有效方法,但它的编码肯定比拆分字符串方法简单得多,并且报告现在运行大约一秒钟,因此拆分字符串似乎不值得付出额外的努力。