두 열이 같은지 여부를 기반으로 빠른 조회를 원합니다. 인덱스가있는 계산 열을 사용하려고했지만 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 서버가 아닌 널 (NULL)을 얻을 것입니다 만, 그래서 존재BIT
계산 된 컬럼에 대해. 그러나COALESCE
여전히 널 입력 가능 열을 생성합니다. 따라서이 변경으로 인해을 (를) 포함하거나 포함하지 않고COALESCE
계산 열은 이제 널 입력 가능하지만 색인 검색을 사용할 수 있습니다.