Ich möchte eine schnelle Suche basierend auf, wenn zwei Spalten gleich sind. Ich habe versucht, eine berechnete Spalte mit einem Index zu verwenden, aber SQL Server scheint ihn nicht zu verwenden. Wenn ich nur eine statisch aufgefüllte Bitspalte mit einem Index verwende, erhalte ich die erwartete Indexsuche.
Es scheint, als gäbe es einige andere Fragen wie diese, aber keine konzentrierte sich darauf, warum ein Index nicht verwendet werden würde.
Testtabelle:
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)
Und die Abfrage:
select Id from Diffs where DiffPersisted = 1
select Id from Diffs where DiffComp = 1
select Id from Diffs where DiffStatic = 1

COALESCEan dieser Stelle einfach loswerden können . Ich glaube, dieCASEAnweisung wurde bereits garantiert, um zurückzugeben,0oder1, aberISNULLwar nur vorhanden, damit SQL Server ein nicht nullableBITfür die berechnete Spalte ergeben würde. Es wird jedochCOALESCEimmer noch eine nullfähige Spalte angezeigt. Die einzige Auswirkung dieser Änderung mit oder ohneCOALESCEist, dass die berechnete Spalte jetzt nullwertfähig ist, aber die Indexsuche verwendet werden kann.