IS NULL 값에서 필터링 된 인덱스가 사용되지 않는 이유는 무엇입니까?


18

다음과 같은 테이블 정의가 있다고 가정하십시오.

CREATE TABLE MyTab (
    ID INT IDENTITY(1,1) CONSTRAINT PK_MyTab_ID PRIMARY KEY
    ,GroupByColumn NVARCHAR(10) NOT NULL
    ,WhereColumn DATETIME NULL
    )

필터링 된 비 클러스터형 인덱스는 다음과 같습니다.

CREATE NONCLUSTERED INDEX IX_MyTab_GroupByColumn ON MyTab 
    (GroupByColumn)
WHERE (WhereColumn IS NULL) 

이 인덱스가이 쿼리에 "포함되지"않는 이유 :

SELECT 
    GroupByColumn
    ,COUNT(*)
FROM MyTab
WHERE WhereColumn IS NULL
GROUP BY GroupByColumn

이 실행 계획을 얻었습니다.

여기에 이미지 설명을 입력하십시오

KeyLookup은 WhereColumn IS NULL 술어에 대한 것입니다.

계획은 다음과 같습니다. https://www.brentozar.com/pastetheplan/?id=SJcbLHxO7

답변:


23

이 인덱스가이 쿼리에 "포함되지"않는 이유 :

정당한 이유가 없습니다. 그것은 해당 쿼리에 대한 포함 인덱스입니다.

여기에서 지불 거절 항목에 투표하십시오 : https://feedback.azure.com/forums/908035-sql-server/suggestions/32896348-filtered-index-not-us--when-is-null-and-key-looku

그리고으로 해결 인클루드 WhereColumn필터링 된 인덱스에를 :

CREATE NONCLUSTERED INDEX IX_MyTab_GroupByColumn 
ON MyTab (GroupByColumn) include (WhereColumn)
WHERE (WhereColumn IS NULL) 

13
이것은 Gail Shaw에 의해 10 년 전에 보고 되었습니다. 그런 다음 연결이 종료되었습니다. 내가 지금 가장 가까운 곳은 feedback.azure.com/forums/908035-sql-server/suggestions/…입니다.
Paul White 9

3

몇 주 전에 테스트를 할 때 생각했던 것과 같은 문제가있었습니다. 반환 된 결과에 NULL closedatetime이 필요하다는 기본 술어가있는 쿼리가 있고 2M + 레코드의 25K가 NULL이므로 필터링 된 인덱스를 사용하는 것에 대해 생각 했으며이 수치는 곧 줄어들 것입니다.

필터링되지 않은 인덱스는 사용되지 않았습니다. '비고 유성'또는 공통성으로 가정하여 다음과 같은 Microsoft 지원 기사 를 찾을 수 있습니다 .

이 문제를 해결하려면 반환 된 열에 NULL로 테스트 된 열을 포함 시키십시오. 또는이 열을 색인에 포함 열로 추가하십시오.

따라서 인덱스 (또는 포함)에 열을 추가하는 것이 공식 MS 응답 인 것 같습니다.


1
언제 (그리고 만약) 그들이 그것을 고칠 때까지 실행 가능한 해결책입니다.
ypercubeᵀᴹ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.