Я хочу здійснити швидкий пошук на основі, якщо два стовпці рівні. Я намагався використовувати обчислену колонку з індексом, але 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
, є те, що обчислена колонка тепер є нульовою, але пошук індексу може бути використаний.