İki sütun eşit olup olmadığına göre hızlı bir arama yapmak istiyorum. Bir dizin ile hesaplanan bir sütun kullanmaya çalıştım, ancak SQL Server kullanmak gibi görünmüyor. Ben sadece bir dizin ile statik olarak doldurulmuş bir bit sütunu kullanırsanız, beklenen dizin arama olsun.
Görünüşe göre bunun gibi başka sorular var, ama hiçbiri neden bir endeksin kullanılmayacağına odaklanmadı.
Test Tablosu:
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)
Ve Sorgu:
select Id from Diffs where DiffPersisted = 1
select Id from Diffs where DiffComp = 1
select Id from Diffs where DiffStatic = 1
COALESCE
Bu noktada sadece kurtulmak gibi görünüyor ; İnanıyorumCASE
deyimi zaten dönmek için garantili0
veya1
ancakISNULL
SQL Server null olmayan bir doğuracak sadece bu yüzden mevcuttuBIT
bilgisayarlı sütun için. AncakCOALESCE
yine de boş bir sütun verecektir. Dolayısıyla bu değişikliğin, etkisi olsun olmasın tek etkisiCOALESCE
, hesaplanan sütunun artık geçersiz olduğu, ancak dizin aramasının kullanılabilmesidir.