我在SP中有一个较大的查询,该查询可以基于变量返回很多结果。 1个细分受众群应该在var有值的情况下返回特定值,或者在var没有值的情况下返回所有值。
基本上我正在尝试:
@var = 'Not Empty'
Select * from Table
where (
(
x = @var
and ...(extra stuff)
)
or @var = ''
)
and y = ... (lots of extra stuff)
这需要花很多时间才能加载。 如果我删除OR,它会立即运行。 我不知道为什么sql server很难弄清楚该怎么做。 我可以简单地进行两个查询并将它们放在if中,但是我宁愿不这样做,因为查询的其余部分相当大,因此我需要更改两次。
有没有人知道使这变慢的引擎盖下发生了什么?
答案 0 :(得分:0)
您可以随时尝试union all
:
with t as (
select t.*
from table t
where y = ... (lots of extra stuff)
)
Select t.*
from Table t
where @var is null
union all
select t.*
from Table t
where @var = x and ...(extra stuff);
SQL Server可以分别优化每个子查询。