我在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 可以单独优化每个子查询。