ฉันต้องการค้นหาแบบเร็วโดยดูจากว่ามีสองคอลัมน์เท่ากัน ฉันพยายามใช้คอลัมน์ที่คำนวณด้วยดัชนี แต่ SQL Server ดูเหมือนจะไม่ใช้มัน ถ้าฉันใช้คอลัมน์บิตที่มีค่าคงที่กับดัชนีฉันจะได้ดัชนีที่ต้องการ
ดูเหมือนว่ามีคำถามอื่น ๆ เช่นนี้อยู่ที่นั่น แต่ไม่มีใครสนใจว่าทำไมดัชนีจะไม่ถูกใช้
ตารางทดสอบ:
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)
และการค้นหา:
select Id from Diffs where DiffPersisted = 1
select Id from Diffs where DiffComp = 1
select Id from Diffs where DiffStatic = 1
COALESCE
จุดนี้ได้แม้ว่า; ฉันเชื่อว่าCASE
คำสั่งรับประกันแล้วว่าจะส่งคืน0
หรือ1
แต่ISNULL
มีอยู่เท่านั้นดังนั้น SQL Server จะให้ผลลัพธ์ที่ไม่เป็นโมฆะBIT
สำหรับคอลัมน์ที่คำนวณ อย่างไรก็ตามCOALESCE
จะยังคงให้ผลลัพธ์เป็นคอลัมน์ที่ไม่สามารถใช้ได้ ดังนั้นผลกระทบเดียวของการเปลี่ยนแปลงนี้โดยมีหรือไม่มีCOALESCE
คอลัมน์คือคอลัมน์ที่คำนวณในขณะนี้เป็นโมฆะ แต่สามารถค้นหาดัชนีได้