Quiero tener una búsqueda rápida basada en si dos columnas son iguales. Intenté usar una columna calculada con un índice, pero SQL Server no parece usarla. Si solo uso una columna de bits rellenada estáticamente con un índice, obtengo la búsqueda de índice esperada.
Parece que hay algunas otras preguntas como esta, pero ninguna se centró en por qué no se usaría un índice.
Tabla de prueba:
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)
Y la consulta:
select Id from Diffs where DiffPersisted = 1
select Id from Diffs where DiffComp = 1
select Id from Diffs where DiffStatic = 1

COALESCEen este punto; Creo que laCASEdeclaración ya estaba garantizada para regresar0o1, peroISNULLestaba presente solo para que SQL Server produjera un no anulableBITpara la columna calculada. Sin embargo,COALESCEseguirá produciendo una columna anulable. Entonces, el único impacto de este cambio, con o sin elCOALESCE, es que la columna calculada ahora es anulable pero se puede utilizar la búsqueda de índice.