查询@var匹配项或@var为空的地方

时间:2018-07-02 15:46:07

标签: sql sql-server performance

我在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中,但是我宁愿不这样做,因为查询的其余部分相当大,因此我需要更改两次。

有没有人知道使这变慢的引擎盖下发生了什么?

1 个答案:

答案 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可以分别优化每个子查询。