Voglio avere una ricerca rapida basata su se due colonne sono uguali. Ho provato a utilizzare una colonna calcolata con un indice, ma SQL Server non sembra utilizzarla. Se utilizzo semplicemente una colonna di bit popolata staticamente con un indice, ottengo la ricerca dell'indice prevista.
Sembra che ci siano altre domande come questa là fuori, ma nessuna focalizzata sul perché un indice non verrebbe utilizzato.
Tabella di prova:
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)
E la query:
select Id from Diffs where DiffPersisted = 1
select Id from Diffs where DiffComp = 1
select Id from Diffs where DiffStatic = 1
COALESCE
a questo punto puoi semplicemente sbarazzartene ; Credo che laCASE
dichiarazione fosse già garantita per la restituzione0
o1
, maISNULL
era presente solo in modo che SQL Server avrebbe prodotto un valore nullaBIT
per la colonna calcolata. Tuttavia,COALESCE
produrrà comunque una colonna nullable. Quindi l'unico impatto di questa modifica, con o senza ilCOALESCE
, è che la colonna calcolata è ora nullable ma la ricerca dell'indice può essere utilizzata.