Chcę mieć szybkie wyszukiwanie w oparciu o to, czy dwie kolumny są równe. Próbowałem użyć kolumny obliczeniowej z indeksem, ale wydaje się, że SQL Server go nie używa. Jeśli po prostu użyję statycznie wypełnionej kolumny bitów z indeksem, otrzymam oczekiwane wyszukiwanie indeksu.
Wydaje się, że istnieją jeszcze takie pytania, ale żadne z nich nie koncentruje się na tym, dlaczego indeks nie byłby używany.
Tabela testowa:
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)
I zapytanie:
select Id from Diffs where DiffPersisted = 1
select Id from Diffs where DiffComp = 1
select Id from Diffs where DiffStatic = 1
COALESCE
na to, że w tym momencie możesz się po prostu pozbyć ; Wydaje mi się, żeCASE
instrukcja już zwróciła0
lub1
, aleISNULL
była obecna tylko po to, aby SQL Server zwrócił wartość zerowąBIT
dla kolumny obliczanej. JednakCOALESCE
nadal da kolumnę zerowalną. Więc jedynym skutkiem tej zmiany, z lub bezCOALESCE
, jest to, że kolumna obliczeniowa jest teraz zerowa, ale można użyć wyszukiwania indeksu.