我设计了一个与SSRS报告配合使用的功能。我有一个下拉参数,列出了多个项目,并且只能选择一个。该下拉列表从查询/数据集中获取其数据,我在其中添加了一行“全部”的数据。因此,下拉列表将如下所示:
然后在函数中,我在where子句中做了一个小的更改:
...where (@parameterName = 'All' or table.name = @parameterName)
此问题是table.name包含约50000行数据。当用户在下拉列表中选择“全部”时,我会认为,由于方括号中的第一个语句为true,因此甚至不应该执行下一个语句(“或”之后)。但这会导致查询运行5-20分钟,但过了这么长时间仍不会产生任何结果。如果我只是将where子句更改为
...where (@parameterName = 'All')
如果用户仍然从下拉菜单中选择“全部”,则该功能将在不到一秒钟的时间内运行。
我在另一个过滤器中实现了类似的概念,但我猜是因为该参数使用的表要小得多(大约90行),所以不会花很长时间。
基本上有一种方法可以使可选参数的计算成本不高吗?
编辑:我将添加参数声明为nvarchar(max)
。将其更改为更小的内容会对查询有帮助吗?
答案 0 :(得分:1)
您拥有的是一个全面查询。考虑在语句末尾添加OPTION (RECOMPILE)
。这将迫使引擎在每次运行查询时都重新创建计划,这意味着它不会基于之前的运行(其中变量的值类似'Item1'
)使用错误的选择。