Tôi muốn có một tra cứu nhanh dựa trên nếu hai cột bằng nhau. Tôi đã cố gắng sử dụng một cột được tính toán với một chỉ mục, nhưng SQL Server dường như không sử dụng nó. Nếu tôi chỉ sử dụng một cột bit dân cư tĩnh với một chỉ mục, tôi sẽ tìm kiếm chỉ mục mong đợi.
Có vẻ như có một số câu hỏi khác như thế này, nhưng không có câu hỏi nào tập trung vào lý do tại sao một chỉ mục sẽ không được sử dụng.
Bảng kiểm tra:
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)
Và truy vấn:
select Id from Diffs where DiffPersisted = 1
select Id from Diffs where DiffComp = 1
select Id from Diffs where DiffStatic = 1

COALESCEthời điểm này; Tôi tin rằngCASEcâu lệnh đã được đảm bảo trả về0hoặc1, nhưngISNULLchỉ có mặt để SQL Server mang lại giá trị không thể rỗngBITcho cột được tính toán. Tuy nhiên,COALESCEvẫn sẽ mang lại một cột nullable. Vì vậy, một tác động của sự thay đổi này, có hoặc không cóCOALESCE, là cột được tính bây giờ là null nhưng tìm kiếm chỉ mục có thể được sử dụng.