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
COALESCE
pada titik ini; Saya percayaCASE
pernyataan sudah dijamin untuk kembali0
atau1
, tetapiISNULL
hanya hadir sehingga SQL Server akan menghasilkan non-nullableBIT
untuk kolom yang dihitung. Namun,COALESCE
masih 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.