Запрос, где @var Matches или @var равен нулю - PullRequest
0 голосов
/ 02 июля 2018

У меня довольно большой запрос внутри SP, который может возвращать довольно много результатов на основе переменных. 1 сегмент должен возвращать определенные значения, если переменная имеет значение, или все, если переменная не имеет значения.

В основном я пытаюсь это:

@var = 'Not Empty'

Select * from Table
where ( 
        ( 
          x = @var 
          and ...(extra stuff)
        ) 
        or @var = ''
      )
      and y = ... (lots of extra stuff) 

Как бы то ни было, чтобы загрузить это целую вечность. Если я удаляю ИЛИ, он запускается мгновенно. Я не могу понять, почему серверу sql так трудно понять, что делать. Я мог бы просто сделать два запроса и поместить их в if, но я бы не стал, так как остальная часть запроса довольно велика, и мне нужно было бы изменить дважды.

Кто-нибудь знает, что происходит под капотом, который делает это медленным?

1 Ответ

0 голосов
/ 02 июля 2018

Вы всегда можете попробовать 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 может оптимизировать каждый подзапрос отдельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...