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
COALESCE
thời điểm này; Tôi tin rằngCASE
câu lệnh đã được đảm bảo trả về0
hoặc1
, nhưngISNULL
chỉ có mặt để SQL Server mang lại giá trị không thể rỗngBIT
cho cột được tính toán. Tuy nhiên,COALESCE
vẫ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.