SQL server, ЕСЛИ СУЩЕСТВУЕТ, против выполнения условия IF

#sql #sql-server

#sql #sql-сервер

Вопрос:

У меня есть таблица Business (содержит более 10 000 строк) с битовым столбцом ISBILLINGBUSINESS . В хранимой процедуре я должен проверить, является ли ISBILLINGBUSINESS значение True или False для записи.

Я могу сравнить с двумя методами.

(1)

 IF EXISTS (SELECT id FROM BUSINESS WHERE ID = 5404 AND ISBILLINGBUSINESS = 1)
select 'Billing Business'
 

(2)

 IF((SELECT ISBILLINGBUSINESS FROM BUSINESS WHERE ID = 5404) = 1)
select 'Billing Business'
 

Я хочу знать разницу в производительности для следующих двух методов.
Какой из них лучше? Кто-нибудь может помочь?

Комментарии:

1. Проверьте планы запросов (CTRL-L). Если они одинаковы, то нет никакой разницы. Если вам нужна производительность в базе данных, подумайте больше об индексах и обеспечении того, чтобы ваш код был совместимым. Однако в таблице из 10 тысяч строк все это не имеет значения, поскольку индексы использоваться не будут. Один только индекс в битовом столбце также использоваться не будет.

Ответ №1:

может быть, эффективный код

  declare @Boolbillbuss bit
select @Boolbillbuss = ISBILLINGBUSINESS FROM BUSINESS WHERE ID = 5404
IF( @Boolbillbuss=1)
 select 'Billing Business'
 

Ответ №2:

10 Тыс. строк обычно слишком малы для проблем с производительностью. В любом случае, с точки зрения производительности важно иметь соответствующие индексы, форма IF выражения здесь не так важна.

Если включен уникальный индекс ID , оба варианта хороши и практически одинаковы.

If ID уникален и является первичным ключом с кластеризованным индексом, тогда у вас есть все, что вам нужно.

Если кластеризованный индекс отличается или в этой таблице нет кластеризованного индекса, создайте покрывающий индекс, который включает все столбцы, на которые ссылаются в запросе:

 CREATE UNIQUE NONCLUSTERED INDEX [IX_ID] ON [Business]
(
    [ID] ASC
)
INCLUDE ([ISBILLINGBUSINESS])