#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])