SQL Server 2008 sp с обнуляемым битовым аргументом: как избежать if / else для выбора?

#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