#sql-server-2008 #stored-procedures #bit
#sql-server-2008 #хранимые процедуры #бит
Вопрос:
Как я могу избежать if / else пожалуйста? Столбец ‘Active’ не может быть нулевым в таблице.
CREATE procedure spExample(@bitActive bit)
as
if @bitActive is not null
select a.PKID
from Alerts a
where a.Active = @bitActive
else
select a.PKID
from Alerts a
Ответ №1:
Или вы могли бы пойти с
select a.PKID
from Alerts a
where ISNULL(@bitActive, a.Active) = a.Active
Это, по сути, то же самое, что и предыдущий ответ, но позволяет избежать использования OR в Where .
Я должен отметить, что вы вполне можете повысить производительность, используя свой текущий код, поскольку это позволяет избежать выполнения теста IS NULL для каждой строки. Если вы используете индексы для своих данных, тест IS NULL может означать, что оптимизатор запросов вашего ядра базы данных не может использовать индексы, что может привести к неоптимальному пути выполнения.
Я могу сказать вам по опыту, что мы увидели значительное улучшение (от минут до секунд), удалив проверки ISNULL и написав SQL, специфичный для параметров, либо с помощью операторов IF, либо динамического SQL.
Мы используем Sql Server 2008, поэтому ваш пробег может отличаться, если вы используете другой движок. Я предлагаю вам провести несколько тестов, чтобы увидеть, есть ли какие-либо проблемы с производительностью в вашей базе данных.
Приветствия, Дин.
Комментарии:
1. На SQL Server 2008
OPTION (RECOMPILE)
может помочь@bitActive IS NULL OR a.Active = @bitActive
шаблон, но неISNULL(@bitActive, a.Active) = a.Active
тот , который обсуждался здесь
Ответ №2:
select a.PKID
from Alerts a
where @bitActive IS NULL OR a.Active = @bitActive