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
COALESCE
en este punto; Creo que laCASE
declaración ya estaba garantizada para regresar0
o1
, peroISNULL
estaba presente solo para que SQL Server produjera un no anulableBIT
para la columna calculada. Sin embargo,COALESCE
seguirá 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.