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
COALESCE
an dieser Stelle einfach loswerden können . Ich glaube, dieCASE
Anweisung wurde bereits garantiert, um zurückzugeben,0
oder1
, aberISNULL
war nur vorhanden, damit SQL Server ein nicht nullableBIT
für die berechnete Spalte ergeben würde. Es wird jedochCOALESCE
immer noch eine nullfähige Spalte angezeigt. Die einzige Auswirkung dieser Änderung mit oder ohneCOALESCE
ist, dass die berechnete Spalte jetzt nullwertfähig ist, aber die Indexsuche verwendet werden kann.