查询@var匹配或@var为空的位置



我在SP中有一个相当大的查询,可以根据变量返回相当多的结果。 如果 var 有值,则 1 段应返回特定值,如果 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 中,但我宁愿不这样做,因为查询的其余部分相当大,我需要更改两次。

有谁知道引擎盖下发生了什么使它变得缓慢?

您可以随时尝试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 可以单独优化每个子查询。

最新更新