Je veux avoir une recherche rapide basée sur si deux colonnes sont égales. J'ai essayé d'utiliser une colonne calculée avec un index, mais SQL Server ne semble pas l'utiliser. Si j'utilise simplement une colonne de bits à remplissage statique avec un index, j'obtiens la recherche d'index attendue.
Il semble qu'il y ait d'autres questions comme celle-ci, mais aucune ne se concentre sur la raison pour laquelle un index ne serait pas utilisé.
Table de test:
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)
Et la requête:
select Id from Diffs where DiffPersisted = 1
select Id from Diffs where DiffComp = 1
select Id from Diffs where DiffStatic = 1
COALESCE
ce point à ce stade; Je crois que laCASE
déclaration était déjà garantie de retourner0
ou1
, maisISNULL
n'était présente que pour que SQL Server produise une valeur non nulleBIT
pour la colonne calculée. Cependant,COALESCE
produira toujours une colonne nullable. Ainsi, le seul impact de ce changement, avec ou sans leCOALESCE
, est que la colonne calculée est désormais nullable mais la recherche d'index peut être utilisée.