Я хочу иметь быстрый поиск на основе, если два столбца равны. Я пытался использовать вычисляемый столбец с индексом, но SQL Server, похоже, не использует его. Если я просто использую статически заполненный битовый столбец с индексом, я получаю ожидаемый поиск индекса.
Кажется, есть и другие подобные вопросы, но ни один из них не сфокусирован на том, почему индекс не будет использоваться.
Тестовая таблица:
CREATE TABLE dbo.Diffs
(
Id int NOT NULL IDENTITY (1, 1),
DataA int NULL,
DataB int NULL,
DiffPersisted AS isnull(convert(bit, case when [DataA] is null and [DataB] is not null then 1 when [DataA] <> [DataB] then 1 else 0 end), 0) PERSISTED ,
DiffComp AS isnull(convert(bit, case when [DataA] is null and [DataB] is not null then 1 when [DataA] <> [DataB] then 1 else 0 end), 0),
DiffStatic bit not null,
Primary Key (Id)
)
create index ix_DiffPersisted on Diffs (DiffPersisted)
create index ix_DiffComp on Diffs (DiffComp)
create index ix_DiffStatic on Diffs (DiffStatic)
И запрос:
select Id from Diffs where DiffPersisted = 1
select Id from Diffs where DiffComp = 1
select Id from Diffs where DiffStatic = 1
COALESCE
на этом этапе вы можете просто избавиться от ; Я полагаю, чтоCASE
оператор уже гарантированно возвращал0
или1
, ноISNULL
присутствовал только для того, чтобы SQL Server мог дать необнуляемое значениеBIT
для вычисляемого столбца. Тем не менее, по-COALESCE
прежнему будет обнуляться столбец Таким образом, единственное влияние этого изменения, с или безCOALESCE
, состоит в том, что вычисляемый столбец теперь обнуляем, но можно использовать поиск по индексу.