我设计了一个处理SSRS报告的函数。我有一个下拉参数,它列出了多个项目,并且只能选择一个。这个下拉列表从查询/数据集中获取数据,我在其中添加了一行表示“All”的数据。因此,下拉列表将如下所示:
然后在函数中,我在where子句中做了一个小改动:
...where (@parameterName = 'All' or table.name = @parameterName)
这样做的问题是table.name大约有50000行数据。当用户在下拉列表中选择'All‘时,我会认为因为括号中的第一条语句是真的,并且下一条语句(在’or‘之后)甚至不应该被执行。但它会导致查询运行5-20分钟,并且在此之后仍然不会产生任何结果。如果我简单地将where子句改为
...where (@parameterName = 'All')
如果用户仍然从下拉列表中选择“全部”,该函数将在不到一秒的时间内运行。
我用另一个过滤器实现了一个类似的概念,但我猜是因为该参数使用的表要小得多(大约90行),所以不会花很长时间。
基本上有没有一种方法可以得到一个计算成本不高的可选参数?
编辑:我将添加参数声明为nvarchar(max)
。将其更改为更小的值会对查询有帮助吗?
发布于 2019-02-22 07:09:57
您所拥有的是一个通用的查询。考虑将OPTION (RECOMPILE)
添加到语句的末尾。这将迫使引擎在每次运行查询时重新创建计划,这意味着它不会使用基于前一次运行的糟糕选择,因为您的变量具有类似'Item1'
的值。
https://stackoverflow.com/questions/54817560
复制相似问题