Saya ingin memiliki pencarian cepat berdasarkan jika dua kolom sama. Saya mencoba menggunakan kolom yang dihitung dengan indeks, tetapi SQL Server tampaknya tidak menggunakannya. Jika saya hanya menggunakan kolom bit yang dihuni secara statis dengan indeks, saya mendapatkan pencarian indeks yang diharapkan.
Tampaknya ada beberapa pertanyaan lain seperti ini di luar sana, tetapi tidak ada yang berfokus pada mengapa indeks tidak akan digunakan.
Meja Uji:
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)
Dan Pertanyaannya:
select Id from Diffs where DiffPersisted = 1
select Id from Diffs where DiffComp = 1
select Id from Diffs where DiffStatic = 1

COALESCEpada titik ini; Saya percayaCASEpernyataan sudah dijamin untuk kembali0atau1, tetapiISNULLhanya hadir sehingga SQL Server akan menghasilkan non-nullableBITuntuk kolom yang dihitung. Namun,COALESCEmasih akan menghasilkan kolom yang dapat dibatalkan. Jadi satu dampak dari perubahan ini, dengan atau tanpaCOALESCE, adalah bahwa kolom yang dikomputasi sekarang dapat dibatalkan tetapi pencarian indeks dapat digunakan.