Оптимизация SQL-запроса с несколькими операторами if - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь выбрать разные значения таблицы на основе переданного параметра.

У меня есть код, который работает правильно, он показан ниже.

declare @type as int
set @type = 3

if @type = 1
    select * from t
else if @type = 2
    select * from t WHERE theType = 2 or theType = 3
else if @type = 3
    select * from t where theType = 3

Это работает очень хорошо, однако я хочу избавиться от операторов if, если это возможно.

Есть ли способ заставить этот код иметь тот же результат, но работать лучше?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 06 июня 2019

Вы можете попробовать переписать это, чтобы это был один запрос:

select *
from t
where
    @type = 1 or
    (@type = 2 and theType in (2, 3)) or
    (@type = 3 and theType = 3);

Я не знаю, будет ли это работать на самом деле быстрее, чем у вас сейчас, но это избавляет от операторов if.

0 голосов
/ 06 июня 2019

Другим подходом может быть динамический SQL. Если наш пример слишком упрощен, то использование логики OR (как в ответах Тима) может привести к плану с кэшированным запросом, который не подходит для выполняемого запроса. Это действительно так, поскольку @type = 1 возвращает все строки, а когда оно имеет значение 3, оно фильтруется в одно значение. Это означает, что оценки для 1 и 3 будут очень разными.

Это дает вам что-то вроде этого:

DECLARE @type int;
SET @type = 3;

DECLARE @SQL nvarchar(MAX);

SET @SQL = N'SELECT * FROM t' +
           CASE @type WHEN 1 THEN N';'
                      WHEN 2 THEN N' WHERE theType = 2 or theType = 3;'
                      WHEN 3 THEN N' WHERE theType = 3'
           END;
EXEC sp_executesql @SQL;

Это не означает, что ответ Тима неправильный, но вы можете получить плохую производительность при определенных значениях.

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